diff --git a/.github/workflows/base-coverage.yml b/.github/workflows/base-coverage.yml new file mode 100644 index 000000000..032244cee --- /dev/null +++ b/.github/workflows/base-coverage.yml @@ -0,0 +1,31 @@ +name: Test coverage for main branch + +on: + push: + branches: + - main + - fdc3-for-web-impl + +jobs: + test_and_upload_coverage: + runs-on: ubuntu-latest + name: Test and upload coverage + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.event.ref }} + fetch-depth: 1000 + + - name: Run tests + run: | + npm i + npm run test + npm run merge + npm run report + + - name: Upload coverage artifact + uses: actions/upload-artifact@v4 + with: + name: test-coverage-output + path: nyc-coverage-report diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 000000000..33f038e77 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,69 @@ +name: Node.js CI Tests and Coverage + +# Controls when the workflow will run on any branch +on: + pull_request: + +# Allows Coverage to be written back as a PR comment +permissions: + pull-requests: write + +# Define the jobs for this workflow +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 1000 + + - name: Fetch base + run: git fetch origin ${{ github.event.pull_request.base.ref }} --depth=1000 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + + - name: Install dependencies + run: npm install + + - name: Run tests + run: npm run test + + - name: Merge Results + run: npm run merge + + - name: Create Report + run: npm run report + + - name: Create test summary + uses: test-summary/action@dist + with: + paths: "**/test-results.xml" + show: "fail, skip" + output: test-summary.md + if: always() + + - name: PR comment with file + uses: thollander/actions-comment-pull-request@v3 + with: + file-path: test-summary.md + + - name: Download previous coverage + uses: dawidd6/action-download-artifact@v7 + with: + workflow: base-coverage.yml + name: 'test-coverage-output' + path: base-artifacts + search_artifacts: true + + - name: Report Coverage + uses: sidx1024/report-nyc-coverage-github-action@v1.2.7 + with: + coverage_file: "nyc-coverage-report/coverage-summary.json" + base_coverage_file: "base-artifacts/coverage-summary.json" + diff --git a/.github/workflows/cve-scanning.yml b/.github/workflows/cve-scanning.yml index a33b3c5ed..a9390dbfe 100644 --- a/.github/workflows/cve-scanning.yml +++ b/.github/workflows/cve-scanning.yml @@ -45,10 +45,6 @@ jobs: - run: npx --yes auditjs ossi --whitelist allow-list.json if: success() || failure() - - - run: npx --yes auditjs ossi --whitelist ../../allow-list.json - working-directory: toolbox/fdc3-workbench - if: success() || failure() - run: npx --yes auditjs ossi --whitelist ../allow-list.json working-directory: website diff --git a/.gitignore b/.gitignore index 3571c4fb8..e52ce4c2d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,16 @@ website/build/ website/static/toolbox website/node_modules website/i18n/* -website/package-lock.json -website/.docusaurus/** +website/.docusaurus/ +website/static/schemas/next/* +website/static/ui +test-results.xml + .idea/ *.iml -website/.yarn \ No newline at end of file +website/.yarn +.nyc_output +toolbox/fdc3-for-web/fdc3-web-impl/generated/ +cucumber-report.html +nyc-coverage-report/ \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..a926c364e --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,2 @@ +#!/bin/sh +npx lint-staged diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..e7e4f436f --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +# Omit the registry url which can be an organization's internal npm mirror when generating package-lock.json file +# see: https://github.com/npm/cli/pull/4874 +# and https://docs.npmjs.com/cli/v8/using-npm/config#omit-lockfile-registry-resolved +omit-lockfile-registry-resolved = true \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index cd3688288..b79091e38 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,3 +9,7 @@ website dist src/app-directory/*/target +node_modules +coverage +.nyc_output +build \ No newline at end of file diff --git a/.semgrepignore b/.semgrepignore index b7682dfb6..9509aecef 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -2,7 +2,10 @@ website/** # Just used for build so ignoring s2tQuicktypeUtil.js -schemas/api/t2sQuicktypeUtil.js +t2sQuicktypeUtil.js # API schema set for localhost gets picked up by semgrep rule -schemas/bridgingAsyncAPI/bridgingAsyncAPI.json +schemas/bridgingAsyncAPI/bridgingAsyncAPI.json + +# demo apps get picked up for not having integrity headers +toolbox/fdc3-for-web/demo/src/client/apps/** diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..55712c19f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 09def0fd3..abc10921b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Added utility functions `isStandardContextType(contextType: string)`, `isStandardIntent(intent: string)`,`getPossibleContextsForIntent(intent: StandardIntent)`. ([#1139](https://github.com/finos/FDC3/pull/1139)) * Added support for event listening outside of intent or context listnener. Added new function `addEventListener`, type `EventHandler`, enum `FDC3EventType` and interfaces `FDC3Event` and `FDC3ChannelChangedEvent`. ([#1207](https://github.com/finos/FDC3/pull/1207)) * Added new `CreateOrUpdateProfile` intent. ([#1359](https://github.com/finos/FDC3/pull/1359)) -* Added conformance tests into the FDC3 API documentation in the current version and backported into 2.0 and 2.1. Removed outdated 1.2 conformance tests (which are preserved in the older 2.0 and 2.1 versions). ([#1417](https://github.com/finos/FDC3/pull/1417)). +* Added conformance tests into the FDC3 API documentation in the current version and backported into 2.0 and 2.1. Removed outdated 1.2 conformance tests (which are preserved in the older 2.0 and 2.1 versions). ([#1417](https://github.com/finos/FDC3/pull/1417)) +* Added separate `fdc3-commonjs` module for compatibility with older projects that use CommonJS. ([#1452](https://github.com/finos/FDC3/pull/1452)) +* Added testing policy to [Contributing](CONTRIBUTING) page to address ([810](https://github.com/finos/FDC3/issues/810)) +* Added the ability to control logging to the JS console from getAgent() and the DesktopAgentProxy via arguments to getAgent(). ([#1495](https://github.com/finos/FDC3/pull/1495)) +* Added the ability for a browser-based DesktopAgent to control the timeouts used in the DesktopAgentProxy when making calls to it, via properties in WCP3Handshake message. ([#1497](https://github.com/finos/FDC3/pull/1497)) + ### Changed @@ -33,6 +38,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * FDC3 apps are now encouraged to instantiate their FDC3 interface (DesktopAgent) using the `getAgent()` function provided by the `@finos/fdc3` module. This will allow apps to interoperate in either traditional Preload DAs (i.e. Electron) as well as the new Browser-Resident DAs. ([#1191](https://github.com/finos/FDC3/pull/1191)) * `ContextType` and `Intent` (`string`) types were created for use in DesktopAgent API signatures - they are unions of standardized values and `string`, enabling autocomplete/IntelliSense in IDEs when working with the FDC3 API. ([#1139](https://github.com/finos/FDC3/pull/1139)) * SessionStorage use by `getAgent` was updated to scope the stored data by `window.name` and the app's `identityUrl`. ([#1442](https://github.com/finos/FDC3/pull/1442)) +* FDC3 Workbench updated to use `getAgent()` rather than `fdc3Ready()` ### Deprecated diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 623c7fb99..0bba2a5ea 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,6 +80,30 @@ The Working Group uses pull requests to track changes. To submit a change to the To contribute a patch for a New Intent, see the [Submit New Intent](docs/guides/submit-new-intent) guide. +**3.6. Test Policy** + +- The FDC3 project takes very seriously code quality, especially with respect to production-grade sub-modules. This includes: + +|Module | Test Policy | +|---|---| +|`packages/fdc3` | Code should not be added here - just `import` / `export` in `index.ts` | +|`packages/fdc3-agent-proxy` | Contributions must improve or maintain coverage at the current level | +|`packages/fdc3-commonjs` | Code should not be added here | +|`packages/fdc3-context` | Must contain only JSON Schemas and source code generated from them | +|`packages/fdc3-get-agent` |Contributions must improve or maintain coverage at the current level +|`packages/fdc3-schema` | Must contain only JSON Schemas and source code generated from them | +|`packages/fdc3-standard` | Contributions must improve or maintain coverage at the current level | +|`toolbox/fdc3-for-web/fdc3-web-impl` | Contributions must improve or maintain coverage at the current level | + +Please note that the FDC3 project uses the following test policy: + + * Code should have tests (coverage is reported in the PR comments) + * All tests must pass. (checked automatically by the PR comments) + * All tests must be meaningful. + * All tests must be kept up-to-date. + * All tests must be run locally before submitting a PR. + * Finally, the `toolbox/fdc3-for-web/demo` project is expected to pass the FDC3 conformance framework prior to new FDC3 releases (not currently automated). + ## 4. Pull Request Workflow. The next section contains more information on the workflow followed for Pull Requests. diff --git a/README.md b/README.md index c394526b8..7d5475d7f 100755 --- a/README.md +++ b/README.md @@ -76,12 +76,47 @@ The specifications are informed by agreed [business use cases](https://fdc3.fino - All that is required is a "desktop agent" that supports the FDC3 standard, which is responsible for coordinating application interactions. - Get started using FDC3 on the web with TypeScript by reading the [supported platforms](https://fdc3.finos.org/docs/supported-platforms) page. -### FDC3 npm module +## FDC3 Project Structure -The FDC3 npm package does NOT provide a Desktop Agent implementation. Rather, it can by used by web applications to target operations from the API Specification in a consistent way. Each FDC3-compliant desktop agent that the application runs in, can then provide an implementation of the FDC3 API operations. +This project (the FDC3 Standard repo) is now a monorepo containing the following modules: + +| Directory | Release Coordinates | Purpose | Testing / Coverage | +|--------------------------------------|--------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------| +| `packages/fdc3-schema` | `@finos/fdc3-schema` (npm) | Contains the FDC3 For The Web and Desktop Agent Bridging protocol schemas. Generates `BridgingTypes.ts` and `BrowserTypes.ts` versions of those schemas for consumption in typescript code. | n/a | +| `packages/fdc3-context` | `@finos/fdc3-context` (npm) | Contains the schemas for standard FDC3 context types. Generates the `ContextTypes.ts` typescript version of the schema for consumption in typescript/javascript. | n/a | +| `packages/fdc3-standard` | `@finos/fdc3-standard` (npm) | Interface definitions for the FDC3 standard in typescript (e.g. the `DesktopAgent` interface) and the app directory schema. | Jest, embedded NYC | +| `packages/fdc3-agent-proxy` | `@finos/fdc3-agent-proxy` (npm) | Contains a complete implementation of the FDC3 DACP. Written in a platform-agnostic manner. | Cucumber, NYC | +| `packages/fdc3-get-agent` | `@finos/fdc3-get-agent` (npm) | Implements the `getAgent` and `fdc3Ready()` functions as well as the FDC3 Web Connection protocol to allow FDC3 to work on the web or in an electron container. | Cucumber, NYC | +| `packages/testing` | -not released- | Contains testing tools used by the cucumber tests used within other modules of this project. | | +| `toolbox/fdc3-conformance` | -not released- | Contains definitions of the FDC3 conformance test suite, implemented by the [FDC3 Conformance Framework](https://github.com/finos/FDC3-conformance-framework) | Test Definitions Only | +| `toolbox/fdc3-workbench` | [here](https://fdc3.finos.org/toolbox/fdc3-workbench/) | Contains an FDC3-For-Web ready version of the [FDC3 Workbench](toolbox/fdc3-workbench/README.md). | | +| `toolbox/fdc3-explained` | [Here](https://fdc3.finos.org/toolbox/fdc3-explained) | [Readme Here](toolbox/fdc3-explained/README.md) | | +| `toolbox/fdc3-for-web/fdc3-web-impl` | `@finos/fdc3-web-impl` (npm) | Portable and reusable implementation of the FDC3 For-The-Web Desktop Agent-Side protocol, | Cucumber, NYC | +| `toolbox/fdc3-for-web/demo` | -not released- | A reference implementation of an FDC3-For-The-Web Desktop Agent, using the above implementation and conforming to FDC3 2.0 from the [FDC3 Conformance Framework](https://github.com/finos/FDC3-conformance-framework) | | +| `packages/fdc3` | `@finos/fdc3` (npm) | Imports `fdc3-standard`, `fdc3-context`, `fdc3-schema` and `fdc3-get-agent` sub-modules. This is intended to be the main entry point for typescript / javascript applications using FDC3 | | +| `packages/fdc3-commonjs` | `@finos/fdc3-commonjs` (npm) | A roll-up of the `fdc3` sub-module. This is for **backwards compatibility where CommonJS is required**. May not be provided in future versions of FDC3. | | + + +### Building and Running The FDC3 Modules + +From the root package, you can run `npm run build` to build all the modules, or `npm run test` to run all the tests. `npm run dev` will start the `demo` and `fdc3-workbench` modules. For installation and usage instructions, see: +### Bumping Version Numbers (for maintainers) + +It's important that all of the versions of the submodules stay on the same version, and that the references between them are consistent to that version. To change the version number (say before or after a release) run the following: + +``` +// first, update version number in package.json +npm login +npm version --workspaces // changes the version number in all submodule package.json files +npm run syncpack // sycnhronizes version numbers +npm up // fixes node_module references +npm run build // builds all the modules against the new version +npm publish --access=public --workspaces // this step performs a manual release of the npm modules (not needed with GitHub actions releases) +``` + ## Getting Involved ### Using the standard? Let us know @@ -171,4 +206,6 @@ THIS STANDARD IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULA ## FDC3 Archive -An archive of FDC3 documentation and meeting notes is available at . The mailing list archive for [fdc3@finos.org](mailto:fdc3@finos.org) is available at +An archive of FDC3 documentation and meeting notes from the early days of FDC3 is available at . Later meeting minutes cam be found in closed Github issues. + +The mailing list archive for [fdc3@finos.org](mailto:fdc3@finos.org) is available at diff --git a/comment-template.md b/comment-template.md new file mode 100644 index 000000000..93bb16ea2 --- /dev/null +++ b/comment-template.md @@ -0,0 +1,20 @@ +## Coverage Report + +Commit: [{{short_commit_sha}}]({{commit_link}}) +Base: [{{base_ref}}@{{base_short_commit_sha}}]({{base_commit_link}}) + +| Type | Base | This PR | +|---------------------------|--------------------------------------------|------------------------------------------------------------------------------------| +| Total Statements Coverage | {{base_total_statements_coverage_percent}} | {{total_statements_coverage_percent}} ({{total_statements_coverage_percent_diff}}) | +| Total Branches Coverage | {{base_total_branches_coverage_percent}} | {{total_branches_coverage_percent}} ({{total_branches_coverage_percent_diff}}) | +| Total Functions Coverage | {{base_total_functions_coverage_percent}} | {{total_functions_coverage_percent}} ({{total_functions_coverage_percent_diff}}) | +| Total Lines Coverage | {{base_total_lines_coverage_percent}} | {{total_lines_coverage_percent}} ({{total_lines_coverage_percent_diff}}) | + +
+Details (changed files) +{{changed_files_coverage_table}} +
+
+Details (all files) +{{files_coverage_table}} +
\ No newline at end of file diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 6a187a655..000000000 --- a/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('jest').Config} */ -module.exports = { - moduleFileExtensions: ["js", "ts"], - globals: { - - }, - transform: { - "^.+\\.ts?$": ["ts-jest", { isolatedModules: true }] - }, - testRegex: ".+\\.test\\.ts?$", - testEnvironment: "jsdom", -}; \ No newline at end of file diff --git a/netlify.toml b/netlify.toml index 567dde34d..c3e0cd8ac 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,5 +1,5 @@ [build] - ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../{toolbox,docs,src,test,website}/" + ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../{packages,website,toolbox}/" [[headers]] # Define which paths this specific [[headers]] block will cover. diff --git a/package-lock.json b/package-lock.json index 6a0e58058..d140778dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,79 +1,43 @@ { "name": "@finos/fdc3", - "version": "2.1.1", + "version": "2.2.0-alpha.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@finos/fdc3", - "version": "2.1.1", + "version": "2.2.0-alpha.3", "license": "Apache-2.0", - "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.5", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "11.1.6", - "@types/jest": "29.5.12", - "@typescript-eslint/eslint-plugin": "7.1.1", - "@typescript-eslint/parser": "7.1.0", - "eslint": "8.57.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-jest": "27.9.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "husky": "^4.3.0", - "jest": "29.7.0", - "jest-environment-jsdom": "29.7.0", - "jest-mock-extended": "3.0.5", - "prettier": "3.2.5", - "quicktype": "23.0.78", - "rimraf": "^5.0.5", - "rollup": "4.22.4", - "ts-jest": "29.1.2", - "tslib": "^2.0.1", - "typescript": "^4.0.3" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.14.1" - } - }, - "node_modules/@75lb/deep-merge": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.2.tgz", - "integrity": "sha512-08K9ou5VNbheZFxM5tDWoqjA3ImC50DiuuJ2tj1yEPRfkp8lLLg6XAaJ4On+a0yAXor/8ay5gHnAIshRM44Kpw==", - "dev": true, + "workspaces": [ + "packages/fdc3-schema", + "packages/fdc3-context", + "packages/fdc3-standard", + "packages/testing", + "packages/fdc3-agent-proxy", + "toolbox/fdc3-for-web/fdc3-web-impl", + "packages/fdc3-get-agent", + "packages/fdc3", + "packages/fdc3-commonjs", + "toolbox/fdc3-for-web/reference-ui", + "toolbox/fdc3-for-web/demo", + "toolbox/fdc3-workbench" + ], "dependencies": { - "lodash": "^4.17.21", - "typical": "^7.1.1" + "syncpack": "^12.4.0" }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@75lb/deep-merge/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "devDependencies": { + "concurrently": "^8.2.2", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.1.7", + "istanbul-merge": "^2.0.0", + "lint-staged": "^15.2.10", + "nyc": "17.1.0", + "prettier": "3.4.1" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -82,13 +46,28 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -96,30 +75,26 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", - "dev": true, + "version": "7.26.5", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", - "dev": true, + "version": "7.26.0", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -136,37 +111,43 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", - "dev": true, + "version": "7.26.5", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -176,70 +157,108 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.26.3", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, + "version": "7.25.9", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, + "version": "7.26.0", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -248,181 +267,214 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.26.5", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, + "version": "7.25.9", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, + "version": "7.25.9", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, + "version": "7.25.9", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.26.5", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { @@ -434,7 +486,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { @@ -446,7 +497,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { @@ -456,9 +506,50 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { @@ -470,7 +561,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { @@ -481,12 +571,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.25.9", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -497,7 +586,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { @@ -509,7 +597,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { @@ -521,7 +608,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { @@ -533,7 +619,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { @@ -545,7 +630,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { @@ -557,7 +641,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { @@ -567,10 +650,9 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -582,13 +664,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -597,1959 +678,9249 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=4" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@glideapps/ts-necessities": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", - "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=12.22" + "node": ">=6.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "dependencies": { - "jest-get-type": "^29.6.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@mark.probst/typescript-json-schema": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.55.0.tgz", - "integrity": "sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/node": "^16.9.2", - "glob": "^7.1.7", - "path-equal": "^1.1.2", - "safe-stable-stringify": "^2.2.0", - "ts-node": "^10.9.1", - "typescript": "4.9.4", - "yargs": "^17.1.1" - }, - "bin": { - "typescript-json-schema": "bin/typescript-json-schema" - } - }, - "node_modules/@mark.probst/typescript-json-schema/node_modules/@types/node": { - "version": "16.18.91", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.91.tgz", - "integrity": "sha512-h8Q4klc8xzc9kJKr7UYNtJde5TU2qEePVyH3WyzJaUC+3ptyc5kPQbWOIUcn8ZsG5+KSkq+P0py0kC0VqxgAXw==", - "dev": true - }, - "node_modules/@mark.probst/typescript-json-schema/node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { - "node": ">=4.2.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.1.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", - "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "node_modules/@babel/runtime": { + "version": "7.26.0", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, + "node_modules/@babel/template": { + "version": "7.25.9", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.5", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@cucumber/ci-environment": { + "version": "10.0.0", + "integrity": "sha512-lRkiehckosIOdc7p1L44nZsttO5dVHFjpwKKWZ07x8SeoAdV/sPuGe1PISe0AmAowFGza62nMOgG4KaroGzwFQ==" + }, + "node_modules/@cucumber/cucumber": { + "version": "10.3.1", + "integrity": "sha512-0H0NkOXcYTCG1qCh3o0p1HPSMODGJmlHi1rm5yfoiMx5tJbBjxVNI2VVD2xtPWA+D6ehHQD9asewuzjMXrbPIw==", + "dependencies": { + "@cucumber/ci-environment": "10.0.0", + "@cucumber/cucumber-expressions": "17.0.1", + "@cucumber/gherkin": "27.0.0", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "8.0.5", + "@cucumber/html-formatter": "21.2.0", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "24.0.1", + "@cucumber/tag-expressions": "6.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.3", + "commander": "^10.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^10.3.10", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.2.1", + "mkdirp": "^2.1.5", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-pkg-up": "^7.0.1", + "resolve-pkg": "^2.0.0", + "semver": "7.5.3", + "string-argv": "0.3.1", + "strip-ansi": "6.0.1", + "supports-color": "^8.1.1", + "tmp": "^0.2.1", + "type-fest": "^4.8.3", + "util-arity": "^1.1.0", + "xmlbuilder": "^15.1.1", + "yaml": "^2.2.2", + "yup": "1.2.0" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "engines": { + "node": "18 || >=20" + } + }, + "node_modules/@cucumber/cucumber-expressions": { + "version": "17.0.1", + "integrity": "sha512-reR7/sNRmDWgdz8BtFuHEwpksPnAkHty7gxUC2n0iaUPmckv9G5I5i+Vonc6xwUHDb/hmHPz/DyUL+Iv4Ao96w==", + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/cucumber/node_modules/@cucumber/html-formatter": { + "version": "21.2.0", + "integrity": "sha512-4OcSa12Y0v5e4ySDl67+QFTxCG/Y9fxGSkFqvm98ggpTvS7b75whwzupu+lM2lMBw+h3H6P8ZURQr0xQIAwE2A==", + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/@cucumber/cucumber/node_modules/@cucumber/messages": { + "version": "24.0.1", + "integrity": "sha512-dKfNkvgc6stSQIyeHk7p/221iqEZe1BP+e/Js8XKtSmc0sS8khKMvbSBwYVeonn/67/vYKiAyo6Eo0SzXd5Plw==", + "dependencies": { + "@types/uuid": "9.0.7", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "node_modules/@cucumber/cucumber/node_modules/@types/uuid": { + "version": "9.0.7", + "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + }, + "node_modules/@cucumber/cucumber/node_modules/reflect-metadata": { + "version": "0.2.1", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer." + }, + "node_modules/@cucumber/gherkin": { + "version": "27.0.0", + "integrity": "sha512-j5rCsjqzRiC3iVTier3sa0kzyNbkcAmF7xr7jKnyO7qDeK3Z8Ye1P3KSVpeQRMY+KCDJ3WbTDdyxH0FwfA/fIw==", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=22" + } + }, + "node_modules/@cucumber/gherkin-streams": { + "version": "5.0.1", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dependencies": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + }, + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "9.1.0", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@cucumber/gherkin-utils": { + "version": "8.0.5", + "integrity": "sha512-kxM1OCDjYddF26VKc892PF0GokW4wUIl1PUz3TIXsPZgS39ExM1pF8oww8mlGFD2B0+4op/cSE3SSIME5H3aNw==", + "dependencies": { + "@cucumber/gherkin": "^26.0.0", + "@cucumber/messages": "^22.0.0", + "@teppeis/multimaps": "3.0.0", + "commander": "10.0.1", + "source-map-support": "^0.5.21" + }, + "bin": { + "gherkin-utils": "bin/gherkin-utils" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { + "version": "26.2.0", + "integrity": "sha512-iRSiK8YAIHAmLrn/mUfpAx7OXZ7LyNlh1zT89RoziSVCbqSVDxJS6ckEzW8loxs+EEXl0dKPQOXiDmbHV+C/fA==", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=22" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "22.0.0", + "integrity": "sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==", + "dependencies": { + "@types/uuid": "9.0.1", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@types/uuid": { + "version": "9.0.1", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + }, + "node_modules/@cucumber/gherkin-utils/node_modules/reflect-metadata": { + "version": "0.1.13", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/@cucumber/gherkin-utils/node_modules/uuid": { + "version": "9.0.0", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { + "version": "22.0.0", + "integrity": "sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==", + "dependencies": { + "@types/uuid": "9.0.1", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@cucumber/gherkin/node_modules/@types/uuid": { + "version": "9.0.1", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + }, + "node_modules/@cucumber/gherkin/node_modules/reflect-metadata": { + "version": "0.1.13", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/@cucumber/gherkin/node_modules/uuid": { + "version": "9.0.0", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "11.0.4", + "integrity": "sha512-Ojsx8U6C5IMLpQRYHugan2XM0/+5qXSCrds2Z7/bySuoaZr6ppVYB2jb03aXKWKA4GaMVbflpFOajb4Bc3niUg==", + "dependencies": { + "@cucumber/gherkin-utils": "^2.1.1", + "@cucumber/messages": "^13.2.1", + "@cucumber/query": "^7.0.1", + "@cucumber/react": "^11.0.2", + "commander": "^6.2.1", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "resolve-pkg": "^2.0.0", + "source-map-support": "^0.5.19" + }, + "bin": { + "cucumber-html-formatter": "bin/cucumber-html-formatter.js" + } + }, + "node_modules/@cucumber/html-formatter/node_modules/@cucumber/gherkin-utils": { + "version": "2.1.1", + "integrity": "sha512-3wSvFMi6i8lCxNIOM+WMWh/kvnUCEc1S7e0qUlEV7SaW/I4HqXwAodcZjoP6LBkwbPRpK+xEzqitsVLq0x88jQ==", + "dependencies": { + "@cucumber/messages": "^13.2.1", + "@teppeis/multimaps": "^1.1.0" + } + }, + "node_modules/@cucumber/html-formatter/node_modules/@cucumber/messages": { + "version": "13.2.1", + "integrity": "sha512-2cu6P1JsEcH0/RlMx302KOK9rkKDHYS1H+6/VhQ6L+yrVW458wOU3CiVgurLn3heCDdJH8r4L87pkSwt0rxiGQ==", + "dependencies": { + "@types/uuid": "^8.3.0", + "protobufjs": "^6.10.2", + "uuid": "^8.3.1" + } + }, + "node_modules/@cucumber/html-formatter/node_modules/@teppeis/multimaps": { + "version": "1.1.0", + "integrity": "sha512-YgANgfYU7LqgaLkGPWSTiwu2qcuhj0IOvj+kRwDFjAVbiEXT7ZQLPaFfmrAAN/Fa+tvwy1aYFd0RdT7lMO1Msw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@cucumber/html-formatter/node_modules/@types/uuid": { + "version": "8.3.4", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/@cucumber/html-formatter/node_modules/commander": { + "version": "6.2.1", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cucumber/html-formatter/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "27.0.2", + "integrity": "sha512-jo2B+vYXmpuLOKh6Gc8loHl2E8svCkLvEXLVgFwVHqKWZJWBTa9yTRCPmZIxrz4fnO7Pr3N3vKQCPu73/gjlVQ==", + "peer": true, + "dependencies": { + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" + } + }, + "node_modules/@cucumber/messages/node_modules/uuid": { + "version": "10.0.0", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/pretty-formatter": { + "version": "1.0.1", + "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==", + "dependencies": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/pretty-formatter/node_modules/ansi-styles": { + "version": "5.2.0", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@cucumber/query": { + "version": "7.0.1", + "integrity": "sha512-Ocxtm0LLLbYa3TwZZFzHG4/uHnb7GkYNUsRzf+bLyKOYymkffMkgLcITkx+X4Kw/tq+xzzHh3z/YivEAXxBJdQ==", + "dependencies": { + "@cucumber/messages": "^13.2.1", + "@teppeis/multimaps": "^1.1.0" + } + }, + "node_modules/@cucumber/query/node_modules/@cucumber/messages": { + "version": "13.2.1", + "integrity": "sha512-2cu6P1JsEcH0/RlMx302KOK9rkKDHYS1H+6/VhQ6L+yrVW458wOU3CiVgurLn3heCDdJH8r4L87pkSwt0rxiGQ==", + "dependencies": { + "@types/uuid": "^8.3.0", + "protobufjs": "^6.10.2", + "uuid": "^8.3.1" + } + }, + "node_modules/@cucumber/query/node_modules/@teppeis/multimaps": { + "version": "1.1.0", + "integrity": "sha512-YgANgfYU7LqgaLkGPWSTiwu2qcuhj0IOvj+kRwDFjAVbiEXT7ZQLPaFfmrAAN/Fa+tvwy1aYFd0RdT7lMO1Msw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@cucumber/query/node_modules/@types/uuid": { + "version": "8.3.4", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/@cucumber/query/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/react": { + "version": "11.0.2", + "integrity": "sha512-kT3T2zakMI9JDOHGpCxFgq54T/xkGFIvbEKm6vRjW5WjbDXV7pp5sMsxqeL5TS9MgmNRkZ3gNr1hX7MKytWb9g==", + "deprecated": "This package is now published under @cucumber/react-components", + "dependencies": { + "@cucumber/gherkin-utils": "^2.1.1", + "@cucumber/messages": "^13.2.1", + "@cucumber/query": "^7.0.1", + "@cucumber/tag-expressions": "^2.0.4", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", + "@fortawesome/react-fontawesome": "^0.1.13", + "@teppeis/multimaps": "^1.1.0", + "@types/elasticlunr": "^0.9.1", + "ansi-to-html": "^0.6.14", + "color": "^3.1.3", + "elasticlunr": "^0.9.5", + "highlight-words": "^1.0.6", + "react-accessible-accordion": "^3.3.3", + "react-markdown": "^5.0.3" + }, + "peerDependencies": { + "react": "~16 || ~17", + "react-dom": "~16 || ~17" + } + }, + "node_modules/@cucumber/react/node_modules/@cucumber/gherkin-utils": { + "version": "2.1.1", + "integrity": "sha512-3wSvFMi6i8lCxNIOM+WMWh/kvnUCEc1S7e0qUlEV7SaW/I4HqXwAodcZjoP6LBkwbPRpK+xEzqitsVLq0x88jQ==", + "dependencies": { + "@cucumber/messages": "^13.2.1", + "@teppeis/multimaps": "^1.1.0" + } + }, + "node_modules/@cucumber/react/node_modules/@cucumber/messages": { + "version": "13.2.1", + "integrity": "sha512-2cu6P1JsEcH0/RlMx302KOK9rkKDHYS1H+6/VhQ6L+yrVW458wOU3CiVgurLn3heCDdJH8r4L87pkSwt0rxiGQ==", + "dependencies": { + "@types/uuid": "^8.3.0", + "protobufjs": "^6.10.2", + "uuid": "^8.3.1" + } + }, + "node_modules/@cucumber/react/node_modules/@cucumber/tag-expressions": { + "version": "2.0.4", + "integrity": "sha512-HiNncmg/gS34yNpMFAeoIyUHqLFFN92MXIj3rs+BKo7vn16SxvYsigDvd2PAHyjSIThsp9TO1XDtl0SLKVB58g==" + }, + "node_modules/@cucumber/react/node_modules/@teppeis/multimaps": { + "version": "1.1.0", + "integrity": "sha512-YgANgfYU7LqgaLkGPWSTiwu2qcuhj0IOvj+kRwDFjAVbiEXT7ZQLPaFfmrAAN/Fa+tvwy1aYFd0RdT7lMO1Msw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@cucumber/react/node_modules/@types/uuid": { + "version": "8.3.4", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/@cucumber/react/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/tag-expressions": { + "version": "6.1.0", + "integrity": "sha512-+3DwRumrCJG27AtzCIL37A/X+A/gSfxOPLg8pZaruh5SLumsTmpvilwroVWBT2fPzmno/tGXypeK5a7NHU4RzA==" + }, + "node_modules/@effect/schema": { + "version": "0.69.0", + "integrity": "sha512-dqVnriWqM8TT8d+5vgg1pH4ZOXfs7tQBVAY5N7PALzIOlZamsBKQCdwvMMqremjSkKITckF8/cIj1eQZHQeg7Q==", + "dependencies": { + "fast-check": "^3.20.0" + }, + "peerDependencies": { + "effect": "^3.5.7" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "optional": true, "os": [ - "android" - ] + "aix" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ - "arm64" + "arm" ], - "dev": true, "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ - "darwin" - ] + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ - "darwin" - ] + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ - "arm" + "arm64" ], - "dev": true, "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ - "arm" + "x64" ], - "dev": true, "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], - "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", - "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", "cpu": [ "x64" ], "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ - "linux" - ] + "netbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.2.5", + "integrity": "sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==", "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", "dependencies": { - "type-detect": "4.0.8" + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@eslint/core": { + "version": "0.10.0", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.18.0", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@finos/demo": { + "resolved": "toolbox/fdc3-for-web/demo", + "link": true + }, + "node_modules/@finos/fdc3": { + "resolved": "packages/fdc3", + "link": true + }, + "node_modules/@finos/fdc3-agent-proxy": { + "resolved": "packages/fdc3-agent-proxy", + "link": true + }, + "node_modules/@finos/fdc3-commonjs": { + "resolved": "packages/fdc3-commonjs", + "link": true + }, + "node_modules/@finos/fdc3-context": { + "resolved": "packages/fdc3-context", + "link": true + }, + "node_modules/@finos/fdc3-get-agent": { + "resolved": "packages/fdc3-get-agent", + "link": true + }, + "node_modules/@finos/fdc3-schema": { + "resolved": "packages/fdc3-schema", + "link": true + }, + "node_modules/@finos/fdc3-standard": { + "resolved": "packages/fdc3-standard", + "link": true + }, + "node_modules/@finos/fdc3-web-impl": { + "resolved": "toolbox/fdc3-for-web/fdc3-web-impl", + "link": true + }, + "node_modules/@finos/testing": { + "resolved": "packages/testing", + "link": true + }, + "node_modules/@fontsource/roboto": { + "version": "5.1.0", + "integrity": "sha512-cFRRC1s6RqPygeZ8Uw/acwVHqih8Czjt6Q0MwoUoDe9U3m4dH1HmNDRBZyqlMSFwgNAUKgFImncKdmDHyKpwdg==", + "dev": true + }, + "node_modules/@fontsource/source-code-pro": { + "version": "5.1.0", + "integrity": "sha512-aT6pQbwEM/oGyK4Q8XOOknFcrXTAnP+GLVuEADBnB4avOYAOa4U5BG/D5JrTobwckuWyKrbMZ8EdcXPsqizfSw==", + "dev": true + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.19", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.x" + } + }, + "node_modules/@glideapps/ts-necessities": { + "version": "2.3.2", + "integrity": "sha512-tOXo3SrEeLu+4X2q6O2iNPXdGI1qoXEz/KrbkElTsWiWb69tFH4GzWz2K++0nBD6O3qO2Ft1C4L4ZvUfE2QDlQ==", + "dev": true + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@mark.probst/typescript-json-schema": { + "version": "0.55.0", + "integrity": "sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/node": "^16.9.2", + "glob": "^7.1.7", + "path-equal": "^1.1.2", + "safe-stable-stringify": "^2.2.0", + "ts-node": "^10.9.1", + "typescript": "4.9.4", + "yargs": "^17.1.1" + }, + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" + } + }, + "node_modules/@mark.probst/typescript-json-schema/node_modules/@types/node": { + "version": "16.18.124", + "integrity": "sha512-8ADCm5WzM/IpWxjs1Jhtwo6j+Fb8z4yr/CobP5beUUPdyCI0mg87/bqQYxNcqnhZ24Dc9RME8SQWu5eI/FmSGA==", + "dev": true + }, + "node_modules/@mark.probst/typescript-json-schema/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@mark.probst/typescript-json-schema/node_modules/typescript": { + "version": "4.9.4", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.4", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "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 + } + } + }, + "node_modules/@material-ui/core/node_modules/react-is": { + "version": "17.0.2", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@material-ui/icons": { + "version": "4.11.3", + "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "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 + } + } + }, + "node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.61", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.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 + } + } + }, + "node_modules/@material-ui/lab/node_modules/react-is": { + "version": "17.0.2", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@material-ui/styles": { + "version": "4.11.5", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "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 + } + } + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.21", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "node_modules/@material-ui/system": { + "version": "4.12.2", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "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 + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.21", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "dev": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.3", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@material-ui/utils/node_modules/react-is": { + "version": "17.0.2", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.2", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.4.2", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.2", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.2", + "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.30.1", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.30.1", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.30.1", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.30.1", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.30.1", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.30.1", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.30.1", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.30.1", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.30.1", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.30.1", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.30.1", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.30.1", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.30.1", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.30.1", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.30.1", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@sphinxxxx/color-conversion": { + "version": "2.2.2", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", + "dev": true + }, + "node_modules/@teppeis/multimaps": { + "version": "3.0.0", + "integrity": "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.25.0", + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.4", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.9" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "9.0.5", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/ace": { + "version": "0.0.52", + "integrity": "sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/color": { + "version": "4.2.0", + "integrity": "sha512-6+xrIRImMtGAL2X3qYkd02Mgs+gFGs+WsK0b7VVMaO4mYRISwyTjcqNrO0mNSmYEoq++rSLDB2F5HDNmqfOe+A==", + "dev": true, + "dependencies": { + "@types/color-convert": "*" + } + }, + "node_modules/@types/color-convert": { + "version": "2.0.4", + "integrity": "sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.0" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.5", + "integrity": "sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/elasticlunr": { + "version": "0.9.9", + "integrity": "sha512-59TMY+u8jKLqSg0AZStCz4n8A7l/nVenmum6fFQa9bUOH26GNMEgDseiN813IxXmTQ0AivefnMlbileBggCf5g==" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "node_modules/@types/expect": { + "version": "24.3.0", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", + "deprecated": "This is a stub types definition. expect provides its own type definitions, so you do not need this installed.", + "dependencies": { + "expect": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.13", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/jsoneditor": { + "version": "8.6.2", + "integrity": "sha512-ZzL6XANCYEWtYMfD5DLM5yjJdJ+cnuqtxOaJ5vV521HIDOuSyJM7eH8GXB72HL6HCZclqRr7Ix4UnHKeSS4WjA==", + "dev": true, + "dependencies": { + "@types/ace": "*", + "ajv": "^6.12.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.167", + "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.17.14", + "integrity": "sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.83", + "integrity": "sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "^0.16", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "dev": true, + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, + "node_modules/@types/urijs": { + "version": "1.19.25", + "integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/wtfnode": { + "version": "0.7.3", + "integrity": "sha512-UMkHpx+o2xRWLJ7PmT3bBzvIA9/0oFw80oPtY/xO4jfdq+Gznn4wP7K9B/JjMxyxy+wF+5oRPIykxeBbEDjwRg==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.20.0", + "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/type-utils": "8.20.0", + "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.20.0", + "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.20.0", + "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", + "dependencies": { + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.20.0", + "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.20.0", + "@typescript-eslint/utils": "8.20.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.20.0", + "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.20.0", + "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", + "dependencies": { + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/visitor-keys": "8.20.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.20.0", + "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.20.0", + "@typescript-eslint/types": "8.20.0", + "@typescript-eslint/typescript-estree": "8.20.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.20.0", + "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", + "dependencies": { + "@typescript-eslint/types": "8.20.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "5.4.3", + "integrity": "sha512-wsyXK9mascyplcqvww1gA1xYiy29iRHfyciw+a0t7qRNdzX6PdfSWmOoCi74epr87DujM+5J+rnnSv+4PazqVg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.25.8", + "@babel/preset-env": "^7.25.8", + "browserslist": "^4.24.0", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.38.1", + "magic-string": "^0.30.12", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.15.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ace-builds": { + "version": "1.37.5", + "integrity": "sha512-VMJ4Cnhq6L9dwvOCyuyyvQuiVTSwdZC7zDKJBBBJJax0wGQ7MvzQZFoi0gMmCm2I4Zuv/ZbtwU/dlglIhCNLhw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.14.0", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-to-html": { + "version": "0.6.15", + "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==", + "dependencies": { + "entities": "^2.0.0" + }, + "bin": { + "ansi-to-html": "bin/ansi-to-html" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/arg": { + "version": "4.1.3", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.6", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.24.4", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", + "dev": true, + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "browserslist": "*" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/caching-transform/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001692", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capital-case": { + "version": "1.0.4", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/collection-utils": { + "version": "1.0.1", + "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", + "dev": true + }, + "node_modules/color": { + "version": "3.2.1", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "dev": true, + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concurrently": { + "version": "8.2.2", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.7.1", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-js": { + "version": "3.40.0", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.40.0", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "dev": true, + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cucumber-console-formatter": { + "version": "1.0.0", + "integrity": "sha512-2DtwlLDE+URsh6/optsjH4/JLF01p9pkBMxBhH702neUrtU/FXm9FEyBYqhg5355MIq2FgEdRB3AcoVfBxO8hw==", + "dependencies": { + "@types/lodash": "4.14.167" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@cucumber/cucumber": ">= 7.0.0" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "1.5.3", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/effect": { + "version": "3.5.7", + "integrity": "sha512-PzEncc0R3ZZhqNTR+fXrSX+anF/4Ai6ftKie1ZrUUWY7WPE7d4KjB6wjpeWoGMOC7xWFPGSkBBUudyJN1mx3+g==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/elasticlunr": { + "version": "0.9.5", + "integrity": "sha512-5YM9LFQgVYfuLNEoqMqVWIBuF2UNCA+xu/jz1TyryLN/wmBcQSb+GNAwvLKvEpGESwgGN8XA1nbLAt6rKlyHYQ==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.83", + "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.2", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.2", + "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "node_modules/esbuild": { + "version": "0.23.1", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "9.18.0", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.8.3", + "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.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 + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.3.1", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.4", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/extend": { + "version": "3.0.2", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-check": { + "version": "3.20.0", + "integrity": "sha512-pZIjqLpOZgdSLecec4GKC3Zq5702MZ34upMKxojnNVSWA0K64V3pXOBT1Wdsrc3AphLtzRBbsi8bRWF4TUGmUg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-uri": { + "version": "3.0.5", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.18.0", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdc3-1.2": { + "name": "@finos/fdc3", + "version": "1.2.0", + "integrity": "sha512-im/vqpS96qsCKMPkwR/Fg2t2FQtwh+/LOvTekIY0eYyuz/CZQoqhwcxwk/Re0pqJiA3inisV7DSfQ1JYLi+bxw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/fdc3-for-web-reference-ui": { + "resolved": "toolbox/fdc3-for-web/reference-ui", + "link": true + }, + "node_modules/fdc3-workbench": { + "resolved": "toolbox/fdc3-workbench", + "link": true + }, + "node_modules/figures": { + "version": "3.2.0", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "15.14.0", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/graphql": { + "version": "0.11.7", + "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", + "dev": true, + "dependencies": { + "iterall": "1.1.3" + } + }, + "node_modules/has-ansi": { + "version": "4.0.1", + "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight-words": { + "version": "1.2.2", + "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==", + "engines": { + "node": ">= 16", + "npm": ">= 8" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-to-react": { + "version": "1.7.0", + "integrity": "sha512-b5HTNaTGyOj5GGIMiWVr1k57egAZ/vGy0GGefnCQ1VW5hu9+eku8AXHtf2/DeD95cj/FKBKYa1J7SWBOX41yUQ==", + "dependencies": { + "domhandler": "^5.0", + "htmlparser2": "^9.0", + "lodash.camelcase": "^4.3.0" + }, + "peerDependencies": { + "react": "^0.13.0 || ^0.14.0 || >=15" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "4.5.0", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.1.0", + "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "dev": true + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-merge": { + "version": "2.0.0", + "integrity": "sha512-Y812/uTdnF5Qc2qWxA7jQOTkqpFLEr7BHy8mzUQFRJstTjPigNS1Bh3q06AbOhBZ7tZqrI4MZdMgG34KVnUn6w==", + "dev": true, + "dependencies": { + "array.prototype.flatmap": "^1.3.1", + "for-each": "^0.3.3", + "glob": "^7.2.3", + "istanbul-lib-coverage": "^3.2.0", + "mkdirp": "^0.5.6", + "yargs": "^15.4.1" + }, + "bin": { + "istanbul-merge": "bin/istanbul-merge" + }, + "engines": { + "node": ">= 8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/istanbul-merge/node_modules/cliui": { + "version": "6.0.0", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/istanbul-merge/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-merge/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/istanbul-merge/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/istanbul-merge/node_modules/mkdirp": { + "version": "0.5.6", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/istanbul-merge/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/istanbul-merge/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/istanbul-merge/node_modules/wrap-ansi": { + "version": "6.2.0", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "node_modules/istanbul-merge/node_modules/y18n": { + "version": "4.0.3", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/istanbul-merge/node_modules/yargs": { + "version": "15.4.1", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "dependencies": { - "@types/node": "*" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/istanbul-merge/node_modules/yargs-parser": { + "version": "18.1.3", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { - "@types/istanbul-lib-report": "*" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "node_modules/iterall": { + "version": "1.1.3", + "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, + "node_modules/jackspeak": { + "version": "3.4.3", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "node_modules/jake": { + "version": "10.9.2", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", "dev": true }, - "node_modules/@types/urijs": { - "version": "1.19.25", - "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz", - "integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==", - "dev": true + "node_modules/jest": { + "version": "29.7.0", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "node_modules/jest-circus": { + "version": "29.7.0", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", - "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", + "node_modules/jest-cli": { + "version": "29.7.0", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.1", - "@typescript-eslint/type-utils": "7.1.1", - "@typescript-eslint/utils": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "typescript": { + "node-notifier": { "optional": true } } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "node_modules/jest-config": { + "version": "29.7.0", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", - "debug": "^4.3.4" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "eslint": "^8.56.0" + "@types/node": "*", + "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { + "optional": true + }, + "ts-node": { "optional": true } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "*" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", - "dev": true, + "node_modules/jest-diff": { + "version": "29.7.0", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { - "@typescript-eslint/types": "7.1.0", - "eslint-visitor-keys": "^3.4.1" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", - "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1" + "detect-newline": "^3.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", - "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "node_modules/jest-each": { + "version": "29.7.0", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", - "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.1.1", - "@typescript-eslint/utils": "7.1.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "eslint": "^8.56.0" + "canvas": "^2.5.0" }, "peerDependenciesMeta": { - "typescript": { + "canvas": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", - "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", - "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "node_modules/jest-junit": { + "version": "16.0.0", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/mkdirp": { + "version": "1.0.4", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "node_modules/jest-junit/node_modules/uuid": { + "version": "8.3.2", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", - "dev": true, + "node_modules/jest-message-util": { + "version": "29.7.0", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { - "@typescript-eslint/types": "7.1.0", - "eslint-visitor-keys": "^3.4.1" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", - "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", + "node_modules/jest-mock": { + "version": "29.7.0", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.1", - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/typescript-estree": "7.1.1", - "semver": "^7.5.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", - "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "node_modules/jest-mock-extended": { + "version": "3.0.5", + "integrity": "sha512-/eHdaNPUAXe7f65gHH5urc8SbRVWjYxBqmCgax2uqOBJy8UUcCBMN1upj1eZ8y/i+IqpyEm4Kq0VKss/GCCTdw==", "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "dependencies": { + "ts-essentials": "^7.0.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", + "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", - "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "jest-resolve": "*" }, "peerDependenciesMeta": { - "typescript": { + "jest-resolve": { "optional": true } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", - "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.1.1", - "eslint-visitor-keys": "^3.4.1" - }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", - "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "event-target-shim": "^5.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=6.5" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "node_modules/jest-runner": { + "version": "29.7.0", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">=0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { - "debug": "4" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">= 6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/jest-util": { + "version": "29.7.0", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/jest-validate": { + "version": "29.7.0", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" @@ -2558,1927 +9929,1571 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-worker": { + "version": "29.7.0", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/jmespath": { + "version": "0.16.0", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, "engines": { - "node": ">= 8" + "node": ">= 0.6.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "node_modules/js-base64": { + "version": "3.7.7", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", "dev": true }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/js-tokens": { + "version": "4.0.0", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, + "node_modules/js-yaml": { + "version": "4.1.0", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "node_modules/jsdom": { + "version": "20.0.3", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "node_modules/jsdom/node_modules/tr46": { + "version": "3.0.0", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "punycode": "^2.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, + "node_modules/jsep": { + "version": "1.4.0", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.16.0" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "node_modules/jsesc": { + "version": "3.1.0", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/json-source-map": { + "version": "0.6.1", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", + "dev": true }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "node_modules/json5": { + "version": "2.2.3", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "node": ">=6" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/jsoneditor": { + "version": "9.10.5", + "integrity": "sha512-fVZ0NMt+zm4rqTKBv2x7zPdLeaRyKo1EjJkaR1QjK4gEM1rMwICILYSW1OPxSc1qqyAoDaA/eeNrluKoxOocCA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" + "ace-builds": "^1.31.1", + "ajv": "^6.12.6", + "javascript-natural-sort": "^0.7.1", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonrepair": "3.1.0", + "mobius1-selectr": "^2.4.13", + "picomodal": "^3.0.0", + "vanilla-picker": "^2.12.2" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, + "node_modules/jsonpath-plus": { + "version": "10.2.0", + "integrity": "sha512-T9V+8iNYKFL2n2rF+w02LBOT2JjDnTjioaNFrxRy0Bv1y/hNsqR/EBK7Ojy2ythRHwmz2cRIls+9JitQGZC/sw==", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/jsonrepair": { + "version": "3.1.0", + "integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==", "dev": true, "bin": { - "semver": "bin/semver.js" + "jsonrepair": "bin/cli.js" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/jss": { + "version": "10.10.0", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", "dev": true, "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/jss-plugin-camel-case": { + "version": "10.10.0", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", "dev": true, "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "node_modules/jss-plugin-default-unit": { + "version": "10.10.0", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/jss-plugin-global": { + "version": "10.10.0", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/jss-plugin-nested": { + "version": "10.10.0", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" } }, - "node_modules/browser-or-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", - "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "node_modules/jss-plugin-props-sort": { + "version": "10.10.0", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/jss-plugin-rule-value-function": { + "version": "10.10.0", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", "dev": true, "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", "dev": true, "dependencies": { - "node-int64": "^0.4.0" + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "node_modules/keyv": { + "version": "4.5.4", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, + "node_modules/kleur": { + "version": "3.0.3", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "language-subtag-registry": "^0.3.20" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10" } }, - "node_modules/callsites": { + "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "node_modules/levn": { + "version": "0.4.1", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "node_modules/lilconfig": { + "version": "3.1.3", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lint-staged": { + "version": "15.4.0", + "integrity": "sha512-UdODqEZiQimd7rCzZ2vqFuELRNUda3mdv7M93jhE4SmDiqAj/w/msvwKgagH23jv2iCPw6Q5m+ltX4VlHvp2LQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "~5.4.1", + "commander": "~12.1.0", + "debug": "~4.4.0", + "execa": "~8.0.1", + "lilconfig": "~3.1.3", + "listr2": "~8.2.5", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.6.1" }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "node_modules/lint-staged/node_modules/commander": { + "version": "12.1.0", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "chalk": "^4.1.2" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/collection-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", - "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/string-argv": { + "version": "0.3.2", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.6.19" } }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.6.1", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=4.0.0" + "node": ">= 14" } }, - "node_modules/command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", + "node_modules/listr2": { + "version": "8.2.5", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", - "typical": "^7.1.1" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12.20.0" + "node": ">=18.0.0" } }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { - "node": ">=12.17" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=12.17" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "node-fetch": "^2.6.12" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "node_modules/locate-path": { + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "node_modules/lodash": { + "version": "4.17.21", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "node_modules/log-update": { + "version": "6.1.0", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "environment": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "get-east-asian-width": "^1.0.0" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/long": { + "version": "4.0.0", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/lower-case": { + "version": "2.0.2", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" + "node_modules/lru-cache": { + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, + "node_modules/luxon": { + "version": "3.2.1", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/magic-string": { + "version": "0.30.17", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "node_modules/make-dir": { + "version": "4.0.0", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dependencies": { - "esutils": "^2.0.2" + "semver": "^7.5.3" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", + "node_modules/make-error": { + "version": "1.3.6", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "tmpl": "1.0.5" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "node_modules/math-intrinsics": { + "version": "1.1.0", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/electron-to-chromium": { - "version": "1.4.712", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.712.tgz", - "integrity": "sha512-ncfPC8UnGIyGFrPE03J5Xn6yTZ6R+clkcZbuG1PJbjAaZBFS4Kn3UKfzu8eilzru6SfC8TPsHuwv0p0eYVu+ww==", - "dev": true + "node_modules/mdast-add-list-metadata": { + "version": "1.0.1", + "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", + "dependencies": { + "unist-util-visit-parents": "1.1.2" + } }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/media-typer": { + "version": "0.3.0", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "engines": { - "node": ">=0.12" + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/merge-descriptors": { + "version": "1.0.3", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-abstract": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", - "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, + "node_modules/merge-stream": { + "version": "2.0.0", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/message-await": { + "version": "1.1.0", + "integrity": "sha512-kvvy5kkCgqF7tM3tWSOalpw46dtIzmHtAYvEqiuLK8Bv7tLK4V92tPW/T4Iu8jNr9JSexK3b2s9JekUziuZ9sg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "cli-cursor": "^3.1.0", + "log-symbols": "^4.1.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/message-await/node_modules/cli-cursor": { + "version": "3.1.0", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "node_modules/message-await/node_modules/restore-cursor": { + "version": "3.1.0", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, + "node_modules/message-await/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "es-errors": "^1.3.0" + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8.6" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "node_modules/mime": { + "version": "1.6.0", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "node_modules/mime-db": { + "version": "1.52.0", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, + "node_modules/mimic-fn": { + "version": "2.1.0", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/mimic-function": { + "version": "5.0.1", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, + "node_modules/minimatch": { + "version": "3.1.2", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": "*" } }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, + "node_modules/minimist": { + "version": "1.2.8", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, + "node_modules/minipass": { + "version": "7.1.2", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "node": ">=16 || 14 >=14.17" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "node_modules/mkdirp": { + "version": "2.1.6", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/mobius1-selectr": { + "version": "2.4.13", + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==", + "dev": true + }, + "node_modules/mobx": { + "version": "6.13.5", + "integrity": "sha512-/HTWzW2s8J1Gqt+WmUj5Y0mddZk+LInejADc79NJadrWla3rHzmRHki/mnEUH1AvOmbNTZ1BRbKxr8DSgfdjMA==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/mobx" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/mobx-react": { + "version": "7.6.0", + "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "mobx-react-lite": "^3.4.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" }, "peerDependenciesMeta": { - "typescript": { + "react-dom": { + "optional": true + }, + "react-native": { "optional": true } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/mobx" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" }, - "engines": { - "node": ">=8.0.0" + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/moment": { + "version": "2.30.1", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "engines": { - "node": ">=4.0" + "node": "*" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "node_modules/mri": { + "version": "1.2.0", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=4" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/ms": { + "version": "2.1.3", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mz": { + "version": "2.7.0", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/nanoid": { + "version": "3.3.8", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": "*" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "node_modules/natural-compare": { + "version": "1.4.0", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.6" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node_modules/no-case": { + "version": "3.0.4", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/node-fetch": { + "version": "2.7.0", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/node-int64": { + "version": "0.4.0", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-preload": { + "version": "0.2.1", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dependencies": { - "brace-expansion": "^1.1.7" + "process-on-spawn": "^1.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/node-releases": { + "version": "2.0.19", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, + "node_modules/nodemon": { + "version": "3.1.9", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { "node": ">=4" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/normalize-path": { + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/normalize.css": { + "version": "8.0.1", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "10.4.3", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "path-key": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/nwsapi": { + "version": "2.2.16", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, + "node_modules/nyc": { + "version": "17.1.0", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" + "bin": { + "nyc": "bin/nyc.js" }, "engines": { - "node": ">= 6" + "node": ">=18" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dependencies": { - "reusify": "^1.0.4" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "flat-cache": "^3.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { - "to-regex-range": "^5.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "array-back": "^3.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "semver-regex": "^3.1.2" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" } }, - "node_modules/flat-cache/node_modules/rimraf": { + "node_modules/nyc/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -4489,149 +11504,74 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" + "node_modules/nyc/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, + "node_modules/nyc/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=0.10.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, + "node_modules/object-inspect": { + "version": "1.13.3", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" }, @@ -4639,36 +11579,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/object-keys": { + "version": "1.1.1", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, + "node_modules/object.assign": { + "version": "4.1.7", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4677,2323 +11604,2268 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/object.entries": { + "version": "1.1.8", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/object.fromentries": { + "version": "2.0.8", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dependencies": { - "type-fest": "^0.20.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globalthis": { + "node_modules/object.groupby": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dependencies": { - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/object.values": { + "version": "1.2.1", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, + "node_modules/on-finished": { + "version": "2.4.1", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "get-intrinsic": "^1.1.3" + "ee-first": "1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { + "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphql": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", - "dev": true, + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "iterall": "1.1.3" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "wrappy": "1" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, + "node_modules/onetime": { + "version": "5.1.2", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "es-define-property": "^1.0.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/openapi-typescript": { + "version": "6.7.6", + "integrity": "sha512-c/hfooPx+RBIOPM09GSxABOZhYPblDoyaGhqBkD/59vtpN21jEuWKDlM0KYTvqJVlSYjKs0tBcIdeXKChlSPtw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "ansi-colors": "^4.1.3", + "fast-glob": "^3.3.2", + "js-yaml": "^4.1.0", + "supports-color": "^9.4.0", + "undici": "^5.28.4", + "yargs-parser": "^21.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "openapi-typescript": "bin/cli.js" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "9.4.0", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, + "node_modules/optionator": { + "version": "0.9.4", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dependencies": { - "has-symbols": "^1.0.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "node_modules/ora": { + "version": "8.0.1", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dependencies": { - "function-bind": "^1.1.2" + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "engines": { - "node": ">= 6" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dependencies": { - "agent-base": "6", - "debug": "4" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/human-signals": { + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" + }, + "node_modules/ora/node_modules/is-unicode-supported": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "engines": { - "node": ">=10.17.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/husky": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", - "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", - "dev": true, - "hasInstallScript": true, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dependencies": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^4.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^5.0.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, - "bin": { - "husky-run": "bin/run.js", - "husky-upgrade": "lib/upgrader/bin.js" + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/husky" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + }, + "node_modules/own-keys": { + "version": "1.0.1", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/p-limit": { + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-locate": "^4.1.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/p-locate": { + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/p-map": { + "version": "3.0.0", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dependencies": { - "p-limit": "^2.2.0" + "aggregate-error": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "node_modules/p-try": { + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dependencies": { - "find-up": "^4.0.0" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "node_modules/pad-right": { + "version": "0.2.2", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/pako": { + "version": "1.0.11", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, + "node_modules/parent-module": { + "version": "1.0.1", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, + "node_modules/parse-entities": { + "version": "2.0.0", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, + "node_modules/parse-json": { + "version": "5.2.0", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { - "has-tostringtag": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/parse5": { + "version": "7.2.1", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "entities": "^4.5.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, + "node_modules/parseurl": { + "version": "1.3.3", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-equal": { + "version": "1.2.5", + "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "builtin-modules": "^3.3.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/path-type": { + "version": "5.0.0", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/picocolors": { + "version": "1.1.1", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, + "node_modules/picomatch": { + "version": "2.3.1", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": ">= 0.4" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/picomodal": { + "version": "3.0.0", + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==", + "dev": true + }, + "node_modules/pidtree": { + "version": "0.6.0", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "pidtree": "bin/pidtree.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/pirates": { + "version": "4.0.6", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, + "node_modules/pkg-dir": { + "version": "4.2.0", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dependencies": { - "call-bind": "^1.0.2" + "find-up": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "has-tostringtag": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "is-extglob": "^2.1.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/pluralize": { + "version": "8.0.0", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "node_modules/popper.js": { + "version": "1.16.1-lts", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", "dev": true }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/postcss": { + "version": "8.5.1", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { + "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/prettier": { + "version": "3.4.1", + "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dependencies": { + "fast-diff": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, + "node_modules/pretty-format": { + "version": "29.7.0", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "call-bind": "^1.0.7" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/pretty-quick": { + "version": "4.0.0", + "integrity": "sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "execa": "^5.1.1", + "find-up": "^5.0.0", + "ignore": "^5.3.0", + "mri": "^1.2.0", + "picocolors": "^1.0.0", + "picomatch": "^3.0.1", + "tslib": "^2.6.2" + }, + "bin": { + "pretty-quick": "lib/cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "prettier": "^3.0.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/pretty-quick/node_modules/picomatch": { + "version": "3.0.1", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, + "node_modules/proc-log": { + "version": "4.2.0", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/process": { + "version": "0.11.10", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6.0" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dependencies": { - "call-bind": "^1.0.2" + "fromentries": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/is-weakset": { + "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.4.0" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, + "node_modules/prompts": { + "version": "2.4.2", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, + "node_modules/prop-types": { + "version": "15.8.1", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/property-expr": { + "version": "2.0.6", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "node_modules/protobufjs": { + "version": "6.11.4", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/proxy-addr": { + "version": "2.0.7", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "node_modules/psl": { + "version": "1.15.0", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "punycode": "^2.3.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/iterall": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", + "node_modules/pstree.remy": { + "version": "1.1.8", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "node_modules/punycode": { + "version": "2.3.1", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, + "node_modules/pure-rand": { + "version": "6.1.0", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/qs": { + "version": "6.13.0", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "side-channel": "^1.0.6" }, "engines": { - "node": ">=14" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/querystringify": { + "version": "2.2.0", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quicktype": { + "version": "23.0.78", + "integrity": "sha512-KeF1KNwfcnoi349hmbvJpxGccNKF6xvyUnPZ4uOQ8NA1Ipb/2f2HPvx6UIUtGYUY2AM9PJSIMjwMAg1dfB5MtA==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "@glideapps/ts-necessities": "^2.1.3", + "chalk": "^4.1.2", + "collection-utils": "^1.0.1", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "cross-fetch": "^4.0.0", + "graphql": "^0.11.7", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "quicktype-core": "23.0.78", + "quicktype-graphql-input": "23.0.78", + "quicktype-typescript-input": "23.0.78", + "readable-stream": "^4.4.2", + "stream-json": "1.8.0", + "string-to-stream": "^3.0.1", + "typescript": "4.9.5" }, "bin": { - "jest": "bin/jest.js" + "quicktype": "dist/index.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=18.12.0" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/quicktype-core": { + "version": "23.0.78", + "integrity": "sha512-df+wJfOudbKWV7u82qRvJLCPR86T9ObpRWjs+2DKQoNm/b9ku5PH74GRgaTkaQ942CwISH1hbXiFxAGoeNEaFg==", "dev": true, "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@glideapps/ts-necessities": "2.1.3", + "@types/urijs": "^1.19.19", + "browser-or-node": "^2.1.1", + "collection-utils": "^1.0.1", + "cross-fetch": "^4.0.0", + "is-url": "^1.2.4", + "js-base64": "^3.7.5", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.4.2", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.3.1" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "node_modules/quicktype-core/node_modules/@glideapps/ts-necessities": { + "version": "2.1.3", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==", + "dev": true + }, + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.4.2", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/quicktype-graphql-input": { + "version": "23.0.78", + "integrity": "sha512-KyGSdzC8HwCWAJpw1UnmWDhNJTm2Nx+rlySopeFX9tndJIhv69Jg+Drk6XIUEq/YrenjB/+bmgpz/41ugtncTA==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, + "collection-utils": "^1.0.1", + "graphql": "^0.11.7", + "quicktype-core": "23.0.78" + } + }, + "node_modules/quicktype-typescript-input": { + "version": "23.0.78", + "integrity": "sha512-OaEfS4n4OjgAUe5IpuZiBPe675GnvSGyP1/3WUrX5T558SoorjA1RcqiPmitUh0MikhYQLBR9j/L2AaM4OkLWQ==", + "dev": true, + "dependencies": { + "@mark.probst/typescript-json-schema": "0.55.0", + "quicktype-core": "23.0.78", + "typescript": "4.9.5" + } + }, + "node_modules/quicktype-typescript-input/node_modules/typescript": { + "version": "4.9.5", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, "bin": { - "jest": "bin/jest.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=4.2.0" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "node_modules/quicktype/node_modules/typescript": { + "version": "4.9.5", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "17.0.2", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-accessible-accordion": { + "version": "3.3.5", + "integrity": "sha512-yCh3tx+jNuOPs+m58LOBFTGDEaGvM8UfuCNznr855FDAWzwV8V/ZH/TVBvgqH0npP58KrrVrHpj4jcy0EE5hEw==", "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "react": "^16.3.2 || ^17.0.0", + "react-dom": "^16.3.3 || ^17.0.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "peerDependencies": { + "react": "17.0.2" } }, - "node_modules/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/react-is": { + "version": "18.3.1", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-markdown": { + "version": "5.0.3", + "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==", + "dependencies": { + "@types/mdast": "^3.0.3", + "@types/unist": "^2.0.3", + "html-to-react": "^1.3.4", + "mdast-add-list-metadata": "1.0.1", + "prop-types": "^15.7.2", + "react-is": "^16.8.6", + "remark-parse": "^9.0.0", + "unified": "^9.0.0", + "unist-util-visit": "^2.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "16.13.1", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "node_modules/react-transition-group": { + "version": "4.4.5", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "detect-newline": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" }, - "peerDependencies": { - "canvas": "^2.5.0" + "engines": { + "node": ">=6" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-yaml-file": { + "version": "2.1.0", + "integrity": "sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "js-yaml": "^4.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": ">=10.13" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "node_modules/readable-stream": { + "version": "4.7.0", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "node_modules/readdirp": { + "version": "3.6.0", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "picomatch": "^2.2.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8.10.0" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/reflect-metadata": { + "version": "0.2.2", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "peer": true + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "regenerate": "^1.4.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp-match-indices": { + "version": "1.0.2", + "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "dependencies": { + "regexp-tree": "^0.1.11" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock-extended": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.5.tgz", - "integrity": "sha512-/eHdaNPUAXe7f65gHH5urc8SbRVWjYxBqmCgax2uqOBJy8UUcCBMN1upj1eZ8y/i+IqpyEm4Kq0VKss/GCCTdw==", + "node_modules/regexpu-core": { + "version": "6.2.0", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "ts-essentials": "^7.0.3" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, - "peerDependencies": { - "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", - "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/regjsgen": { + "version": "0.8.0", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "dependencies": { + "jsesc": "~3.0.2" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, + "node_modules/release-zalgo": { + "version": "1.0.0", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "es6-error": "^4.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, + "node_modules/remark-parse": { + "version": "9.0.0", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "mdast-util-from-markdown": "^0.8.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, + "node_modules/require-directory": { + "version": "2.1.1", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, + "node_modules/require-from-string": { + "version": "2.0.2", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, + "node_modules/require-main-filename": { + "version": "2.0.0", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.10", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "resolve-from": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "engines": { "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, + "node_modules/resolve-from": { + "version": "4.0.0", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, + "node_modules/resolve-pkg/node_modules/resolve-from": { + "version": "5.0.0", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-base64": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", - "dev": true + "node_modules/reusify": { + "version": "1.0.4", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/rfdc": { + "version": "1.4.1", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/rimraf": { + "version": "6.0.1", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", "dependencies": { - "argparse": "^2.0.1" + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.1", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" }, - "engines": { - "node": ">=14" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "peerDependencies": { - "canvas": "^2.5.0" + "engines": { + "node": "20 || >=22" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.0.2", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=4" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.0.2", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "engines": { + "node": "20 || >=22" + } }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=6" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "node_modules/rollup": { + "version": "4.30.1", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=4.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", + "fsevents": "~2.3.2" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "json-buffer": "3.0.1" + "queue-microtask": "^1.2.2" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/rxjs": { + "version": "7.8.1", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dependencies": { - "language-subtag-registry": "^0.3.20" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=0.10" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "node_modules/locate-path": { + "node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=v12.22.7" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, + "node_modules/scheduler": { + "version": "0.20.2", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { - "yallist": "^3.0.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dev": true, + "node_modules/seed-random": { + "version": "2.2.0", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==" + }, + "node_modules/semver": { + "version": "7.5.3", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "semver": "^7.5.3" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.19.0", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "tmpl": "1.0.5" + "ms": "2.0.0" } }, - "node_modules/merge-stream": { + "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">= 8" + "node": ">= 0.8" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, + "node_modules/serve-static": { + "version": "1.16.2", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">=8.6" + "node": ">= 0.8.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, + "node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, + "node_modules/set-function-name": { + "version": "2.0.2", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dependencies": { - "mime-db": "1.52.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "node_modules/set-proto": { + "version": "1.0.0", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, + "node_modules/setprototypeof": { + "version": "1.2.0", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "brace-expansion": "^2.0.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, + "node_modules/shebang-regex": { + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "node_modules/shell-quote": { + "version": "1.8.2", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, + "node_modules/side-channel": { + "version": "1.1.0", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "whatwg-url": "^5.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, + "node_modules/side-channel-list": { + "version": "1.0.0", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "node_modules/side-channel-map": { + "version": "1.0.1", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "node_modules/signal-exit": { + "version": "4.1.0", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/sisteransi": { + "version": "1.0.5", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "node_modules/slash": { + "version": "3.0.0", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, + "node_modules/socket.io": { + "version": "4.8.1", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.2.0" } }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "node_modules/socket.io-client": { + "version": "4.8.1", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", "dependencies": { - "wrappy": "1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "mimic-fn": "^2.1.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=6" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true, - "bin": { - "opencollective-postinstall": "index.js" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10.0.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "yocto-queue": "^0.1.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "p-limit": "^3.0.2" + "ms": "^2.1.3" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/source-map": { + "version": "0.6.1", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "node_modules/source-map-support": { + "version": "0.5.21", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dependencies": { - "callsites": "^3.0.0" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/spawn-wrap/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" }, "engines": { "node": ">=8" @@ -7002,433 +13874,295 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { - "entities": "^4.4.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-equal": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", - "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/spawn-wrap/node_modules/semver": { + "version": "6.3.1", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/spawn-wrap/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, + "node_modules/stack-utils": { + "version": "2.0.6", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "engines": { - "node": "14 || >=16.14" + "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "node_modules/stackframe": { + "version": "1.3.4", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "engines": { - "node": ">=8.6" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } + "node_modules/stream-chain": { + "version": "2.2.5", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "node_modules/stream-json": { + "version": "1.8.0", + "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", "dev": true, "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" + "stream-chain": "^2.2.5" } }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "node_modules/string_decoder": { + "version": "1.3.0", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "semver-compare": "^1.0.0" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" + "safe-buffer": "~5.2.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, + "node_modules/string-argv": { + "version": "0.3.1", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "engines": { - "node": ">= 0.4" + "node": ">=0.6.19" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/string-length": { + "version": "4.0.2", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "node_modules/string-to-stream": { + "version": "3.0.1", + "integrity": "sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "dependencies": { + "readable-stream": "^3.4.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/string-to-stream/node_modules/readable-stream": { + "version": "3.6.2", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 6" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/string-width": { + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=8" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quicktype": { - "version": "23.0.78", - "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-23.0.78.tgz", - "integrity": "sha512-KeF1KNwfcnoi349hmbvJpxGccNKF6xvyUnPZ4uOQ8NA1Ipb/2f2HPvx6UIUtGYUY2AM9PJSIMjwMAg1dfB5MtA==", - "dev": true, - "dependencies": { - "@glideapps/ts-necessities": "^2.1.3", - "chalk": "^4.1.2", - "collection-utils": "^1.0.1", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.1", - "cross-fetch": "^4.0.0", - "graphql": "^0.11.7", - "lodash": "^4.17.21", - "moment": "^2.29.4", - "quicktype-core": "23.0.78", - "quicktype-graphql-input": "23.0.78", - "quicktype-typescript-input": "23.0.78", - "readable-stream": "^4.4.2", - "stream-json": "1.8.0", - "string-to-stream": "^3.0.1", - "typescript": "4.9.5" - }, - "bin": { - "quicktype": "dist/index.js" - }, - "engines": { - "node": ">=18.12.0" - } + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/quicktype-core": { - "version": "23.0.78", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.78.tgz", - "integrity": "sha512-df+wJfOudbKWV7u82qRvJLCPR86T9ObpRWjs+2DKQoNm/b9ku5PH74GRgaTkaQ942CwISH1hbXiFxAGoeNEaFg==", - "dev": true, - "dependencies": { - "@glideapps/ts-necessities": "2.1.3", - "@types/urijs": "^1.19.19", - "browser-or-node": "^2.1.1", - "collection-utils": "^1.0.1", - "cross-fetch": "^4.0.0", - "is-url": "^1.2.4", - "js-base64": "^3.7.5", - "lodash": "^4.17.21", - "pako": "^1.0.6", - "pluralize": "^8.0.0", - "readable-stream": "4.4.2", - "unicode-properties": "^1.4.1", - "urijs": "^1.19.1", - "wordwrap": "^1.0.0", - "yaml": "^2.3.1" + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" } }, - "node_modules/quicktype-core/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/quicktype-core/node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, - "bin": { - "yaml": "bin.mjs" + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/quicktype-graphql-input": { - "version": "23.0.78", - "resolved": "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-23.0.78.tgz", - "integrity": "sha512-KyGSdzC8HwCWAJpw1UnmWDhNJTm2Nx+rlySopeFX9tndJIhv69Jg+Drk6XIUEq/YrenjB/+bmgpz/41ugtncTA==", - "dev": true, - "dependencies": { - "collection-utils": "^1.0.1", - "graphql": "^0.11.7", - "quicktype-core": "23.0.78" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quicktype-typescript-input": { - "version": "23.0.78", - "resolved": "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-23.0.78.tgz", - "integrity": "sha512-OaEfS4n4OjgAUe5IpuZiBPe675GnvSGyP1/3WUrX5T558SoorjA1RcqiPmitUh0MikhYQLBR9j/L2AaM4OkLWQ==", + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "dependencies": { - "@mark.probst/typescript-json-schema": "0.55.0", - "quicktype-core": "23.0.78", - "typescript": "4.9.5" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dependencies": { - "safe-buffer": "^5.1.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7437,23 +14171,82 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "node_modules/strip-ansi": { + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -7461,1296 +14254,1463 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, + "node_modules/symbol-tree": { + "version": "3.2.4", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/syncpack": { + "version": "12.4.0", + "integrity": "sha512-iVDbuxW1zpjC8IuGLLgTjfgnAjr1iTd+In//RGUi49nKT8f6BWYSEAt496fj4eGNmYeajUiGngBHl15Jb++RBg==", + "dependencies": { + "@effect/schema": "0.69.0", + "chalk": "5.3.0", + "chalk-template": "1.1.0", + "commander": "12.1.0", + "cosmiconfig": "9.0.0", + "effect": "3.5.7", + "enquirer": "2.4.1", + "fast-check": "3.20.0", + "globby": "14.0.2", + "minimatch": "10.0.1", + "npm-package-arg": "11.0.3", + "ora": "8.0.1", + "prompts": "2.4.2", + "read-yaml-file": "2.1.0", + "semver": "7.6.3", + "tightrope": "0.2.0", + "ts-toolbelt": "9.6.0" + }, + "bin": { + "syncpack": "dist/bin.js", + "syncpack-fix-mismatches": "dist/bin-fix-mismatches/index.js", + "syncpack-format": "dist/bin-format/index.js", + "syncpack-lint": "dist/bin-lint/index.js", + "syncpack-lint-semver-ranges": "dist/bin-lint-semver-ranges/index.js", + "syncpack-list": "dist/bin-list/index.js", + "syncpack-list-mismatches": "dist/bin-list-mismatches/index.js", + "syncpack-prompt": "dist/bin-prompt/index.js", + "syncpack-set-semver-ranges": "dist/bin-set-semver-ranges/index.js", + "syncpack-update": "dist/bin-update/index.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "node_modules/syncpack/node_modules/brace-expansion": { + "version": "2.0.1", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, + "node_modules/syncpack/node_modules/chalk": { + "version": "5.3.0", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/syncpack/node_modules/chalk-template": { + "version": "1.1.0", + "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "chalk": "^5.2.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, + "node_modules/syncpack/node_modules/commander": { + "version": "12.1.0", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/syncpack/node_modules/minimatch": { + "version": "10.0.1", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dependencies": { - "resolve-from": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/syncpack/node_modules/semver": { + "version": "7.6.3", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/systemjs": { + "version": "6.15.1", + "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", + "dev": true + }, + "node_modules/table-layout": { + "version": "4.1.1", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dev": true, + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, "engines": { - "node": ">=4" + "node": ">=12.17" } }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.17" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/terser": { + "version": "5.37.0", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", - "dev": true, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", - "dev": true, + "node_modules/thenify": { + "version": "3.3.1", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", - "fsevents": "~2.3.2" + "node": ">=0.8" } }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "node_modules/tightrope": { + "version": "0.2.0", + "integrity": "sha512-Kw36UHxJEELq2VUqdaSGR2/8cAsPgMtvX8uGVU6Jk26O66PhXec0A5ZnRYs47btbtwPDpXXF66+Fo3vimCM9aQ==", + "engines": { + "node": ">=16" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "node_modules/tiny-case": { + "version": "1.0.3", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "fdir": "^6.4.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } - ] + } }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "dev": true, + "node_modules/tmp": { + "version": "0.2.3", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { - "node": ">=10" + "node": ">=14.14" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/tmpl": { + "version": "1.0.5", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, + "node_modules/to-regex-range": { + "version": "5.0.1", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "xmlchars": "^2.2.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=v12.22.7" + "node": ">=8.0" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/toidentifier": { + "version": "1.0.1", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/touch": { + "version": "3.1.1", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { - "semver": "bin/semver.js" + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "node_modules/tr46": { + "version": "0.0.3", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "node_modules/tree-kill": { + "version": "1.2.2", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "engines": { - "node": ">=8" - }, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/ts-api-utils": { + "version": "2.0.0", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", "engines": { - "node": ">=10" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/ts-dedent": { + "version": "2.2.0", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "node_modules/ts-essentials": { + "version": "7.0.3", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "peerDependencies": { + "typescript": ">=3.7.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/ts-jest": { + "version": "29.2.5", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.3", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/ts-morph": { + "version": "24.0.0", + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "@ts-morph/common": "~0.25.0", + "code-block-writer": "^13.0.3" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, + "node_modules/ts-node": { + "version": "10.9.2", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/smob": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz", - "integrity": "sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/tslib": { + "version": "2.8.1", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, + "node_modules/tsx": { + "version": "4.19.2", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dependencies": { - "escape-string-regexp": "^2.0.0" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, + "node_modules/type-check": { + "version": "0.4.0", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "dev": true - }, - "node_modules/stream-json": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", - "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", + "node_modules/type-detect": { + "version": "4.0.8", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "dependencies": { - "stream-chain": "^2.2.5" + "engines": { + "node": ">=4" } }, - "node_modules/stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "dev": true, + "node_modules/type-fest": { + "version": "4.32.0", + "integrity": "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==", "engines": { - "node": ">=10" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, + "node_modules/type-is": { + "version": "1.6.18", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { - "safe-buffer": "~5.2.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/string-to-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-3.0.1.tgz", - "integrity": "sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==", - "dev": true, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dependencies": { - "readable-stream": "^3.4.0" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-to-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/typed-array-length": { + "version": "1.0.7", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8" + "node": ">=14.17" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "node_modules/typescript-eslint": { + "version": "8.20.0", + "integrity": "sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "@typescript-eslint/eslint-plugin": "8.20.0", + "@typescript-eslint/parser": "8.20.0", + "@typescript-eslint/utils": "8.20.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/typical": { + "version": "4.0.0", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "node_modules/undefsafe": { + "version": "2.0.5", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici": { + "version": "5.28.5", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "@fastify/busboy": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/undici-types": { + "version": "6.19.8", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/unicode-properties": { + "version": "1.4.1", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dev": true, + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/unicode-trie": { + "version": "2.0.0", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", "dev": true, + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/unified": { + "version": "9.2.2", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dependencies": { - "has-flag": "^4.0.0" + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", - "dev": true, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dependencies": { - "@75lb/deep-merge": "^1.1.1", - "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", - "wordwrapjs": "^5.1.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" }, - "bin": { - "table-layout": "bin/cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "1.1.2", + "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" + }, + "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" }, - "engines": { - "node": ">=12.17" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "node_modules/universalify": { + "version": "0.2.0", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { - "node": ">=12.17" + "node": ">= 4.0.0" } }, - "node_modules/table-layout/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true, + "node_modules/unpipe": { + "version": "1.0.0", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { - "node": ">=12.17" + "node": ">= 0.8" } }, - "node_modules/terser": { - "version": "5.29.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", - "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", - "dev": true, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "terser": "bin/terser" + "update-browserslist-db": "cli.js" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "node_modules/upper-case-first": { + "version": "2.0.2", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "tslib": "^2.0.3" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "punycode": "^2.1.0" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/urijs": { + "version": "1.19.11", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "dev": true }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/url-parse": { + "version": "1.5.10", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "dev": true + "node_modules/util-arity": { + "version": "1.1.0", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==" }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, + "node_modules/utils-merge": { + "version": "1.0.1", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/uuid": { + "version": "9.0.1", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=10.12.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "node_modules/vanilla-picker": { + "version": "2.12.3", + "integrity": "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ==", "dev": true, "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" + "@sphinxxxx/color-conversion": "^2.2.2" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, + "node_modules/vary": { + "version": "1.1.2", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { - "node": ">=16" + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=3.7.0" + "node_modules/vfile-message": { + "version": "2.0.4", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "node_modules/vite": { + "version": "5.4.14", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { - "ts-jest": "cli.js" + "vite": "bin/vite.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { - "@babel/core": { + "@types/node": { "optional": true }, - "@jest/types": { + "less": { "optional": true }, - "babel-jest": { + "lightningcss": { "optional": true }, - "esbuild": { + "sass": { "optional": true - } - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { + }, + "sass-embedded": { "optional": true }, - "@swc/wasm": { + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "node_modules/vite-express": { + "version": "0.15.0", + "integrity": "sha512-g5CIiUrip9t3LVgO0v0G+rB7HbtQL6oouyRAGeahHt7lDdJYxiURBdAkOYlOexoCLs6PZQRzbIwaT9BNPjCz6g==", + "dependencies": { + "picocolors": "^1.0.0" + } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=12" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.2.0" + "node": ">=12" } }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "sunos" ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=12" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10.12.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "dependencies": { @@ -8762,37 +15722,46 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { "makeerror": "1.0.12" } }, + "node_modules/web-vitals": { + "version": "1.1.2", + "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==", + "dev": true + }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } + "version": "3.0.1", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "engines": { @@ -8800,23 +15769,17 @@ } }, "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "5.0.0", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8828,39 +15791,39 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, + "version": "1.1.1", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, + "version": "1.2.1", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -8871,9 +15834,7 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -8887,25 +15848,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/which-module": { + "version": "2.0.1", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, + "version": "1.1.18", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -8915,15 +15870,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "node_modules/wordwrapjs": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "dev": true, "engines": { @@ -8931,17 +15891,15 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "version": "8.1.0", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -8950,9 +15908,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8965,15 +15921,60 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { @@ -8984,11 +15985,14 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, "engines": { "node": ">=10.0.0" }, @@ -9005,24 +16009,58 @@ } } }, + "node_modules/wtfnode": { + "version": "0.9.4", + "integrity": "sha512-5xgeLjIxZ8DVHU4ty3kOdd9QfHDxf89tmSy0+yN8n59S3wx6LBJh8XhEg61OPOGE65jEYGAtLq0GMzLKrsjfPQ==", + "dev": true, + "bin": { + "wtfnode": "proxy.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "engines": { "node": ">=12" } }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { @@ -9031,22 +16069,20 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, + "version": "2.7.0", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { @@ -9064,7 +16100,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { @@ -9073,24 +16108,457 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yup": { + "version": "1.2.0", + "integrity": "sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/fdc3": { + "name": "@finos/fdc3", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-get-agent": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3", + "@finos/fdc3-standard": "2.2.0-alpha.3" + } + }, + "packages/fdc3-agent-proxy": { + "name": "@finos/fdc3-agent-proxy", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3-standard": "2.2.0-alpha.3" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@eslint/js": "^9.16.0", + "@finos/testing": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "globals": "^15.13.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "uuid": "^9.0.1" + } + }, + "packages/fdc3-commonjs": { + "name": "@finos/fdc3-commonjs", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^12.1.1", + "rollup": "^4.27.4" + } + }, + "packages/fdc3-context": { + "name": "@finos/fdc3-context", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "mkdirp": "^3.0.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } + }, + "packages/fdc3-context/node_modules/mkdirp": { + "version": "3.0.1", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/fdc3-get-agent": { + "name": "@finos/fdc3-get-agent", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3-agent-proxy": "2.2.0-alpha.3", + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3", + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@eslint/js": "^9.16.0", + "@finos/fdc3-web-impl": "2.2.0-alpha.3", + "@finos/testing": "2.2.0-alpha.3", + "@types/node": "^20.16.11", + "@types/wtfnode": "^0.7.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "expect": "^29.7.0", + "globals": "^15.13.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "rimraf": "^6.0.1", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "wtfnode": "^0.9.3" + } + }, + "packages/fdc3-schema": { + "name": "@finos/fdc3-schema", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "message-await": "^1.1.0", + "mkdirp": "^3.0.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "ts-morph": "^24.0.0", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } + }, + "packages/fdc3-schema/node_modules/mkdirp": { + "version": "3.0.1", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/fdc3-standard": { + "name": "@finos/fdc3-standard", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "jest": "29.7.0", + "jest-environment-jsdom": "29.7.0", + "jest-junit": "^16.0.0", + "jest-mock-extended": "3.0.5", + "prettier": "3.4.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } + }, + "packages/testing": { + "name": "@finos/testing", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1" + } + }, + "packages/testing/node_modules/ajv": { + "version": "8.17.1", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/testing/node_modules/json-schema-traverse": { + "version": "1.0.0", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "toolbox/fdc3-for-web/demo": { + "name": "@finos/demo", + "version": "2.2.0-alpha.3", + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.5.12", + "express": "^4.21.1", + "socket.io": "^4.8.0", + "socket.io-client": "^4.8.0", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1", + "vite-express": "^0.15.0" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/color": "^4.2.0", + "@types/express": "^4.17.21", + "@types/node": "^20.16.11", + "color": "^4.2.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.13.0", + "nodemon": "^3.1.7", + "rimraf": "^6.0.1", + "typescript-eslint": "^8.17.0", + "vite": "^5.4.9" + } + }, + "toolbox/fdc3-for-web/demo/node_modules/color": { + "version": "4.2.3", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "toolbox/fdc3-for-web/fdc3-web-impl": { + "name": "@finos/fdc3-web-impl", + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "dependencies": { + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@eslint/js": "^9.16.0", + "@finos/testing": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "globals": "^15.13.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "openapi-typescript": "^6.7.6", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "uuid": "^9.0.1" + } + }, + "toolbox/fdc3-for-web/reference-ui": { + "name": "fdc3-for-web-reference-ui", + "version": "2.2.0-alpha.3", + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/color": "^4.2.0", + "color": "^4.2.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.13.0", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "vite": "^5.4.9" + } + }, + "toolbox/fdc3-for-web/reference-ui/node_modules/color": { + "version": "4.2.3", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "toolbox/fdc3-workbench": { + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "devDependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@eslint/compat": "^1.2.5", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.19.0", + "@finos/fdc3": "2.2.0-alpha.3", + "@fontsource/roboto": "5.1.0", + "@fontsource/source-code-pro": "5.1.0", + "@material-ui/core": "4.12.4", + "@material-ui/icons": "4.11.3", + "@material-ui/lab": "4.0.0-alpha.61", + "@types/jsoneditor": "^8.6.1", + "@types/react-dom": "18.3.1", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "@vitejs/plugin-legacy": "^5.4.2", + "@vitejs/plugin-react": "^4.3.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-react": "^7.37.1", + "fdc3-1.2": "npm:@finos/fdc3@1.2.x", + "globals": "^15.14.0", + "jsoneditor": "^9.10.5", + "lint-staged": "^15.2.10", + "mobx": "^6.13.3", + "mobx-react": "^7.6.0", + "nanoid": "^3.3.7", + "normalize.css": "^8.0.1", + "pretty-quick": "^4.0.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "terser": "^5.34.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1", + "vite": "^5.4.9", + "web-vitals": "^1.1.2" + } + }, + "toolbox/fdc3-workbench/node_modules/@eslint/js": { + "version": "9.19.0", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } } } } diff --git a/package.json b/package.json index be3b08bb4..804e169c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@finos/fdc3", - "version": "2.1.1", + "version": "2.2.0-alpha.3", "author": "Fintech Open Source Foundation (FINOS)", "homepage": "https://fdc3.finos.org", "repository": { @@ -17,22 +17,30 @@ "files": [ "dist" ], + "workspaces": [ + "packages/fdc3-schema", + "packages/fdc3-context", + "packages/fdc3-standard", + "packages/testing", + "packages/fdc3-agent-proxy", + "toolbox/fdc3-for-web/fdc3-web-impl", + "packages/fdc3-get-agent", + "packages/fdc3", + "packages/fdc3-commonjs", + "toolbox/fdc3-for-web/reference-ui", + "toolbox/fdc3-for-web/demo", + "toolbox/fdc3-workbench" + ], "scripts": { - "clean": "rimraf dist", - "start": "rollup -c rollup.config.js --bundleConfigAsCjs -w", - "prebuild": "npm run clean && npm run typegen && npm run typegen-browser && npm run typegen-bridging && npm run lint", - "build": "rollup -c rollup.config.js --silent --bundleConfigAsCjs", - "test": "jest --verbose", - "lint": "eslint src/ test/ --ext .ts --fix", - "prepack": "npm run build", - "typegen": "cd schemas && node ../s2tQuicktypeUtil.js context ../src/context/ContextTypes.ts", - "typegen-browser": "cd schemas && node ../s2tQuicktypeUtil.js api/api.schema.json api/common.schema.json context/context.schema.json api ../src/api/BrowserTypes.ts", - "typegen-bridging": "cd schemas && node ../s2tQuicktypeUtil.js api/api.schema.json api/common.schema.json api/broadcastRequest.schema.json api/findInstancesRequest.schema.json api/findInstancesResponse.schema.json api/findIntentRequest.schema.json api/findIntentResponse.schema.json api/findIntentsByContextRequest.schema.json api/findIntentsByContextResponse.schema.json api/getAppMetadataRequest.schema.json api/getAppMetadataResponse.schema.json api/openRequest.schema.json api/openResponse.schema.json api/raiseIntentRequest.schema.json api/raiseIntentResponse.schema.json api/raiseIntentResultResponse.schema.json context/context.schema.json bridging ../src/bridging/BridgingTypes.ts" - }, - "husky": { - "hooks": { - "pre-commit": "npm run prebuild" - } + "clean": "npm run clean --workspaces --if-present", + "build": "npm run build --workspaces --if-present", + "test": "npm run test --workspaces --if-present", + "merge": "istanbul-merge --out coverage/complete.json packages/fdc3-standard/coverage/coverage-final.json packages/fdc3-get-agent/coverage/coverage-final.json packages/fdc3-agent-proxy/coverage/coverage-final.json toolbox/fdc3-for-web/fdc3-web-impl/coverage/coverage-final.json", + "report": "nyc report --reporter json-summary --report-dir nyc-coverage-report --exclude-after-remap false --temp-dir coverage", + "lint": "npm run lint --workspaces --if-present", + "syncpack": "npm exec syncpack fix-mismatches --types 'local'", + "dev": "concurrently \"cd toolbox/fdc3-workbench && npm run dev\" \"cd toolbox/fdc3-for-web/reference-ui && npm run dev\" \"cd toolbox/fdc3-for-web/demo && npm run dev\"", + "prepare": "husky" }, "prettier": { "semi": true, @@ -42,33 +50,19 @@ "endOfLine": "auto", "printWidth": 120 }, + "dependencies": { + "syncpack": "^12.4.0" + }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.5", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "11.1.6", - "@types/jest": "29.5.12", - "@typescript-eslint/eslint-plugin": "7.1.1", - "@typescript-eslint/parser": "7.1.0", - "eslint": "8.57.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-jest": "27.9.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "husky": "^4.3.0", - "jest": "29.7.0", - "jest-environment-jsdom": "29.7.0", - "jest-mock-extended": "3.0.5", - "prettier": "3.2.5", - "quicktype": "23.0.78", - "rimraf": "^5.0.5", - "rollup": "4.22.4", - "ts-jest": "29.1.2", - "tslib": "^2.0.1", - "typescript": "^4.0.3" + "concurrently": "^8.2.2", + "eslint-config-prettier": "^9.1.0", + "husky": "^9.1.7", + "istanbul-merge": "^2.0.0", + "lint-staged": "^15.2.10", + "nyc": "17.1.0", + "prettier": "3.4.1" }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.14.1" + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" } -} +} \ No newline at end of file diff --git a/packages/fdc3-agent-proxy/cucumber.yml b/packages/fdc3-agent-proxy/cucumber.yml new file mode 100644 index 000000000..2572a0c7b --- /dev/null +++ b/packages/fdc3-agent-proxy/cucumber.yml @@ -0,0 +1,15 @@ +default: + format: + - html:cucumber-report.html + - "@cucumber/pretty-formatter" + - junit:test-results.xml + paths: + - test/features/*.feature + require: + - test/step-definitions/*.steps.ts + - test/support/*.ts + - test/world/index.ts + requireModule: + - ts-node/register + tags: "not @failing" + diff --git a/packages/fdc3-agent-proxy/eslint.config.mjs b/packages/fdc3-agent-proxy/eslint.config.mjs new file mode 100644 index 000000000..c7018a2c8 --- /dev/null +++ b/packages/fdc3-agent-proxy/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, +]; diff --git a/packages/fdc3-agent-proxy/package.json b/packages/fdc3-agent-proxy/package.json new file mode 100644 index 000000000..d249d4e66 --- /dev/null +++ b/packages/fdc3-agent-proxy/package.json @@ -0,0 +1,58 @@ +{ + "name": "@finos/fdc3-agent-proxy", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc --module es2022", + "test": "tsc && nyc --reporter=lcov --reporter=text --reporter json cucumber-js", + "clean": "rimraf dist cucumber-report.html coverage .nyc_output node_modules test-results.xml", + "lint": "eslint src/" + }, + "dependencies": { + "@finos/fdc3-standard": "2.2.0-alpha.3" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@eslint/js": "^9.16.0", + "@finos/testing": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "globals": "^15.13.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "uuid": "^9.0.1" + } +} \ No newline at end of file diff --git a/packages/fdc3-agent-proxy/src/DesktopAgentProxy.ts b/packages/fdc3-agent-proxy/src/DesktopAgentProxy.ts new file mode 100644 index 000000000..83c0f13a3 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/DesktopAgentProxy.ts @@ -0,0 +1,184 @@ +import { + AppIdentifier, + AppMetadata, + ContextHandler, + DesktopAgent, + EventHandler, + FDC3EventTypes, + ImplementationMetadata, + IntentHandler, + IntentResolution, + Listener, + LogLevel, +} from '@finos/fdc3-standard'; +import { ChannelSupport } from './channels/ChannelSupport'; +import { AppSupport } from './apps/AppSupport'; +import { IntentSupport } from './intents/IntentSupport'; +import { Connectable, Channel } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { HeartbeatSupport } from './heartbeat/HeartbeatSupport'; +import { Logger } from './util/Logger'; + +/** + * This splits out the functionality of the desktop agent into + * app, channels and intents concerns. + */ +export class DesktopAgentProxy implements DesktopAgent, Connectable { + readonly heartbeat: HeartbeatSupport; + readonly channels: ChannelSupport; + readonly intents: IntentSupport; + readonly apps: AppSupport; + readonly connectables: Connectable[]; + + constructor( + heartbeat: HeartbeatSupport, + channels: ChannelSupport, + intents: IntentSupport, + apps: AppSupport, + connectables: Connectable[], + logLevel: LogLevel | null + ) { + this.heartbeat = heartbeat; + this.intents = intents; + this.channels = channels; + this.apps = apps; + this.connectables = connectables; + //Default log level is set in the Logger utility + if (logLevel) { + Logger.setLogLevel(logLevel); + } + } + + addEventListener(type: FDC3EventTypes | null, handler: EventHandler): Promise { + switch (type) { + case 'userChannelChanged': + return this.channels.addChannelChangedEventHandler(handler); + default: + Logger.warn(`Tried to add a listener for an unknown event type: ${type}`); + return Promise.reject(new Error('UnknownEventType')); + } + } + + getInfo(): Promise { + return this.apps.getImplementationMetadata(); + } + + async broadcast(context: Context): Promise { + const channel = await this.channels.getUserChannel(); + if (channel) { + return channel.broadcast(context); + } else { + return Promise.resolve(); + } + } + + addContextListener( + contextTypeOrHandler: ContextHandler | string | null, + handler?: ContextHandler + ): Promise { + let theContextType: string | null; + let theHandler: ContextHandler; + + if (contextTypeOrHandler == null && typeof handler === 'function') { + theContextType = null; + theHandler = handler; + } else if (typeof contextTypeOrHandler === 'string' && typeof handler === 'function') { + theContextType = contextTypeOrHandler; + theHandler = handler; + } else if (typeof contextTypeOrHandler === 'function') { + // deprecated one-arg version + theContextType = null; + theHandler = contextTypeOrHandler as ContextHandler; + } else { + //invalid call + // TODO: Replace with Standardized error when #1490 is resolved + throw new Error('Invalid arguments passed to addContextListener!'); + } + + return this.channels.addContextListener(theHandler, theContextType); + } + + getUserChannels() { + return this.channels.getUserChannels(); + } + + getSystemChannels() { + return this.channels.getUserChannels(); + } + + getOrCreateChannel(channelId: string) { + return this.channels.getOrCreate(channelId); + } + + createPrivateChannel() { + return this.channels.createPrivateChannel(); + } + + leaveCurrentChannel() { + return this.channels.leaveUserChannel(); + } + + joinUserChannel(channelId: string) { + return this.channels.joinUserChannel(channelId); + } + + joinChannel(channelId: string) { + return this.channels.joinUserChannel(channelId); + } + + getCurrentChannel(): Promise { + return this.channels.getUserChannel(); + } + + findIntent(intent: string, context: Context, resultType: string | undefined) { + return this.intents.findIntent(intent, context, resultType); + } + + findIntentsByContext(context: Context) { + return this.intents.findIntentsByContext(context); + } + + private ensureAppId(app?: string | AppIdentifier): AppIdentifier | undefined { + if (typeof app === 'string') { + return { + appId: app, + }; + } else if (app?.appId) { + return app as AppIdentifier; + } else { + return undefined; + } + } + + raiseIntent(intent: string, context: Context, app?: string | AppIdentifier) { + return this.intents.raiseIntent(intent, context, this.ensureAppId(app)); + } + + addIntentListener(intent: string, handler: IntentHandler) { + return this.intents.addIntentListener(intent, handler); + } + + raiseIntentForContext(context: Context, app?: string | AppIdentifier): Promise { + return this.intents.raiseIntentForContext(context, this.ensureAppId(app)); + } + + open(app: string | AppIdentifier, context?: Context | undefined) { + return this.apps.open(this.ensureAppId(app)!, context); + } + + findInstances(app: AppIdentifier) { + return this.apps.findInstances(app); + } + + getAppMetadata(app: AppIdentifier): Promise { + return this.apps.getAppMetadata(app); + } + + async disconnect(): Promise { + await Promise.all(this.connectables.map(c => c.disconnect())); + } + + async connect(): Promise { + await Promise.all(this.connectables.map(c => c.connect())); + } +} diff --git a/packages/fdc3-agent-proxy/src/Messaging.ts b/packages/fdc3-agent-proxy/src/Messaging.ts new file mode 100644 index 000000000..dcf79e18b --- /dev/null +++ b/packages/fdc3-agent-proxy/src/Messaging.ts @@ -0,0 +1,61 @@ +import { AppIdentifier } from '@finos/fdc3-standard'; +import { RegisterableListener } from './listeners/RegisterableListener'; +import { + AppRequestMessage, + AgentResponseMessage, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export interface Messaging { + /** + * Creates UUIDs used in outgoing messages + */ + createUUID(): string; + + /** + * Post an outgoing message + */ + post(message: AppRequestMessage | WebConnectionProtocol6Goodbye): Promise; + + /** + * Registers a listener for incoming messages. + */ + register(l: RegisterableListener): void; + + /** + * Unregister a listener with the given id + * @param id + */ + unregister(id: string): void; + + /** Create a metadata element to attach to outgoing messages. */ + createMeta(): AppRequestMessage['meta']; + + /** + * Waits for a specific matching message + */ + waitFor( + filter: (m: X) => boolean, + timeoutMs?: number, + timeoutErrorMessage?: string + ): Promise; + + /** + * Sends a request message and waits for a response. If the response contains a payload.error, it is thrown. + * @param message The request message to send. + */ + exchange( + message: AppRequestMessage, + expectedTypeName: string, + timeoutMs: number + ): Promise; + + /** + * App identification used to provide source information used in + * message meta elements, IntentResolution etc.. + */ + getAppIdentifier(): AppIdentifier; + + /** Disconnects the underlying message transport. */ + disconnect(): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/apps/AppSupport.ts b/packages/fdc3-agent-proxy/src/apps/AppSupport.ts new file mode 100644 index 000000000..7a347b3f9 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/apps/AppSupport.ts @@ -0,0 +1,9 @@ +import { AppIdentifier, AppMetadata, ImplementationMetadata } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; + +export interface AppSupport { + findInstances(app: AppIdentifier): Promise>; + getAppMetadata(app: AppIdentifier): Promise; + open(app: AppIdentifier, context?: Context): Promise; + getImplementationMetadata(): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/apps/DefaultAppSupport.ts b/packages/fdc3-agent-proxy/src/apps/DefaultAppSupport.ts new file mode 100644 index 000000000..fcce781cb --- /dev/null +++ b/packages/fdc3-agent-proxy/src/apps/DefaultAppSupport.ts @@ -0,0 +1,127 @@ +import { AppIdentifier, AppMetadata, ImplementationMetadata, OpenError, ResolveError } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { AppSupport } from './AppSupport'; +import { Messaging } from '../Messaging'; +import { + FindInstancesRequest, + FindInstancesResponse, + GetAppMetadataRequest, + GetAppMetadataResponse, + GetInfoRequest, + GetInfoResponse, + OpenRequest, + OpenResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { throwIfUndefined } from '../util/throwIfUndefined'; +import { Logger } from '../util/Logger'; + +export class DefaultAppSupport implements AppSupport { + readonly messaging: Messaging; + readonly messageExchangeTimeout: number; + readonly appLaunchTimeout: number; + + constructor(messaging: Messaging, messageExchangeTimeout: number, appLaunchTimeout: number) { + this.messaging = messaging; + this.messageExchangeTimeout = messageExchangeTimeout; + this.appLaunchTimeout = appLaunchTimeout; + } + + async findInstances(app: AppIdentifier): Promise { + const request: FindInstancesRequest = { + type: 'findInstancesRequest', + payload: { + app, + }, + meta: this.messaging.createMeta(), + }; + + const out = await this.messaging.exchange( + request, + 'findInstancesResponse', + this.messageExchangeTimeout + ); + return out.payload.appIdentifiers ?? []; + } + + async getAppMetadata(app: AppIdentifier): Promise { + const request: GetAppMetadataRequest = { + type: 'getAppMetadataRequest', + payload: { + app: app as AppIdentifier, + }, + meta: this.messaging.createMeta(), + }; + + const response = await this.messaging.exchange( + request, + 'getAppMetadataResponse', + this.messageExchangeTimeout + ); + + throwIfUndefined( + response.payload.appMetadata, + 'Invalid response from Desktop Agent to getAppMetadata!', + response, + ResolveError.TargetAppUnavailable + ); + + return response.payload.appMetadata!; + } + + async open(app: AppIdentifier, context?: Context | undefined): Promise { + const request: OpenRequest = { + type: 'openRequest', + payload: { + app: { + appId: app.appId, + instanceId: app.instanceId, + }, + context, + }, + meta: this.messaging.createMeta(), + }; + + const response = await this.messaging.exchange(request, 'openResponse', this.appLaunchTimeout); + + throwIfUndefined( + response.payload.appIdentifier, + 'Invalid response from Desktop Agent to open!', + response, + OpenError.AppNotFound + ); + + return response.payload.appIdentifier!; + } + + async getImplementationMetadata(): Promise { + const request: GetInfoRequest = { + type: 'getInfoRequest', + payload: {}, + meta: this.messaging.createMeta(), + }; + + const response = await this.messaging.exchange( + request, + 'getInfoResponse', + this.messageExchangeTimeout + ); + + if (response.payload.implementationMetadata) { + return response.payload.implementationMetadata; + } else { + //This will only happen if the DA implementation returns an invalid message with a missing implementationMetadata property + Logger.error('Invalid response from Desktop Agent to open!', response); + const unknownImpl: ImplementationMetadata = { + fdc3Version: 'unknown', + provider: 'unknown', + appMetadata: { appId: 'unknown', instanceId: 'unknown' }, + optionalFeatures: { + OriginatingAppMetadata: false, + UserChannelMembershipAPIs: false, + DesktopAgentBridging: false, + }, + }; + return unknownImpl; + } + } +} diff --git a/packages/fdc3-agent-proxy/src/channels/ChannelSupport.ts b/packages/fdc3-agent-proxy/src/channels/ChannelSupport.ts new file mode 100644 index 000000000..fd35797b6 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/channels/ChannelSupport.ts @@ -0,0 +1,12 @@ +import { Channel, ContextHandler, EventHandler, Listener, PrivateChannel } from '@finos/fdc3-standard'; + +export interface ChannelSupport { + getUserChannel(): Promise; + getUserChannels(): Promise; + getOrCreate(id: string): Promise; + createPrivateChannel(): Promise; + leaveUserChannel(): Promise; + joinUserChannel(id: string): Promise; + addContextListener(handler: ContextHandler, type: string | null): Promise; + addChannelChangedEventHandler(handler: EventHandler): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/channels/DefaultChannel.ts b/packages/fdc3-agent-proxy/src/channels/DefaultChannel.ts new file mode 100644 index 000000000..2c94f5106 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/channels/DefaultChannel.ts @@ -0,0 +1,101 @@ +import { ContextHandler, DisplayMetadata, Listener, Channel } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { Messaging } from '../Messaging'; +import { DefaultContextListener } from '../listeners/DefaultContextListener'; +import { + BroadcastRequest, + BroadcastResponse, + GetCurrentContextRequest, + GetCurrentContextResponse, +} from '@finos/fdc3-schema/generated/api/BrowserTypes'; + +export class DefaultChannel implements Channel { + protected readonly messaging: Messaging; + protected readonly messageExchangeTimeout; + readonly id: string; + readonly type: 'user' | 'app' | 'private'; + readonly displayMetadata?: DisplayMetadata | undefined; + + constructor( + messaging: Messaging, + messageExchangeTimeout: number, + id: string, + type: 'user' | 'app' | 'private', + displayMetadata?: DisplayMetadata + ) { + this.messaging = messaging; + this.messageExchangeTimeout = messageExchangeTimeout; + this.id = id; + this.type = type; + this.displayMetadata = displayMetadata; + } + + async broadcast(context: Context): Promise { + const request: BroadcastRequest = { + meta: this.messaging.createMeta(), + payload: { + channelId: this.id, + context, + }, + type: 'broadcastRequest', + }; + await this.messaging.exchange(request, 'broadcastResponse', this.messageExchangeTimeout); + } + + async getCurrentContext(contextType?: string | undefined): Promise { + // first, ensure channel state is up-to-date + const request: GetCurrentContextRequest = { + meta: this.messaging.createMeta(), + payload: { + channelId: this.id, + contextType: contextType ?? null, + }, + type: 'getCurrentContextRequest', + }; + const response = await this.messaging.exchange( + request, + 'getCurrentContextResponse', + this.messageExchangeTimeout + ); + + return response.payload.context ?? null; + } + + async addContextListener( + contextTypeOrHandler: string | null | ContextHandler, + handler?: ContextHandler + ): Promise { + let theContextType: string | null; + let theHandler: ContextHandler; + + if (contextTypeOrHandler == null && typeof handler === 'function') { + theContextType = null; + theHandler = handler; + } else if (typeof contextTypeOrHandler === 'string' && typeof handler === 'function') { + theContextType = contextTypeOrHandler; + theHandler = handler; + } else if (typeof contextTypeOrHandler === 'function') { + // deprecated one-arg version + theContextType = null; + theHandler = contextTypeOrHandler as ContextHandler; + } else { + //invalid call + // TODO: Replace with Standardized error when #1490 is resolved + throw new Error('Invalid arguments passed to addContextListener!'); + } + + return await this.addContextListenerInner(theContextType, theHandler); + } + + async addContextListenerInner(contextType: string | null, theHandler: ContextHandler): Promise { + const listener = new DefaultContextListener( + this.messaging, + this.messageExchangeTimeout, + this.id, + contextType, + theHandler + ); + await listener.register(); + return listener; + } +} diff --git a/packages/fdc3-agent-proxy/src/channels/DefaultChannelSupport.ts b/packages/fdc3-agent-proxy/src/channels/DefaultChannelSupport.ts new file mode 100644 index 000000000..bea89ede9 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/channels/DefaultChannelSupport.ts @@ -0,0 +1,252 @@ +import { + Channel, + ContextHandler, + Listener, + PrivateChannel, + ChannelSelector, + EventHandler, + ChannelError, +} from '@finos/fdc3-standard'; +import { Messaging } from '../Messaging'; +import { ChannelSupport } from './ChannelSupport'; +import { DefaultPrivateChannel } from './DefaultPrivateChannel'; +import { DefaultChannel } from './DefaultChannel'; +import { DefaultContextListener } from '../listeners/DefaultContextListener'; +import { UserChannelContextListener } from '../listeners/UserChannelContextListener'; +import { EventListener } from '../listeners/EventListener'; +import { + GetCurrentChannelResponse, + GetCurrentChannelRequest, + GetUserChannelsResponse, + GetUserChannelsRequest, + GetOrCreateChannelResponse, + GetOrCreateChannelRequest, + CreatePrivateChannelResponse, + CreatePrivateChannelRequest, + LeaveCurrentChannelResponse, + LeaveCurrentChannelRequest, + JoinUserChannelResponse, + JoinUserChannelRequest, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { throwIfUndefined } from '../util/throwIfUndefined'; +import { Logger } from '../util/Logger'; + +export class DefaultChannelSupport implements ChannelSupport { + readonly messaging: Messaging; + readonly channelSelector: ChannelSelector; + readonly messageExchangeTimeout: number; + protected userChannels: Channel[] = []; + protected userChannelListeners: UserChannelContextListener[] = []; + + constructor(messaging: Messaging, channelSelector: ChannelSelector, messageExchangeTimeout: number) { + this.messaging = messaging; + this.channelSelector = channelSelector; + this.messageExchangeTimeout = messageExchangeTimeout; + this.channelSelector.setChannelChangeCallback((channelId: string | null) => { + Logger.debug('Channel selector reports channel changed: ', channelId); + if (channelId == null) { + this.leaveUserChannel(); + } else { + this.joinUserChannel(channelId); + } + }); + + this.addChannelChangedEventHandler(e => { + Logger.debug('Desktop Agent reports channel changed: ', e.details.newChannelId); + this.channelSelector.updateChannel(e.details.newChannelId, this.userChannels); + }); + } + + async addChannelChangedEventHandler(handler: EventHandler): Promise { + const listener = new EventListener(this.messaging, 'channelChangedEvent', handler); + await listener.register(); + return listener; + } + + async getUserChannel(): Promise { + const request: GetCurrentChannelRequest = { + meta: this.messaging.createMeta(), + type: 'getCurrentChannelRequest', + payload: {}, + }; + const response = await this.messaging.exchange( + request, + 'getCurrentChannelResponse', + this.messageExchangeTimeout + ); + + throwIfUndefined( + response.payload.channel, + 'Invalid response from Desktop Agent to getCurrentChannel (channel should be explicitly null if no channel is set)!', + response, + ChannelError.NoChannelFound + ); + + //handle successful responses - errors will already have been thrown by exchange above + /* istanbul ignore else */ + if (response.payload.channel) { + return new DefaultChannel( + this.messaging, + this.messageExchangeTimeout, + response.payload.channel.id, + 'user', + response.payload.channel.displayMetadata + ); + } else if (response.payload.channel === null) { + //this is a valid response if no channel is set + return null; + } else { + //Should not reach here as we will throw in exchange or throwIfNotFound + return null; + } + } + + async getUserChannels(): Promise { + const request: GetUserChannelsRequest = { + meta: this.messaging.createMeta(), + type: 'getUserChannelsRequest', + payload: {}, + }; + const response = await this.messaging.exchange( + request, + 'getUserChannelsResponse', + this.messageExchangeTimeout + ); + + //handle successful responses + const channels = response.payload.userChannels!; + this.userChannels = channels.map( + c => new DefaultChannel(this.messaging, this.messageExchangeTimeout, c.id, 'user', c.displayMetadata) + ); + return this.userChannels; + } + + async getOrCreate(id: string): Promise { + const request: GetOrCreateChannelRequest = { + meta: this.messaging.createMeta(), + type: 'getOrCreateChannelRequest', + payload: { + channelId: id, + }, + }; + const response = await this.messaging.exchange( + request, + 'getOrCreateChannelResponse', + this.messageExchangeTimeout + ); + + throwIfUndefined( + response.payload.channel, + 'Invalid response from Desktop Agent to getOrCreate!', + response, + ChannelError.CreationFailed + ); + + const out = new DefaultChannel( + this.messaging, + this.messageExchangeTimeout, + id, + 'app', + response.payload.channel!.displayMetadata + ); + return out; + } + + async createPrivateChannel(): Promise { + const request: CreatePrivateChannelRequest = { + meta: this.messaging.createMeta(), + type: 'createPrivateChannelRequest', + payload: {}, + }; + const response = await this.messaging.exchange( + request, + 'createPrivateChannelResponse', + this.messageExchangeTimeout + ); + + throwIfUndefined( + response.payload.privateChannel, + 'Invalid response from Desktop Agent to createPrivateChannel!', + response, + ChannelError.CreationFailed + ); + + return new DefaultPrivateChannel(this.messaging, this.messageExchangeTimeout, response.payload.privateChannel!.id); + } + + async leaveUserChannel(): Promise { + const request: LeaveCurrentChannelRequest = { + meta: this.messaging.createMeta(), + type: 'leaveCurrentChannelRequest', + payload: {}, + }; + await this.messaging.exchange( + request, + 'leaveCurrentChannelResponse', + this.messageExchangeTimeout + ); + this.channelSelector.updateChannel(null, this.userChannels); + for (const l of this.userChannelListeners) { + await l.changeChannel(null); + } + } + + async joinUserChannel(id: string) { + const request: JoinUserChannelRequest = { + meta: this.messaging.createMeta(), + type: 'joinUserChannelRequest', + payload: { + channelId: id, + }, + }; + await this.messaging.exchange( + request, + 'joinUserChannelResponse', + this.messageExchangeTimeout + ); + this.channelSelector.updateChannel(id, this.userChannels); + for (const l of this.userChannelListeners) { + await l.changeChannel(new DefaultChannel(this.messaging, this.messageExchangeTimeout, id, 'user')); + } + } + + async addContextListener(handler: ContextHandler, type: string | null): Promise { + /** Utility class used to wrap the DefaultContextListener and ensure it gets removed + * when its unsubscribe function is called. + */ + class UnsubscribingDefaultContextListener extends DefaultContextListener { + container: DefaultChannelSupport; + + constructor( + container: DefaultChannelSupport, + messaging: Messaging, + messageExchangeTimeout: number, + channelId: string | null, + contextType: string | null, + handler: ContextHandler, + messageType: string = 'broadcastEvent' + ) { + super(messaging, messageExchangeTimeout, channelId, contextType, handler, messageType); + this.container = container; + } + + async unsubscribe(): Promise { + super.unsubscribe(); + this.container.userChannelListeners = this.container.userChannelListeners.filter(l => l != this); + } + } + + const currentChannelId = (await this.getUserChannel())?.id ?? null; + const listener = new UnsubscribingDefaultContextListener( + this, + this.messaging, + this.messageExchangeTimeout, + currentChannelId, + type, + handler + ); + this.userChannelListeners.push(listener); + await listener.register(); + return listener; + } +} diff --git a/packages/fdc3-agent-proxy/src/channels/DefaultPrivateChannel.ts b/packages/fdc3-agent-proxy/src/channels/DefaultPrivateChannel.ts new file mode 100644 index 000000000..5b95a9da6 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/channels/DefaultPrivateChannel.ts @@ -0,0 +1,123 @@ +import { + ApiEvent, + ContextHandler, + EventHandler, + Listener, + PrivateChannel, + PrivateChannelEventTypes, +} from '@finos/fdc3-standard'; +import { DefaultChannel } from './DefaultChannel'; +import { Messaging } from '../Messaging'; +import { + PrivateChannelNullEventListener, + PrivateChannelAddContextEventListener, + PrivateChannelDisconnectEventListener, + PrivateChannelUnsubscribeEventListener, +} from '../listeners/PrivateChannelEventListener'; +import { DefaultContextListener } from '../listeners/DefaultContextListener'; +import { RegisterableListener } from '../listeners/RegisterableListener'; +import { + PrivateChannelDisconnectRequest, + PrivateChannelDisconnectResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class DefaultPrivateChannel extends DefaultChannel implements PrivateChannel { + constructor(messaging: Messaging, messageExchangeTimeout: number, id: string) { + super(messaging, messageExchangeTimeout, id, 'private'); + } + + async addEventListener(type: PrivateChannelEventTypes | null, handler: EventHandler): Promise { + let a: RegisterableListener; + switch (type) { + case 'addContextListener': + a = new PrivateChannelAddContextEventListener(this.messaging, this.messageExchangeTimeout, this.id, handler); + break; + case 'unsubscribe': + a = new PrivateChannelUnsubscribeEventListener(this.messaging, this.messageExchangeTimeout, this.id, handler); + break; + case 'disconnect': + a = new PrivateChannelDisconnectEventListener(this.messaging, this.messageExchangeTimeout, this.id, handler); + break; + case null: + a = new PrivateChannelNullEventListener(this.messaging, this.messageExchangeTimeout, this.id, handler); + break; + default: + throw new Error('Unsupported event type: ' + type); + } + await a.register(); + return a; + } + + //implementations of the deprecated listener functions + onAddContextListener(handler: (contextType?: string) => void): Listener { + //Adapt handler type for differences between addEventListener and onAddContextListener handler types + const adaptorHandler: EventHandler = (event: ApiEvent) => { + handler(event.details.contextType ?? undefined); + }; + const l = new PrivateChannelAddContextEventListener( + this.messaging, + this.messageExchangeTimeout, + this.id, + adaptorHandler + ); + l.register(); + return l; + } + + onUnsubscribe(handler: (contextType?: string) => void): Listener { + //Adapt handler type for differences between addEventListener and onUnsubscribeListener handler types + const adaptorHandler: EventHandler = (event: ApiEvent) => { + handler(event.details.contextType ?? undefined); + }; + const l = new PrivateChannelUnsubscribeEventListener( + this.messaging, + this.messageExchangeTimeout, + this.id, + adaptorHandler + ); + l.register(); + return l; + } + + onDisconnect(handler: () => void): Listener { + //Adapt handler type for differences between addEventListener and onDisconnectListener handler types + const adaptorHandler: EventHandler = () => { + handler(); + }; + const l = new PrivateChannelDisconnectEventListener( + this.messaging, + this.messageExchangeTimeout, + this.id, + adaptorHandler + ); + l.register(); + return l; + } + + async disconnect(): Promise { + const msg: PrivateChannelDisconnectRequest = { + meta: this.messaging.createMeta(), + payload: { + channelId: this.id, + }, + type: 'privateChannelDisconnectRequest', + }; + await this.messaging.exchange( + msg, + 'privateChannelDisconnectResponse', + this.messageExchangeTimeout + ); + } + + async addContextListenerInner(contextType: string | null, theHandler: ContextHandler): Promise { + const listener = new DefaultContextListener( + this.messaging, + this.messageExchangeTimeout, + this.id, + contextType, + theHandler + ); + await listener.register(); + return listener; + } +} diff --git a/packages/fdc3-agent-proxy/src/heartbeat/DefaultHeartbeatSupport.ts b/packages/fdc3-agent-proxy/src/heartbeat/DefaultHeartbeatSupport.ts new file mode 100644 index 000000000..17e76e040 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/heartbeat/DefaultHeartbeatSupport.ts @@ -0,0 +1,25 @@ +import { HeartbeatListener } from '../listeners/HeartbeatListener'; +import { Messaging } from '../Messaging'; +import { HeartbeatSupport } from './HeartbeatSupport'; + +/** + * Handles disconnection and heartbeats for the proxy. + */ +export class DefaultHeartbeatSupport implements HeartbeatSupport { + readonly messaging: Messaging; + private heartbeatListener: HeartbeatListener | null = null; + + constructor(messaging: Messaging) { + this.messaging = messaging; + } + + async connect(): Promise { + this.heartbeatListener = new HeartbeatListener(this.messaging); + this.heartbeatListener.register(); + } + + async disconnect(): Promise { + await this.heartbeatListener?.unsubscribe(); + return this.messaging.disconnect(); + } +} diff --git a/packages/fdc3-agent-proxy/src/heartbeat/HeartbeatSupport.ts b/packages/fdc3-agent-proxy/src/heartbeat/HeartbeatSupport.ts new file mode 100644 index 000000000..8d302389d --- /dev/null +++ b/packages/fdc3-agent-proxy/src/heartbeat/HeartbeatSupport.ts @@ -0,0 +1,4 @@ +import { Connectable } from '@finos/fdc3-standard'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface HeartbeatSupport extends Connectable { } diff --git a/packages/fdc3-agent-proxy/src/index.ts b/packages/fdc3-agent-proxy/src/index.ts new file mode 100644 index 000000000..df1207355 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/index.ts @@ -0,0 +1,31 @@ +import { DesktopAgentProxy } from './DesktopAgentProxy'; +import { Messaging } from './Messaging'; +import { AbstractMessaging } from './messaging/AbstractMessaging'; +import { DefaultChannel } from './channels/DefaultChannel'; +import { ChannelSupport } from './channels/ChannelSupport'; +import { DefaultIntentSupport } from './intents/DefaultIntentSupport'; +import { DefaultChannelSupport } from './channels/DefaultChannelSupport'; +import { IntentSupport } from './intents/IntentSupport'; +import { RegisterableListener } from './listeners/RegisterableListener'; +import { DefaultAppSupport } from './apps/DefaultAppSupport'; +import { AppSupport } from './apps/AppSupport'; +import { DefaultHeartbeatSupport } from './heartbeat/DefaultHeartbeatSupport'; +import { Connectable } from '@finos/fdc3-standard'; +import { AbstractFDC3Logger } from './util/AbstractFDC3Logger'; + +export { + type Messaging, + AbstractMessaging, + DesktopAgentProxy, + DefaultChannel, + type AppSupport, + type IntentSupport, + type ChannelSupport, + DefaultAppSupport, + DefaultChannelSupport, + DefaultIntentSupport, + DefaultHeartbeatSupport, + RegisterableListener, + Connectable, + AbstractFDC3Logger, +}; diff --git a/packages/fdc3-agent-proxy/src/intents/DefaultIntentResolution.ts b/packages/fdc3-agent-proxy/src/intents/DefaultIntentResolution.ts new file mode 100644 index 000000000..c165ccdcf --- /dev/null +++ b/packages/fdc3-agent-proxy/src/intents/DefaultIntentResolution.ts @@ -0,0 +1,20 @@ +import { AppIdentifier, IntentResolution, IntentResult } from '@finos/fdc3-standard'; +import { Messaging } from '../Messaging'; + +export class DefaultIntentResolution implements IntentResolution { + readonly messaging: Messaging; + readonly source: AppIdentifier; + readonly intent: string; + readonly result: Promise; + + constructor(messaging: Messaging, result: Promise, source: AppIdentifier, intent: string) { + this.messaging = messaging; + this.result = result; + this.source = source; + this.intent = intent; + } + + getResult(): Promise { + return this.result; + } +} diff --git a/packages/fdc3-agent-proxy/src/intents/DefaultIntentSupport.ts b/packages/fdc3-agent-proxy/src/intents/DefaultIntentSupport.ts new file mode 100644 index 000000000..71111b8f4 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/intents/DefaultIntentSupport.ts @@ -0,0 +1,224 @@ +import { + AppIntent, + AppIdentifier, + IntentResolution, + IntentHandler, + Listener, + ResolveError, + IntentResult, + IntentResolver, + IntentResolutionChoice, +} from '@finos/fdc3-standard'; +import { IntentSupport } from './IntentSupport'; +import { Messaging } from '../Messaging'; +import { DefaultIntentResolution } from './DefaultIntentResolution'; +import { DefaultIntentListener } from '../listeners/DefaultIntentListener'; +import { DefaultChannel } from '../channels/DefaultChannel'; +import { DefaultPrivateChannel } from '../channels/DefaultPrivateChannel'; +import { Context } from '@finos/fdc3-context'; +import { + FindIntentRequest, + FindIntentResponse, + FindIntentsByContextRequest, + FindIntentsByContextResponse, + RaiseIntentForContextRequest, + RaiseIntentForContextResponse, + RaiseIntentRequest, + RaiseIntentResponse, + RaiseIntentResultResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { throwIfUndefined } from '../util/throwIfUndefined'; + +const convertIntentResult = async ( + { payload }: RaiseIntentResultResponse, + messaging: Messaging, + messageExchangeTimeout: number +): Promise => { + const result = payload.intentResult; + if (result?.channel) { + const { channel } = result; + switch (channel.type) { + case 'private': { + return new DefaultPrivateChannel(messaging, messageExchangeTimeout, channel.id); + } + case 'app': + case 'user': + default: { + return new DefaultChannel(messaging, messageExchangeTimeout, channel.id, channel.type, channel.displayMetadata); + } + } + } else if (result?.context) { + return result.context; + } else { + return; + } +}; + +export class DefaultIntentSupport implements IntentSupport { + readonly messaging: Messaging; + readonly intentResolver: IntentResolver; + readonly messageExchangeTimeout: number; + readonly appLaunchTimeout: number; + + constructor( + messaging: Messaging, + intentResolver: IntentResolver, + messageExchangeTimeout: number, + appLaunchTimeout: number + ) { + this.messaging = messaging; + this.intentResolver = intentResolver; + this.messageExchangeTimeout = messageExchangeTimeout; + this.appLaunchTimeout = appLaunchTimeout; + } + + async findIntent(intent: string, context: Context, resultType: string | undefined): Promise { + const request: FindIntentRequest = { + type: 'findIntentRequest', + payload: { + intent, + context, + resultType, + }, + meta: this.messaging.createMeta(), + }; + + const result = await this.messaging.exchange( + request, + 'findIntentResponse', + this.messageExchangeTimeout + ); + const appIntent = result.payload.appIntent!; + if (appIntent.apps.length == 0) { + throw new Error(ResolveError.NoAppsFound); + } else { + return { + intent: appIntent.intent, + apps: appIntent.apps, + }; + } + } + + async findIntentsByContext(context: Context): Promise { + const request: FindIntentsByContextRequest = { + type: 'findIntentsByContextRequest', + payload: { + context, + }, + meta: this.messaging.createMeta(), + }; + + const result: FindIntentsByContextResponse = await this.messaging.exchange( + request, + 'findIntentsByContextResponse', + this.messageExchangeTimeout + ); + const appIntents = result.payload.appIntents; + if (!appIntents || appIntents.length == 0) { + throw new Error(ResolveError.NoAppsFound); + } else { + return appIntents; + } + } + + private async createResultPromise(request: RaiseIntentRequest | RaiseIntentForContextRequest): Promise { + const rp = await this.messaging.waitFor( + m => m.type == 'raiseIntentResultResponse' && m.meta.requestUuid == request.meta.requestUuid + ); + + const ir = await convertIntentResult(rp, this.messaging, this.messageExchangeTimeout); + return ir; + } + + async raiseIntent(intent: string, context: Context, app: AppIdentifier): Promise { + const meta = this.messaging.createMeta(); + const request: RaiseIntentRequest = { + type: 'raiseIntentRequest', + payload: { + intent, + context, + app: app, + }, + meta: meta, + }; + + const resultPromise = this.createResultPromise(request); + const response = await this.messaging.exchange( + request, + 'raiseIntentResponse', + this.appLaunchTimeout + ); + + throwIfUndefined( + response.payload.appIntent ?? response.payload.intentResolution, + 'Invalid response from Desktop Agent to raiseIntent, either payload.appIntent or payload.intentResolution must be set!', + response, + ResolveError.NoAppsFound + ); + + if (response.payload.appIntent) { + // Needs further resolution, we need to invoke the resolver + const result: IntentResolutionChoice | void = await this.intentResolver.chooseIntent( + [response.payload.appIntent], + context + ); + if (result) { + return this.raiseIntent(intent, context, result.appId); + } else { + throw new Error(ResolveError.UserCancelled); + } + } else { + // Was resolved + const details = response.payload.intentResolution!; + return new DefaultIntentResolution(this.messaging, resultPromise, details.source, details.intent); + } + } + + async raiseIntentForContext(context: Context, app?: AppIdentifier | undefined): Promise { + const request: RaiseIntentForContextRequest = { + type: 'raiseIntentForContextRequest', + payload: { + context, + app: app, + }, + meta: this.messaging.createMeta(), + }; + + const resultPromise = this.createResultPromise(request); + const response = await this.messaging.exchange( + request, + 'raiseIntentForContextResponse', + this.appLaunchTimeout + ); + + throwIfUndefined( + response.payload.appIntents ?? response.payload.intentResolution, + 'Invalid response from Desktop Agent to raiseIntentForContext, either payload.appIntents or payload.intentResolution must be set!', + response, + ResolveError.NoAppsFound + ); + + if (response.payload.appIntents) { + // Needs further resolution, we need to invoke the resolver + const result: IntentResolutionChoice | void = await this.intentResolver.chooseIntent( + response.payload.appIntents, + context + ); + if (result) { + return this.raiseIntent(result.intent, context, result.appId); + } else { + throw new Error(ResolveError.UserCancelled); + } + } else { + // Was resolved + const details = response.payload.intentResolution!; + return new DefaultIntentResolution(this.messaging, resultPromise, details.source, details.intent); + } + } + + async addIntentListener(intent: string, handler: IntentHandler): Promise { + const out = new DefaultIntentListener(this.messaging, intent, handler, this.messageExchangeTimeout); + await out.register(); + return out; + } +} diff --git a/packages/fdc3-agent-proxy/src/intents/IntentSupport.ts b/packages/fdc3-agent-proxy/src/intents/IntentSupport.ts new file mode 100644 index 000000000..9069ca0d0 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/intents/IntentSupport.ts @@ -0,0 +1,10 @@ +import { AppIdentifier, AppIntent, IntentHandler, IntentResolution, Listener } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; + +export interface IntentSupport { + findIntent(intent: string, context: Context, resultType: string | undefined): Promise; + findIntentsByContext(context: Context): Promise; + raiseIntent(intent: string, context: Context, app?: AppIdentifier): Promise; + raiseIntentForContext(context: Context, app?: AppIdentifier): Promise; + addIntentListener(intent: string, handler: IntentHandler): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/listeners/AbstractListener.ts b/packages/fdc3-agent-proxy/src/listeners/AbstractListener.ts new file mode 100644 index 000000000..44e69a265 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/AbstractListener.ts @@ -0,0 +1,132 @@ +import { + AgentEventMessage, + AddContextListenerRequest, + AddIntentListenerRequest, + AddEventListenerRequest, + PrivateChannelAddEventListenerRequest, + AddIntentListenerResponse, + AddContextListenerResponse, + AddEventListenerResponse, + ContextListenerUnsubscribeRequest, + IntentListenerUnsubscribeRequest, + EventListenerUnsubscribeRequest, + PrivateChannelAddEventListenerResponse, + PrivateChannelUnsubscribeEventListenerRequest, + ContextListenerUnsubscribeResponse, + IntentListenerUnsubscribeResponse, + EventListenerUnsubscribeResponse, + PrivateChannelUnsubscribeEventListenerResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Messaging } from '../Messaging'; +import { RegisterableListener } from './RegisterableListener'; +import { throwIfUndefined } from '../util/throwIfUndefined'; +import { ChannelError } from '@finos/fdc3-standard'; + +type SubscriptionRequest = + | AddContextListenerRequest + | AddIntentListenerRequest + | AddEventListenerRequest + | PrivateChannelAddEventListenerRequest; +type SubscriptionResponse = + | AddContextListenerResponse + | AddIntentListenerResponse + | AddEventListenerResponse + | PrivateChannelAddEventListenerResponse; +type UnsubscribeRequest = + | ContextListenerUnsubscribeRequest + | IntentListenerUnsubscribeRequest + | EventListenerUnsubscribeRequest + | PrivateChannelUnsubscribeEventListenerRequest; +type UnsubscribeResponse = + | ContextListenerUnsubscribeResponse + | IntentListenerUnsubscribeResponse + | EventListenerUnsubscribeResponse + | PrivateChannelUnsubscribeEventListenerResponse; + +/** + * Common to all listeners - they need to be registered and unregistered with messaging and also + * send notification messages when connected and disconnected + */ +export abstract class AbstractListener implements RegisterableListener { + readonly messaging: Messaging; + readonly messageExchangeTimeout: number; + private readonly subscribeRequestType: Y['type']; + private readonly subscribeResponseType: SubscriptionResponse['type']; + private readonly unsubscribeRequestType: UnsubscribeRequest['type']; + private readonly unsubscribeResponseType: UnsubscribeResponse['type']; + private readonly subscriptionPayload: Y['payload']; + id: string | null = null; + readonly handler: X; + + constructor( + messaging: Messaging, + messageExchangeTimeout: number, + subscriptionPayload: Y['payload'], + handler: X, + subscribeRequestType: Y['type'], + subscribeResponseType: SubscriptionResponse['type'], + unsubscribeRequestType: UnsubscribeRequest['type'], + unsubscribeResponseType: UnsubscribeResponse['type'] + ) { + this.messaging = messaging; + this.messageExchangeTimeout = messageExchangeTimeout; + this.handler = handler; + this.subscriptionPayload = subscriptionPayload; + this.subscribeRequestType = subscribeRequestType; + this.subscribeResponseType = subscribeResponseType; + this.unsubscribeRequestType = unsubscribeRequestType; + this.unsubscribeResponseType = unsubscribeResponseType; + } + + abstract filter(m: AgentEventMessage): boolean; + + abstract action(m: AgentEventMessage): void; + + async unsubscribe(): Promise { + /* istanbul ignore else */ + if (this.id) { + this.messaging.unregister(this.id); + const unsubscribeMessage: UnsubscribeRequest = { + meta: this.messaging.createMeta(), + payload: { + listenerUUID: this.id, + }, + type: this.unsubscribeRequestType, + }; + await this.messaging.exchange( + unsubscribeMessage, + this.unsubscribeResponseType, + this.messageExchangeTimeout + ); + return; + } else { + //should never happen as we throw on creating a listener without an ID + throw new Error("This listener doesn't have an id and hence can't be removed!"); + } + } + + async register(): Promise { + const subscribeMessage: Y = { + meta: this.messaging.createMeta() as Y['meta'], + payload: this.subscriptionPayload as Y['payload'], + type: this.subscribeRequestType as Y['type'], + } as Y; + + const response = await this.messaging.exchange( + subscribeMessage, + this.subscribeResponseType, + this.messageExchangeTimeout + ); + this.id = response?.payload?.listenerUUID ?? null; + + //coalesce so that nullish values become undefined + throwIfUndefined( + this.id ?? undefined, + "The Desktop Agent's response did not include a listenerUUID, which will mean this listener can't be removed!", + response, + ChannelError.CreationFailed + ); + + this.messaging.register(this); + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/DefaultContextListener.ts b/packages/fdc3-agent-proxy/src/listeners/DefaultContextListener.ts new file mode 100644 index 000000000..1df4c3071 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/DefaultContextListener.ts @@ -0,0 +1,62 @@ +import { ContextHandler, Channel } from '@finos/fdc3-standard'; +import { Messaging } from '../Messaging'; +import { AbstractListener } from './AbstractListener'; +import { UserChannelContextListener } from './UserChannelContextListener'; +import { AddContextListenerRequest, BroadcastEvent } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class DefaultContextListener + extends AbstractListener + implements UserChannelContextListener +{ + private channelId: string | null; + private readonly messageType: string; + private readonly contextType: string | null; + + constructor( + messaging: Messaging, + messageExchangeTimeout: number, + channelId: string | null, + contextType: string | null, + handler: ContextHandler, + messageType: string = 'broadcastEvent' + ) { + super( + messaging, + messageExchangeTimeout, + { channelId, contextType }, + handler, + 'addContextListenerRequest', + 'addContextListenerResponse', + 'contextListenerUnsubscribeRequest', + 'contextListenerUnsubscribeResponse' + ); + this.channelId = channelId; + this.messageType = messageType; + this.contextType = contextType; + } + + async changeChannel(channel: Channel | null): Promise { + if (channel == null) { + this.channelId = null; + return; + } else { + this.channelId = channel.id; + const context = await channel.getCurrentContext(this.contextType ?? undefined); + if (context) { + this.handler(context); + } + } + } + + filter(m: BroadcastEvent): boolean { + return ( + m.type == this.messageType && + m.payload.channelId == this.channelId && + (m.payload.context?.type == this.contextType || this.contextType == null) + ); + } + + action(m: BroadcastEvent): void { + this.handler(m.payload.context); + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/DefaultIntentListener.ts b/packages/fdc3-agent-proxy/src/listeners/DefaultIntentListener.ts new file mode 100644 index 000000000..0e71bc2ed --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/DefaultIntentListener.ts @@ -0,0 +1,103 @@ +import { IntentHandler, IntentResult, AppIdentifier } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { Messaging } from '../Messaging'; +import { AbstractListener } from './AbstractListener'; +import { + AddIntentListenerRequest, + IntentEvent, + IntentResultRequest, + IntentResultResponse, + //RaiseIntentResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class DefaultIntentListener extends AbstractListener { + readonly intent: string; + + constructor(messaging: Messaging, intent: string, action: IntentHandler, messageExchangeTimeout: number) { + super( + messaging, + messageExchangeTimeout, + { intent }, + action, + 'addIntentListenerRequest', + 'addIntentListenerResponse', + 'intentListenerUnsubscribeRequest', + 'intentListenerUnsubscribeResponse' + ); + this.intent = intent; + } + + filter(m: IntentEvent): boolean { + return m.type == 'intentEvent' && m.payload.intent == this.intent; + } + + action(m: IntentEvent): void { + const done = this.handler(m.payload.context, { + source: m.payload.originatingApp as AppIdentifier, + }); + + this.handleIntentResult(done, m); + } + + private intentResultRequestMessage(ir: IntentResult, m: IntentEvent): IntentResultRequest { + const out: IntentResultRequest = { + type: 'intentResultRequest', + meta: { + requestUuid: m.meta.eventUuid, + timestamp: new Date(), + }, + payload: { + intentResult: convertIntentResult(ir), + intentEventUuid: m.meta.eventUuid, + raiseIntentRequestUuid: m.payload.raiseIntentRequestUuid, + }, + }; + + return out; + } + + private handleIntentResult(done: Promise | void, m: IntentEvent) { + if (done == null) { + // send an empty intent result response + return this.messaging.exchange( + this.intentResultRequestMessage(undefined, m), + 'intentResultResponse', + this.messageExchangeTimeout + ); + } else { + // respond after promise completes + return done.then(ir => { + return this.messaging.exchange( + this.intentResultRequestMessage(ir, m), + 'intentResultResponse', + this.messageExchangeTimeout + ); + }); + } + } +} + +function convertIntentResult(intentResult: IntentResult): IntentResultRequest['payload']['intentResult'] { + if (!intentResult) { + //consider any falsy result to be void... + return {}; // void result + } + switch (intentResult.type) { + case 'user': + case 'app': + case 'private': + // it's a channel + return { + channel: { + type: intentResult.type, + id: intentResult.id as string, + displayMetadata: intentResult.displayMetadata, + }, + }; + default: + // it's a context + return { + context: intentResult as Context, + }; + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/EventListener.ts b/packages/fdc3-agent-proxy/src/listeners/EventListener.ts new file mode 100644 index 000000000..99789cdaa --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/EventListener.ts @@ -0,0 +1,39 @@ +import { ApiEvent, EventHandler } from '@finos/fdc3-standard'; +import { Messaging } from '../Messaging'; +import { RegisterableListener } from './RegisterableListener'; +import { AgentEventMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class EventListener implements RegisterableListener { + readonly id: string; + readonly messaging: Messaging; + readonly type: string; + readonly handler: EventHandler; + + constructor(messaging: Messaging, type: string, handler: EventHandler) { + this.id = type + '-' + messaging.createUUID(); + this.messaging = messaging; + this.type = type; + this.handler = handler; + } + + filter(m: AgentEventMessage): boolean { + return m.type === this.type; + } + + action(m: AgentEventMessage): void { + if (m.type === this.type) { + this.handler({ + type: this.type, + details: m.payload, + } as ApiEvent); + } + } + + async register(): Promise { + this.messaging.register(this); + } + + async unsubscribe(): Promise { + this.messaging.unregister(this.id); + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/HeartbeatListener.ts b/packages/fdc3-agent-proxy/src/listeners/HeartbeatListener.ts new file mode 100644 index 000000000..90cbfb550 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/HeartbeatListener.ts @@ -0,0 +1,45 @@ +import { + AgentEventMessage, + HeartbeatAcknowledgementRequest, + HeartbeatEvent, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Messaging } from '../Messaging'; +import { RegisterableListener } from './RegisterableListener'; +import { Logger } from '../util/Logger'; + +export class HeartbeatListener implements RegisterableListener { + readonly id: string; + readonly messaging: Messaging; + + constructor(messaging: Messaging) { + this.id = 'heartbeat-' + messaging.createUUID(); + this.messaging = messaging; + } + + filter(m: AgentEventMessage): boolean { + return m.type === 'heartbeatEvent'; + } + + action(_m: AgentEventMessage): void { + Logger.debug('Responding to heartbeat request', _m); + const request: HeartbeatAcknowledgementRequest = { + type: 'heartbeatAcknowledgementRequest', + meta: { + requestUuid: this.messaging.createUUID(), + timestamp: new Date(), + }, + payload: { + heartbeatEventUuid: (_m as HeartbeatEvent).meta.eventUuid, + }, + }; + this.messaging.post(request); + } + + async register(): Promise { + this.messaging.register(this); + } + + async unsubscribe(): Promise { + this.messaging.unregister(this.id); + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/PrivateChannelEventListener.ts b/packages/fdc3-agent-proxy/src/listeners/PrivateChannelEventListener.ts new file mode 100644 index 000000000..ea790ff5a --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/PrivateChannelEventListener.ts @@ -0,0 +1,184 @@ +import { Messaging } from '../Messaging'; +import { AbstractListener } from './AbstractListener'; +import { + ApiEvent, + EventHandler, + PrivateChannelAddContextListenerEvent, + PrivateChannelDisconnectEvent, + PrivateChannelEvent, + PrivateChannelEventTypes, + PrivateChannelUnsubscribeEvent, +} from '@finos/fdc3-standard'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { Logger } from '../util/Logger'; +const { + isPrivateChannelOnAddContextListenerEvent, + isPrivateChannelOnDisconnectEvent, + isPrivateChannelOnUnsubscribeEvent, +} = BrowserTypes; +type PrivateChannelAddEventListenerRequest = BrowserTypes.PrivateChannelAddEventListenerRequest; +type PrivateChannelOnAddContextListenerEvent = BrowserTypes.PrivateChannelOnAddContextListenerEvent; +type PrivateChannelOnDisconnectEvent = BrowserTypes.PrivateChannelOnDisconnectEvent; +type PrivateChannelOnUnsubscribeEvent = BrowserTypes.PrivateChannelOnUnsubscribeEvent; + +type PrivateChannelEventMessages = + | PrivateChannelOnAddContextListenerEvent + | PrivateChannelOnUnsubscribeEvent + | PrivateChannelOnDisconnectEvent; +type PrivateChannelEventMessageTypes = PrivateChannelEventMessages['type']; + +abstract class AbstractPrivateChannelEventListener extends AbstractListener< + (msg: PrivateChannelEventMessages) => void, + PrivateChannelAddEventListenerRequest +> { + readonly privateChannelId: string; + readonly eventMessageTypes: PrivateChannelEventMessageTypes[]; + + constructor( + messaging: Messaging, + messageExchangeTimeout: number, + privateChannelId: string, + eventMessageTypes: PrivateChannelEventMessageTypes[], + eventType: PrivateChannelEventTypes | null, + handler: (msg: PrivateChannelEventMessages) => void + ) { + super( + messaging, + messageExchangeTimeout, + { privateChannelId, listenerType: eventType }, + handler, + 'privateChannelAddEventListenerRequest', + 'privateChannelAddEventListenerResponse', + 'privateChannelUnsubscribeEventListenerRequest', + 'privateChannelUnsubscribeEventListenerResponse' + ); + this.privateChannelId = privateChannelId; + this.eventMessageTypes = eventMessageTypes; + } + + filter(m: PrivateChannelEventMessages): boolean { + return this.eventMessageTypes.includes(m.type) && this.privateChannelId == m.payload.privateChannelId; + } + + action(m: PrivateChannelEventMessages): void { + this.handler(m); + } +} + +export class PrivateChannelNullEventListener extends AbstractPrivateChannelEventListener { + constructor(messaging: Messaging, messageExchangeTimeout: number, channelId: string, handler: EventHandler) { + const wrappedHandler = (msg: PrivateChannelEventMessages) => { + let type: PrivateChannelEventTypes; + let details: + | PrivateChannelAddContextListenerEvent['details'] + | PrivateChannelUnsubscribeEvent['details'] + | PrivateChannelDisconnectEvent['details']; + switch (msg.type) { + case 'privateChannelOnAddContextListenerEvent': + type = 'addContextListener'; + details = { contextType: msg.payload.contextType }; + break; + case 'privateChannelOnUnsubscribeEvent': + type = 'unsubscribe'; + details = { contextType: msg.payload.contextType }; + break; + case 'privateChannelOnDisconnectEvent': + type = 'disconnect'; + details = null; + break; + } + + const event: PrivateChannelEvent = { + type, + details, + }; + handler(event); + }; + + super( + messaging, + messageExchangeTimeout, + channelId, + [ + 'privateChannelOnAddContextListenerEvent', + 'privateChannelOnUnsubscribeEvent', + 'privateChannelOnDisconnectEvent', + ], + 'addContextListener', + wrappedHandler + ); + } +} + +export class PrivateChannelDisconnectEventListener extends AbstractPrivateChannelEventListener { + constructor(messaging: Messaging, messageExchangeTimeout: number, channelId: string, handler: EventHandler) { + const wrappedHandler = (msg: PrivateChannelEventMessages) => { + if (isPrivateChannelOnDisconnectEvent(msg)) { + const event: PrivateChannelDisconnectEvent = { + type: 'disconnect', + details: null, + }; + handler(event); + } else { + Logger.error('PrivateChannelDisconnectEventListener was called for a different message type!', msg); + } + }; + + super( + messaging, + messageExchangeTimeout, + channelId, + ['privateChannelOnDisconnectEvent'], + 'disconnect', + wrappedHandler + ); + } +} + +export class PrivateChannelAddContextEventListener extends AbstractPrivateChannelEventListener { + constructor(messaging: Messaging, messageExchangeTimeout: number, channelId: string, handler: EventHandler) { + const wrappedHandler = (msg: PrivateChannelEventMessages) => { + if (isPrivateChannelOnAddContextListenerEvent(msg)) { + const event: ApiEvent = { + type: 'addContextListener', + details: { contextType: msg.payload.contextType }, + }; + handler(event); + } else { + Logger.error('PrivateChannelAddContextEventListener was called for a different message type!', msg); + } + }; + super( + messaging, + messageExchangeTimeout, + channelId, + ['privateChannelOnAddContextListenerEvent'], + 'addContextListener', + wrappedHandler + ); + } +} + +export class PrivateChannelUnsubscribeEventListener extends AbstractPrivateChannelEventListener { + constructor(messaging: Messaging, messageExchangeTimeout: number, channelId: string, handler: EventHandler) { + const wrappedHandler = (msg: PrivateChannelEventMessages) => { + if (isPrivateChannelOnUnsubscribeEvent(msg)) { + const event: ApiEvent = { + type: 'unsubscribe', + details: { contextType: msg.payload.contextType }, + }; + handler(event); + } else { + Logger.error('PrivateChannelUnsubscribeEventListener was called for a different message type!', msg); + } + }; + super( + messaging, + messageExchangeTimeout, + channelId, + ['privateChannelOnUnsubscribeEvent'], + 'unsubscribe', + wrappedHandler + ); + } +} diff --git a/packages/fdc3-agent-proxy/src/listeners/RegisterableListener.ts b/packages/fdc3-agent-proxy/src/listeners/RegisterableListener.ts new file mode 100644 index 000000000..68ee3ba31 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/RegisterableListener.ts @@ -0,0 +1,17 @@ +import { AgentEventMessage, AgentResponseMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Listener } from '@finos/fdc3-standard'; + +/** + * Extends the basic concept of FDC3 listeners to include lifecycle methods. + * All fdc3-agent-proxy listeners implement this interface and should be + * initialized with the register() method before use. + */ +export interface RegisterableListener extends Listener { + id: string | null; + filter(m: AgentEventMessage | AgentResponseMessage): boolean; + action(m: AgentEventMessage | AgentResponseMessage): void; + /** + * Listeners need to be registered in order to set their IDs. + */ + register(): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/listeners/UserChannelContextListener.ts b/packages/fdc3-agent-proxy/src/listeners/UserChannelContextListener.ts new file mode 100644 index 000000000..2ec87e877 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/listeners/UserChannelContextListener.ts @@ -0,0 +1,16 @@ +import { Channel, Listener } from '@finos/fdc3-standard'; +import { RegisterableListener } from './RegisterableListener'; + +/** + * This is a special version of a ContextListener created when the user calls the + * fdc3.addContextListener method. In this scenario, the listener will respond to broadcasts + * on whatever is the current user channel. + */ +export interface UserChannelContextListener extends Listener, RegisterableListener { + /** + * This method is called when the user channel changes. The listener should then + * call it's handler with the latest piece of relevant channel state and start responding to + * events on the new channelId. + */ + changeChannel(ch: Channel | null): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/messaging/AbstractMessaging.ts b/packages/fdc3-agent-proxy/src/messaging/AbstractMessaging.ts new file mode 100644 index 000000000..63e70b12f --- /dev/null +++ b/packages/fdc3-agent-proxy/src/messaging/AbstractMessaging.ts @@ -0,0 +1,105 @@ +import { AgentError, AppIdentifier } from '@finos/fdc3-standard'; +import { Messaging } from '../Messaging'; +import { RegisterableListener } from '../listeners/RegisterableListener'; +import { + AgentResponseMessage, + AppRequestMessage, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Logger } from '../util/Logger'; + +export abstract class AbstractMessaging implements Messaging { + private appIdentifier: AppIdentifier; + + abstract createUUID(): string; + abstract post(message: AppRequestMessage | WebConnectionProtocol6Goodbye): Promise; + abstract register(l: RegisterableListener): void; + abstract unregister(id: string): void; + abstract createMeta(): AppRequestMessage['meta']; + + constructor(appIdentifier: AppIdentifier) { + this.appIdentifier = appIdentifier; + } + + waitFor( + filter: (m: X) => boolean, + timeoutMs?: number, + timeoutErrorMessage?: string + ): Promise { + const id = this.createUUID(); + return new Promise((resolve, reject) => { + let done = false; + let timeout: NodeJS.Timeout | null = null; + const l: RegisterableListener = { + id, + filter: filter, + action: m => { + Logger.debug('Received from DesktopAgent: ', m); + done = true; + this.unregister(id); + if (timeout) { + clearTimeout(timeout); + } + resolve(m as X); + }, + register: async () => { + this.register(l); + }, + unsubscribe: async () => { + this.unregister(id); + }, + }; + + this.register(l); + + if (timeoutMs) { + timeout = setTimeout(() => { + this.unregister(id); + if (!done) { + Logger.error( + `waitFor rejecting after ${timeoutMs}ms at ${new Date().toISOString()} with ${timeoutErrorMessage}` + ); + reject(new Error(timeoutErrorMessage)); + } + }, timeoutMs); + } + }); + } + + async exchange( + message: AppRequestMessage, + expectedTypeName: AgentResponseMessage['type'], + timeoutMs: number + ): Promise { + const prom = this.waitFor( + m => { + return m.type == expectedTypeName && m.meta.requestUuid == message.meta.requestUuid; + }, + timeoutMs, + AgentError.ApiTimeout + ); + + Logger.debug('Sending to DesktopAgent: ', message); + this.post(message); + try { + const out: X = await prom; + + if (out?.payload?.error) { + throw new Error(out.payload.error); + } else { + return out; + } + } catch (error) { + if ((error as Error).message == AgentError.ApiTimeout) { + Logger.error(`Timed-out while waiting for ${expectedTypeName} with requestUuid ${message.meta.requestUuid}`); + } + throw error; + } + } + + getAppIdentifier(): AppIdentifier { + return this.appIdentifier; + } + + abstract disconnect(): Promise; +} diff --git a/packages/fdc3-agent-proxy/src/util/AbstractFDC3Logger.ts b/packages/fdc3-agent-proxy/src/util/AbstractFDC3Logger.ts new file mode 100644 index 000000000..9e347b56f --- /dev/null +++ b/packages/fdc3-agent-proxy/src/util/AbstractFDC3Logger.ts @@ -0,0 +1,98 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { LogLevel } from '@finos/fdc3-standard'; + +//check if color is supported in (node) console; +let noColor = true; +//else only occurs in a browser and can't be tested in node +/* istanbul ignore if */ +if (typeof process !== 'undefined') { + const argv = process.argv || /* istanbul ignore next */ []; + const env = process.env || /* istanbul ignore next */ {}; + noColor = + (!!env.NO_COLOR || argv.includes('--no-color')) && + !( + !!env.FORCE_COLOR || + argv.includes('--color') || + process.platform === 'win32' /* istanbul ignore next */ || + ((process.stdout || {}).isTTY && env.TERM !== 'dumb') || + /* istanbul ignore next */ !!env.CI + ); +} + +type ColorFn = (aString: string) => string; + +export abstract class AbstractFDC3Logger { + /** This should be overridden by sub-classes to set the prefix applied + * to log messages. */ + /* istanbul ignore next */ static get prefix(): string { + return ''; + } + + //sub-classes should override this default log level + private static logLevel: LogLevel = LogLevel.DEBUG; + + public static setLogLevel(level: LogLevel) { + if (level in LogLevel) { + this.logLevel = level; + } else { + /* istanbul ignore next */ + this.error( + `Ignoring unrecognized LogLevel '${level}'! Current log level: '${this.logLevel} (${LogLevel[this.logLevel]})'` + ); + } + } + + protected static debugColor(value: string): string { + return noColor ? /* istanbul ignore next */ value : '\x1b[30m\x1b[2m' + value + '\x1b[22m\x1b[39m'; + } + protected static logColor(value: string): string { + return noColor ? /* istanbul ignore next */ value : '\x1b[32m\x1b[2m' + value + '\x1b[22m\x1b[39m'; + } + protected static warnColor(value: string): string { + return noColor ? /* istanbul ignore next */ value : '\x1b[33m' + value + '\x1b[39m'; + } + protected static errorColor(value: string): string { + return noColor ? /* istanbul ignore next */ value : '\x1b[31m' + value + '\x1b[39m'; + } + + public static debug(...params: any[]) { + if (this.logLevel >= LogLevel.DEBUG) { + console.debug(...this.prefixAndColorize(this.prefix, params, this.debugColor)); + } + } + + public static log(...params: any[]) { + if (this.logLevel >= LogLevel.INFO) { + console.log(...this.prefixAndColorize(this.prefix, params, this.logColor)); + } + } + + public static warn(...params: any[]) { + if (this.logLevel >= LogLevel.WARN) { + console.warn(...this.prefixAndColorize(this.prefix, params, this.warnColor)); + } + } + + public static error(...params: any[]) { + if (this.logLevel >= LogLevel.ERROR) { + console.error(...this.prefixAndColorize(this.prefix, params, this.errorColor)); + } + } + + protected static prefixAndColorize = (prefix: string, params: any[], colorFn: ColorFn): string[] => { + const prefixed = [prefix, ...params]; + return prefixed.map(value => { + if (typeof value === 'string') { + //just color strings + return colorFn(value); + } else if (value && value.stack && value.message) { + //probably an error + return colorFn(value.stack); + } else { + //something else... lets hope it stringifies + return colorFn(JSON.stringify(value, null, 2)); + } + }); + }; +} diff --git a/packages/fdc3-agent-proxy/src/util/Logger.ts b/packages/fdc3-agent-proxy/src/util/Logger.ts new file mode 100644 index 000000000..774b3defc --- /dev/null +++ b/packages/fdc3-agent-proxy/src/util/Logger.ts @@ -0,0 +1,18 @@ +import { LogLevel } from '@finos/fdc3-standard'; +import { AbstractFDC3Logger } from './AbstractFDC3Logger'; + +/** + * Logging utility used by the DesktopAgentProxy, which defaults to + * only printing WARN and ERROR level messages. The INFO level is used + * to message exchanges with Desktop Agents. The DEBUG level is used + * to log heartbeat messages from the DesktopAgent. + */ +export class Logger extends AbstractFDC3Logger { + static override get prefix(): string { + return 'FDC3 DesktopAgentProxy: '; + } + + //set default log level - will not be picked up in test scope so ignored + /* istanbul ignore next */ + logLevel: LogLevel = LogLevel.WARN; +} diff --git a/packages/fdc3-agent-proxy/src/util/throwIfUndefined.ts b/packages/fdc3-agent-proxy/src/util/throwIfUndefined.ts new file mode 100644 index 000000000..4bdd739a3 --- /dev/null +++ b/packages/fdc3-agent-proxy/src/util/throwIfUndefined.ts @@ -0,0 +1,21 @@ +import { AgentEventMessage, AgentResponseMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { ChannelError, OpenError, ResolveError } from '@finos/fdc3-standard'; +import { Logger } from './Logger'; + +export type ErrorMessages = ChannelError | OpenError | ResolveError; + +/** Utility function that logs and throws a specified error if a specified property does not exist. + * Used to lightly validate messages being processed primarily to catch errors in Desktop Agent + * implementations. + */ +export const throwIfUndefined = ( + property: object | string | number | null | undefined, + absentMessage: string, + message: AgentResponseMessage | AgentEventMessage, + absentError: ErrorMessages +): void => { + if (property === undefined) { + Logger.error(absentMessage, '\nDACP message that resulted in the undefined property: ', message); + throw new Error(absentError); + } +}; diff --git a/packages/fdc3-agent-proxy/test/features/app-channels.feature b/packages/fdc3-agent-proxy/test/features/app-channels.feature new file mode 100644 index 000000000..ed103e06a --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/app-channels.feature @@ -0,0 +1,81 @@ +Feature: Channel Listeners Support + + Background: Desktop Agent API + Given schemas loaded + Given User Channels one, two and three + Given A Desktop Agent in "api1" + Given "instrumentMessageOne" is a BroadcastEvent message on channel "channel-name" with context "fdc3.instrument" + Given "countryMessageOne" is a BroadcastEvent message on channel "channel-name" with context "fdc3.country" + Given "instrumentContext" is a "fdc3.instrument" context + Given "resultHandler" pipes context to "contexts" + + Scenario: Configuring two context listeners should mean they both pick up data + When I call "{api1}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + And I call "{channel1}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And I call "{channel1}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + | AAPL | fdc3.instrument | Apple | + Then messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | channel-name | {null} | getOrCreateChannelRequest | + | channel-name | fdc3.instrument | addContextListenerRequest | + | channel-name | fdc3.instrument | addContextListenerRequest | + + Scenario: Unsubscribing a context listener prevents it collecting data. + When I call "{api1}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + And I call "{channel1}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And I call "{result}" with "unsubscribe" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is empty + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | channel-name | {null} | getOrCreateChannelRequest | + | channel-name | fdc3.instrument | addContextListenerRequest | + | {null} | {null} | contextListenerUnsubscribeRequest | + + Scenario: I can create a listener which listens for any context type + In this version we are using the deprecated 1-arg approach + When I call "{api1}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + And I call "{channel1}" with "addContextListener" with parameter "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + And messaging receives "{countryMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | type | name | + | fdc3.instrument | Apple | + | fdc3.country | Sweden | + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | channel-name | {null} | getOrCreateChannelRequest | + | channel-name | {null} | addContextListenerRequest | + + Scenario: I can create a listener which listens for any context type + In this version we are using the non-deprecated 2 args approach + When I call "{api1}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + And I call "{channel1}" with "addContextListener" with parameters "{null}" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + And messaging receives "{countryMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | type | name | + | fdc3.instrument | Apple | + | fdc3.country | Sweden | + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | channel-name | {null} | getOrCreateChannelRequest | + | channel-name | {null} | addContextListenerRequest | + + Scenario: Passing invalid arguments to an app channel's addContextListener fn throws an error + When I call "{api1}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + # Specific error message not tested as its not currently standardized + # TODO: Fix when #1490 is resolved + And I call "{channel1}" with "addContextListener" with parameters "{true}" and "{resultHandler}" + Then "{result}" is an error + And I call "{channel1}" with "addContextListener" with parameters "{null}" and "{true}" + Then "{result}" is an error \ No newline at end of file diff --git a/packages/fdc3-agent-proxy/test/features/app-metadata.feature b/packages/fdc3-agent-proxy/test/features/app-metadata.feature new file mode 100644 index 000000000..1a5cdbef5 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/app-metadata.feature @@ -0,0 +1,35 @@ +Feature: Desktop Agent Information + + Background: Desktop Agent API + Given schemas loaded + And A Desktop Agent in "api" + And app "chipShop/c1" + + Scenario: Getting App metadata + When I call "{api}" with "getAppMetadata" with parameter "{c1}" + Then "{result}" is an object with the following contents + | appId | name | description | + | chipShop | Metadata Name | Metadata Description | + And messaging will have posts + | payload.app.appId | payload.app.instanceId | matches_type | + | chipShop | c1 | getAppMetadataRequest | + + Scenario: Getting own info + When I call "{api}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | provider | + | 2.0 | cucumber-provider | + And "{result.appMetadata}" is an object with the following contents + | appId | instanceId | + | cucumber-app | cucumber-instance | + + Scenario: Getting instance information + When I call "{api}" with "findInstances" with parameter "{c1}" + Then "{result}" is an array of objects with the following contents + | appId | instanceId | + | One | 1 | + | Two | 2 | + | Three | 3 | + And messaging will have posts + | payload.app.appId | payload.app.instanceId | matches_type | + | chipShop | c1 | findInstancesRequest | diff --git a/packages/fdc3-agent-proxy/test/features/broadcast.feature b/packages/fdc3-agent-proxy/test/features/broadcast.feature new file mode 100644 index 000000000..8e5ce1fbb --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/broadcast.feature @@ -0,0 +1,31 @@ +Feature: Broadcasting + + Background: Desktop Agent API + Given schemas loaded + Given User Channels one, two and three + Given A Desktop Agent in "api" + Given "instrumentMessageOne" is a BroadcastEvent message on channel "channel-name" with context "fdc3.instrument" + Given "countryMessageOne" is a BroadcastEvent message on channel "channel-name" with context "fdc3.country" + Given "instrumentContext" is a "fdc3.instrument" context + + Scenario: Broadcasting on a named app channel + When I call "{api}" with "getOrCreateChannel" with parameter "channel-name" + And I refer to "{result}" as "channel1" + And I call "{channel1}" with "broadcast" with parameter "{instrumentContext}" + Then messaging will have posts + | payload.channelId | payload.context.type | payload.context.name | matches_type | + | channel-name | fdc3.instrument | Apple | broadcastRequest | + + Scenario: Broadcasting using the api directly, with no user channel set + When I call "{api}" with "broadcast" with parameter "{instrumentContext}" + Then messaging will have posts + | payload.channelId | payload.context.type | payload.context.name | + + Scenario: Broadcasting using the api directly, with user channel set + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "broadcast" with parameter "{instrumentContext}" + Then messaging will have posts + | payload.channelId | payload.context.type | payload.context.name | matches_type | + | one | {null} | {null} | joinUserChannelRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | Apple | broadcastRequest | diff --git a/packages/fdc3-agent-proxy/test/features/find-intents.feature b/packages/fdc3-agent-proxy/test/features/find-intents.feature new file mode 100644 index 000000000..d7fc546b1 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/find-intents.feature @@ -0,0 +1,74 @@ +Feature: Basic Intents Support + + Background: Desktop Agent API + Given schemas loaded + And A Desktop Agent in "api" + And app "chipShop/c1" resolves intent "OrderFood" with result type "void" + And app "chipShop/c2" resolves intent "OrderFood" with result type "channel" + And app "library/l1" resolves intent "BorrowBooks" with result type "channel" + And app "bank/b1" resolves intent "Buy" with context "fdc3.instrument" and result type "fdc3.order" + And app "bank/b1" resolves intent "Sell" with context "fdc3.instrument" and result type "fdc3.order" + And app "travelAgent/t1" resolves intent "Buy" with context "fdc3.currency" and result type "fdc3.order" + And "instrumentContext" is a "fdc3.instrument" context + And "crazyContext" is a "fdc3.unsupported" context + + Scenario: Find Intent can return the same intent with multiple apps + When I call "{api}" with "findIntent" with parameter "Buy" + Then "{result.intent}" is an object with the following contents + | name | + | Buy | + And "{result.apps}" is an array of objects with the following contents + | appId | instanceId | + | bank | b1 | + | travelAgent | t1 | + And messaging will have posts + | payload.intent | matches_type | + | Buy | findIntentRequest | + + Scenario: Find Intent can return an error when an intent doesn't match + When I call "{api}" with "findIntent" with parameter "Bob" + Then "{result}" is an error with message "NoAppsFound" + And messaging will have posts + | payload.intent | matches_type | + | Bob | findIntentRequest | + + Scenario: Find Intent can filter by a context type + When I call "{api}" with "findIntent" with parameters "Buy" and "{instrumentContext}" + Then "{result.intent}" is an object with the following contents + | name | + | Buy | + And "{result.apps}" is an array of objects with the following contents + | appId | + | bank | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | Buy | fdc3.instrument | AAPL | findIntentRequest | + + Scenario: Find Intent can filter by generic result type + When I call "{api}" with "findIntent" with parameters "OrderFood" and "{empty}" and "channel" + Then "{result.intent}" is an object with the following contents + | name | + | OrderFood | + And "{result.apps}" is an array of objects with the following contents + | appId | instanceId | + | chipShop | c2 | + And messaging will have posts + | payload.intent | payload.resultType | matches_type | + | OrderFood | channel | findIntentRequest | + + Scenario: Find Intents By Context + When I call "{api}" with "findIntentsByContext" with parameter "{instrumentContext}" + Then "{result}" is an array of objects with the following contents + | intent.name | apps[0].appId | apps.length | + | Buy | bank | 1 | + | Sell | bank | 1 | + And messaging will have posts + | payload.context.type | payload.context.id.ticker | matches_type | + | fdc3.instrument | AAPL | findIntentsByContextRequest | + + Scenario: Find Intents By Context can return an error when an intent doesn't match + When I call "{api}" with "findIntentsByContext" with parameter "{crazyContext}" + Then "{result}" is an error with message "NoAppsFound" + And messaging will have posts + | payload.context.type | payload.context.bogus | matches_type | + | fdc3.unsupported | {true} | findIntentsByContextRequest | diff --git a/packages/fdc3-agent-proxy/test/features/heartbeat.feature b/packages/fdc3-agent-proxy/test/features/heartbeat.feature new file mode 100644 index 000000000..0123dd295 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/heartbeat.feature @@ -0,0 +1,18 @@ +Feature: Heartbeats + + Background: Desktop Agent API + Given A Desktop Agent in "api" + And schemas loaded + + Scenario: Send A Heartbeat + When messaging receives a heartbeat event + And messaging will have posts + | matches_type | + | heartbeatAcknowledgementRequest | + + Scenario: Saying Goodbye + When I call "{api}" with "disconnect" + And we wait for a period of "100" ms + Then messaging will have posts + | matches_type | + | WCP6Goodbye | diff --git a/packages/fdc3-agent-proxy/test/features/intent-listener.feature b/packages/fdc3-agent-proxy/test/features/intent-listener.feature new file mode 100644 index 000000000..bcaa3bba1 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/intent-listener.feature @@ -0,0 +1,42 @@ +Feature: Intent Listeners + + Background: Desktop Agent API + Given schemas loaded + And "instrumentContext" is a "fdc3.instrument" context + And A Desktop Agent in "api1" + And "intentMessageOne" is a intentEvent message with intent "BuyStock" and context "{instrumentContext}" + + Scenario: Intent Listeners Work + Given "resultHandler" pipes intent to "intents" + When I call "{api1}" with "addIntentListener" with parameters "BuyStock" and "{resultHandler}" + And messaging receives "{intentMessageOne}" + Then "{intents}" is an array of objects with the following contents + | context.type | context.name | metadata.source.appId | + | fdc3.instrument | Apple | some-app-id | + And messaging will have posts + | type | + | intentResultRequest | + + Scenario: Intent Listeners Can Return Results (Context) + Given "resultHandler" returns a context item + When I call "{api1}" with "addIntentListener" with parameters "BuyStock" and "{resultHandler}" + And messaging receives "{intentMessageOne}" + Then messaging will have posts + | type | payload.intentResult.context.type | payload.intentResolution.intent | + | intentResultRequest | fdc3.returned-intent | {empty} | + + Scenario: Intent Listeners Can Return Results (Channel) + Given "resultHandler" returns a channel + When I call "{api1}" with "addIntentListener" with parameters "BuyStock" and "{resultHandler}" + And messaging receives "{intentMessageOne}" + Then messaging will have posts + | type | payload.intentResult.channel.type | payload.intentResult.channel.id | + | intentResultRequest | private | some-channel-id | + + Scenario: Intent Listeners Can Return A Void Result + Given "resultHandler" returns a void promise + When I call "{api1}" with "addIntentListener" with parameters "BuyStock" and "{resultHandler}" + And messaging receives "{intentMessageOne}" + Then messaging will have posts + | type | payload.intentResult.channel | payload.intentResult.context | + | intentResultRequest | {empty} | {empty} | diff --git a/packages/fdc3-agent-proxy/test/features/intent-results.feature b/packages/fdc3-agent-proxy/test/features/intent-results.feature new file mode 100644 index 000000000..af334c234 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/intent-results.feature @@ -0,0 +1,79 @@ +Feature: Intents Can Return Different Results + + Background: Desktop Agent API + Given schemas loaded + And A Desktop Agent in "api" + And app "chipShop/c1" resolves intent "OrderFood" + And "instrumentContext" is a "fdc3.instrument" context + + Scenario: Raise Intent times out + Given Raise Intent times out + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + Then "{result}" is an error with message "ApiTimeout" + + Scenario: Raise Intent Fails With An Error + Given Raise Intent will throw a "TargetAppUnavailable" error + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + Then "{result}" is an error with message "TargetAppUnavailable" + + Scenario: void is returned in the result + Given Raise Intent returns no result + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + And I call "{result}" with "getResult" + Then "{result}" is undefined + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | OrderFood | fdc3.instrument | AAPL | raiseIntentRequest | + + Scenario: Raising An intent With The App Parameter + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" and "{c1}" + Then "{result}" is an object with the following contents + | source.appId | source.instanceId | intent | + | chipShop | c1 | OrderFood | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | payload.app.appId | payload.app.instanceId | matches_type | + | OrderFood | fdc3.instrument | AAPL | chipShop | c1 | raiseIntentRequest | + + Scenario: Context Data is returned in the result + Given Raise Intent returns a context of "{instrumentContext}" + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + And I call "{result}" with "getResult" + Then "{result}" is an object with the following contents + | type | name | + | fdc3.instrument | Apple | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | OrderFood | fdc3.instrument | AAPL | raiseIntentRequest | + + Scenario: App Channel is returned in the result + Given Raise Intent returns an app channel + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + And I call "{result}" with "getResult" + Then "{result}" is an object with the following contents + | type | id | + | app | result-channel | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | OrderFood | fdc3.instrument | AAPL | raiseIntentRequest | + + Scenario: User Channel is returned in the result + Given Raise Intent returns a user channel + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + And I call "{result}" with "getResult" + Then "{result}" is an object with the following contents + | type | id | + | user | result-channel | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | OrderFood | fdc3.instrument | AAPL | raiseIntentRequest | + + Scenario: Private Channel is returned in the result + Given Raise Intent returns a private channel + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + And I call "{result}" with "getResult" + Then "{result}" is an object with the following contents + | type | id | + | private | result-channel | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | OrderFood | fdc3.instrument | AAPL | raiseIntentRequest | diff --git a/packages/fdc3-agent-proxy/test/features/open.feature b/packages/fdc3-agent-proxy/test/features/open.feature new file mode 100644 index 000000000..441be0fbe --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/open.feature @@ -0,0 +1,32 @@ +Feature: Desktop Agent Information + + Background: Desktop Agent API + Given A Desktop Agent in "api" + And schemas loaded + And app "chipShop/c1" + And "instrumentContext" is a "fdc3.instrument" context + + Scenario: Open An App + When I call "{api}" with "open" with parameters "{c1}" and "{instrumentContext}" + Then "{result}" is an object with the following contents + | appId | instanceId | + | chipShop | abc123 | + And messaging will have posts + | payload.app.appId | payload.context.type | payload.context.id.ticker | matches_type | + | chipShop | fdc3.instrument | AAPL | openRequest | + + Scenario: Open An App Using App ID + When I call "{api}" with "open" with parameters "chipShop" and "{instrumentContext}" + Then "{result}" is an object with the following contents + | appId | instanceId | + | chipShop | abc123 | + And messaging will have posts + | payload.app.appId | payload.context.type | payload.context.id.ticker | matches_type | + | chipShop | fdc3.instrument | AAPL | openRequest | + + Scenario: Opening a non-existent App + When I call "{api}" with "open" with parameters "nonExistent" and "{instrumentContext}" + Then "{result}" is an error with message "AppNotFound" + And messaging will have posts + | payload.app.appId | payload.context.type | payload.context.id.ticker | matches_type | + | nonExistent | fdc3.instrument | AAPL | openRequest | diff --git a/packages/fdc3-agent-proxy/test/features/private-channels-deprecated.feature b/packages/fdc3-agent-proxy/test/features/private-channels-deprecated.feature new file mode 100644 index 000000000..d03f459dd --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/private-channels-deprecated.feature @@ -0,0 +1,70 @@ +Feature: Basic Private Channels Support + + Background: Desktop Agent API + Given schemas loaded + And User Channels one, two and three + And A Desktop Agent in "api" + And I call "{api}" with "createPrivateChannel" + And I refer to "{result}" as "privateChannel" + And "instrumentMessageOne" is a BroadcastEvent message on channel "{privateChannel.id}" with context "fdc3.instrument" + + Scenario: Adding and then unsubscribing an "onAddContextListener" listener will send a notification of each event to the agent + Given "typesHandler" pipes types to "types" + When I call "{privateChannel}" with "onAddContextListener" with parameter "{typesHandler}" + And I refer to "{result}" as "theListener" + And we wait for a period of "100" ms + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | addContextListener | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "onAddContextListener" on a given Private Channel to receive a notification + Given "onAddContextListenerMessage" is a PrivateChannelOnAddContextListenerEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + And "typesHandler" pipes types to "types" + When I call "{privateChannel}" with "onAddContextListener" with parameter "{typesHandler}" + And we wait for a period of "100" ms + And messaging receives "{onAddContextListenerMessage}" + Then "{types}" is an array of strings with the following values + | value | + | fdc3.instrument | + + Scenario: Adding and then unsubscribing an "onUnsubscribe" listener will send a notification of each event to the agent + Given "typesHandler" pipes types to "types" + When I call "{privateChannel}" with "onUnsubscribe" with parameter "{typesHandler}" + And we wait for a period of "100" ms + And I refer to "{result}" as "theListener" + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | unsubscribe | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "onUnsubscribe" on a given Private Channel to receive a notification + Given "onUnsubscribeListenerMessage" is a PrivateChannelOnUnsubscribeEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + And "typesHandler" pipes types to "types" + When I call "{privateChannel}" with "onUnsubscribe" with parameter "{typesHandler}" + And we wait for a period of "100" ms + And messaging receives "{onUnsubscribeListenerMessage}" + Then "{types}" is an array of strings with the following values + | value | + | fdc3.instrument | + + Scenario: Adding and then unsubscribing an "onDisconnect" listener will send a notification of each event to the agent + Given "voidHandler" is a invocation counter into "count" + When I call "{privateChannel}" with "onDisconnect" with parameter "{voidHandler}" + And I refer to "{result}" as "theListener" + And we wait for a period of "100" ms + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | disconnect | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "onDisconnect" on a given Private Channel to receive a notification + Given "onDisconnectListenerMessage" is a PrivateChannelOnDisconnectEvent message on channel "{privateChannel.id}" + And "voidHandler" is a invocation counter into "count" + When I call "{privateChannel}" with "onDisconnect" with parameter "{voidHandler}" + And we wait for a period of "100" ms + And messaging receives "{onDisconnectListenerMessage}" + Then "{count}" is "1" diff --git a/packages/fdc3-agent-proxy/test/features/private-channels.feature b/packages/fdc3-agent-proxy/test/features/private-channels.feature new file mode 100644 index 000000000..767f83841 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/private-channels.feature @@ -0,0 +1,114 @@ +Feature: Basic Private Channels Support + + Background: Desktop Agent API + Given schemas loaded + And User Channels one, two and three + And A Desktop Agent in "api" + And I call "{api}" with "createPrivateChannel" + And I refer to "{result}" as "privateChannel" + And "instrumentMessageOne" is a BroadcastEvent message on channel "{privateChannel.id}" with context "fdc3.instrument" + + Scenario: Adding and then unsubscribing a context listener will send a notification of each event to the agent + Given "contextHandler" pipes context to "context" + When I call "{privateChannel}" with "addContextListener" with parameters "fdc3.instrument" and "{contextHandler}" + And I refer to "{result}" as "theListener" + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.channelId | payload.contextType | payload.listenerUUID | matches_type | + | addContextListenerRequest | {privateChannel.id} | fdc3.instrument | {null} | addContextListenerRequest | + | contextListenerUnsubscribeRequest | {null} | {null} | {theListener.id} | contextListenerUnsubscribeRequest | + + Scenario: Adding a Context Listener on a given Private Channel to receive a notification + Given "resultHandler" pipes context to "contexts" + When I call "{privateChannel}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + + Scenario: Adding and then unsubscribing an "onAddContextListener" listener will send a notification of each event to the agent + Given "typesHandler" pipes events to "types" + When I call "{privateChannel}" with "addEventListener" with parameters "addContextListener" and "{typesHandler}" + And I refer to "{result}" as "theListener" + And we wait for a period of "100" ms + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | addContextListener | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "addContextListener" event handler on a given Private Channel to receive a notification + Given "onAddContextListenerMessage" is a PrivateChannelOnAddContextListenerEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + And "typesHandler" pipes events to "types" + When I call "{privateChannel}" with "addEventListener" with parameters "addContextListener" and "{typesHandler}" + And we wait for a period of "100" ms + And messaging receives "{onAddContextListenerMessage}" + Then "{types}" is an array of objects with the following contents + | contextType | + | fdc3.instrument | + + Scenario: Adding and then unsubscribing an "onUnsubscribe" listener will send a notification of each event to the agent + Given "typesHandler" pipes events to "types" + When I call "{privateChannel}" with "addEventListener" with parameters "unsubscribe" and "{typesHandler}" + And we wait for a period of "100" ms + And I refer to "{result}" as "theListener" + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | unsubscribe | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "unsubscribe" event handler on a given Private Channel to receive a notification + Given "onUnsubscribeListenerMessage" is a PrivateChannelOnUnsubscribeEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + And "typesHandler" pipes events to "types" + When I call "{privateChannel}" with "addEventListener" with parameters "unsubscribe" and "{typesHandler}" + And we wait for a period of "100" ms + And messaging receives "{onUnsubscribeListenerMessage}" + Then "{types}" is an array of objects with the following contents + | contextType | + | fdc3.instrument | + + Scenario: Adding an event handler for all events on a given Private Channel to receive a notification + Given "onAddContextListenerMessage" is a PrivateChannelOnAddContextListenerEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + Given "onUnsubscribeListenerMessage" is a PrivateChannelOnUnsubscribeEvent message on channel "{privateChannel.id}" with contextType as "fdc3.instrument" + Given "onDisconnectListenerMessage" is a PrivateChannelOnDisconnectEvent message on channel "{privateChannel.id}" + And "typesHandler" pipes events to "types" + And I call "{privateChannel}" with "addEventListener" with parameters "{null}" and "{typesHandler}" + And we wait for a period of "100" ms + And messaging receives "{onAddContextListenerMessage}" + And messaging receives "{onUnsubscribeListenerMessage}" + And messaging receives "{onDisconnectListenerMessage}" + Then "{types}" is an array of objects with length "3" + + Scenario: Adding and then unsubscribing an "disconnect" listener will send a notification of each event to the agent + Given "voidHandler" is a invocation counter into "count" + When I call "{privateChannel}" with "addEventListener" with parameters "disconnect" and "{voidHandler}" + And I refer to "{result}" as "theListener" + And we wait for a period of "100" ms + And I call "{theListener}" with "unsubscribe" + Then messaging will have posts + | type | payload.listenerType | payload.privateChannelId | payload.listenerUUID | matches_type | + | privateChannelAddEventListenerRequest | disconnect | {privateChannel.id} | {null} | privateChannelAddEventListenerRequest | + | privateChannelUnsubscribeEventListenerRequest | {null} | {null} | {theListener.id} | privateChannelUnsubscribeEventListenerRequest | + + Scenario: Adding an "onDisconnect" on a given Private Channel to receive a notification + Given "onDisconnectListenerMessage" is a PrivateChannelOnDisconnectEvent message on channel "{privateChannel.id}" + And "voidHandler" is a invocation counter into "count" + When I call "{privateChannel}" with "addEventListener" with parameters "disconnect" and "{voidHandler}" + And we wait for a period of "100" ms + And messaging receives "{onDisconnectListenerMessage}" + Then "{count}" is "1" + + Scenario: I can broadcast context on a private channel + Given "instrumentContext" is a "fdc3.instrument" context + When I call "{privateChannel}" with "broadcast" with parameter "{instrumentContext}" + Then messaging will have posts + | type | payload.channelId | payload.context.type | payload.context.name | matches_type | + | broadcastRequest | {privateChannel.id} | fdc3.instrument | Apple | broadcastRequest | + + Scenario: I disconnect from a private channel + And I call "{privateChannel}" with "disconnect" + And messaging will have posts + | payload.channelId | matches_type | + | {null} | createPrivateChannelRequest | + | {privateChannel.id} | privateChannelDisconnectRequest | diff --git a/packages/fdc3-agent-proxy/test/features/raise-intents.feature b/packages/fdc3-agent-proxy/test/features/raise-intents.feature new file mode 100644 index 000000000..952af5b04 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/raise-intents.feature @@ -0,0 +1,73 @@ +Feature: Basic Intents Support + + Background: Desktop Agent API + Given A Desktop Agent in "api" + And schemas loaded + And app "chipShop/c1" resolves intent "OrderFood" with result type "void" + And app "chipShop/c2" resolves intent "OrderFood" with result type "channel" + And app "bank/b1" resolves intent "Buy" with context "fdc3.instrument" and result type "fdc3.order" + And app "bank/b1" resolves intent "Sell" with context "fdc3.instrument" and result type "fdc3.order" + And app "travelAgent/t1" resolves intent "BookFlight" with context "fdc3.country" and result type "fdc3.order" + And app "notused/n1" resolves intent "Buy" with context "fdc3.cancel-me" and result type "fdc3.order" + And app "notused/n2" resolves intent "Buy" with context "fdc3.cancel-me" and result type "fdc3.order" + And "instrumentContext" is a "fdc3.instrument" context + And "countryContext" is a "fdc3.country" context + And "cancelContext" is a "fdc3.cancel-me" context + + Scenario: Raising an intent and invoking the intent resolver when it's not clear which intent is required + The intent resolver will just take the first matching application + that would resolve the intent. + + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{instrumentContext}" + Then "{result}" is an object with the following contents + | source.appId | source.instanceId | + | chipShop | c1 | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | payload.app.instanceId | matches_type | + | OrderFood | fdc3.instrument | AAPL | {null} | raiseIntentRequest | + | OrderFood | fdc3.instrument | AAPL | c1 | raiseIntentRequest | + + Scenario: Raising an intent and invoking the intent resolver, but the user cancels it. + When I call "{api}" with "raiseIntent" with parameters "OrderFood" and "{cancelContext}" + Then "{result}" is an error with message "UserCancelledResolution" + And messaging will have posts + | payload.intent | payload.context.type | matches_type | + | OrderFood | fdc3.cancel-me | raiseIntentRequest | + + Scenario: Raising Intent exactly right, so the resolver isn't required + When I call "{api}" with "raiseIntent" with parameters "Buy" and "{instrumentContext}" + Then "{result}" is an object with the following contents + | source.appId | source.instanceId | + | bank | b1 | + And messaging will have posts + | payload.intent | payload.context.type | payload.context.id.ticker | matches_type | + | Buy | fdc3.instrument | AAPL | raiseIntentRequest | + + Scenario: Raising Intent By Context and invoking the intent resolver when it's not clear which intent is required + The intent resolver will just take the first matching application + that would resolve an intent. + + When I call "{api}" with "raiseIntentForContext" with parameter "{instrumentContext}" + Then "{result}" is an object with the following contents + | source.appId | source.instanceId | + | chipShop | c1 | + And messaging will have posts + | payload.context.type | payload.context.id.ticker | payload.app.instanceId | matches_type | + | fdc3.instrument | AAPL | {null} | raiseIntentForContextRequest | + | fdc3.instrument | AAPL | c1 | raiseIntentRequest | + + Scenario: Raising Intent By Context exactly right, so the resolver isn't required + When I call "{api}" with "raiseIntentForContext" with parameters "{countryContext}" and "{t1}" + Then "{result}" is an object with the following contents + | source.appId | source.instanceId | + | travelAgent | t1 | + And messaging will have posts + | payload.context.type | payload.context.name | payload.app.appId | payload.app.instanceId | matches_type | + | fdc3.country | Sweden | travelAgent | t1 | raiseIntentForContextRequest | + + Scenario: Raising an intent and invoking the intent resolver, but the user cancels it. + When I call "{api}" with "raiseIntentForContext" with parameter "{cancelContext}" + Then "{result}" is an error with message "UserCancelledResolution" + And messaging will have posts + | payload.context.type | matches_type | + | fdc3.cancel-me | raiseIntentForContextRequest | diff --git a/packages/fdc3-agent-proxy/test/features/user-channel-selector.feature b/packages/fdc3-agent-proxy/test/features/user-channel-selector.feature new file mode 100644 index 000000000..cecbb46fe --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/user-channel-selector.feature @@ -0,0 +1,18 @@ +Feature: Updating User Channel State + + Background: + Given schemas loaded + Given User Channels one, two and three + And A Channel Selector in "selector" and a Desktop Agent in "api" + + Scenario: Selecting a channel updates the DA + When The first channel is selected via the channel selector in "selector" + And The second channel is selected via the channel selector in "selector" + Then messaging will have posts + | payload.channelId | matches_type | + | one | joinUserChannelRequest | + | two | joinUserChannelRequest | + And The channel is deselected via the channel selector in "selector" + Then messaging will have posts + | matches_type | + | leaveCurrentChannelRequest | diff --git a/packages/fdc3-agent-proxy/test/features/user-channel-sync.feature b/packages/fdc3-agent-proxy/test/features/user-channel-sync.feature new file mode 100644 index 000000000..8432dec43 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/user-channel-sync.feature @@ -0,0 +1,43 @@ +Feature: Updating User Channel State + + Background: + Given schemas loaded + Given User Channels one, two and three + Given "instrumentContext" is a "fdc3.instrument" context + And "crazyContext" is a "fdc3.unsupported" context + And channel "one" has context "{instrumentContext}" + And channel "two" has context "{crazyContext}" + And A Desktop Agent in "api" + + Scenario: Joining A User Channel Receives Correct Context on Listener + Given "resultHandler" pipes context to "contexts" + And I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + When I call "{api}" with "joinUserChannel" with parameter "one" + Then "{contexts}" is an array of objects with the following contents + | type | name | + | fdc3.instrument | Apple | + And I call "{api}" with "getCurrentChannel" + And I call "{result}" with "getCurrentContext" with parameter "fdc3.instrument" + Then "{result}" is an object with the following contents + | type | name | + | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.contextType | payload.listenerUUID | matches_type | + | one | {null} | {null} | joinUserChannelRequest | + | one | fdc3.instrument | {null} | getCurrentContextRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | {null} | getCurrentContextRequest | + + Scenario: Changing User Channel Doesn't Receive Incorrect Context on Listener + Given "resultHandler" pipes context to "contexts" + And I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + When I call "{api}" with "joinUserChannel" with parameter "two" + Then "{contexts}" is an array of objects with the following contents + | type | name | + And I call "{api}" with "getCurrentChannel" + And I call "{result}" with "getCurrentContext" with parameter "fdc3.instrument" + Then "{result}" is null + + Scenario: disconnection + When I call "{api}" with "disconnect" + Then "{result}" is undefined diff --git a/packages/fdc3-agent-proxy/test/features/user-channels.feature b/packages/fdc3-agent-proxy/test/features/user-channels.feature new file mode 100644 index 000000000..6e208184d --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/user-channels.feature @@ -0,0 +1,220 @@ +Feature: Basic User Channels Support + + Background: Desktop Agent API + Given User Channels one, two and three + Given schemas loaded + Given A Desktop Agent in "api" + Given "instrumentMessageOne" is a BroadcastEvent message on channel "one" with context "fdc3.instrument" + Given "countryMessageOne" is a BroadcastEvent message on channel "one" with context "fdc3.country" + Given "instrumentContext" is a "fdc3.instrument" context + Given "userChannelMessage1" is a channelChangedEvent message on channel "one" + Given "userChannelMessage2" is a channelChangedEvent message on channel "two" + Given "userChannelMessage3" is a channelChangedEvent message on channel "three" + + Scenario: List User Channels + There should be a selection of user channels to choose from + + When I call "{api}" with "getUserChannels" + Then "{result}" is an array of objects with the following contents + | id | type | displayMetadata.color | displayMetadata.glyph | displayMetadata.name | + | one | user | red | triangle | The one channel | + | two | user | red | triangle | The two channel | + | three | user | red | triangle | The three channel | + And messaging will have posts + | meta.source.appId | meta.source.instanceId | matches_type | + | cucumber-app | cucumber-instance | getUserChannelsRequest | + + Scenario: List User Channels via Deprecated API call + There should be a selection of user channels to choose from + + When I call "{api}" with "getSystemChannels" + Then "{result}" is an array of objects with the following contents + | id | type | displayMetadata.color | displayMetadata.glyph | displayMetadata.name | + | one | user | red | triangle | The one channel | + | two | user | red | triangle | The two channel | + | three | user | red | triangle | The three channel | + And messaging will have posts + | meta.source.appId | meta.source.instanceId | matches_type | + | cucumber-app | cucumber-instance | getUserChannelsRequest | + + Scenario: Initial User Channel + At startup, the user channel shouldn't be set + + When I call "{api}" with "getCurrentChannel" + Then "{result}" is null + And messaging will have posts + | meta.source.appId | meta.source.instanceId | matches_type | + | cucumber-app | cucumber-instance | getCurrentChannelRequest | + + Scenario: Changing Channel + You should be able to join a channel knowing it's ID. + + When I call "{api}" with "joinUserChannel" with parameter "one" + When I call "{api}" with "getCurrentChannel" + Then "{result}" is an object with the following contents + | id | type | displayMetadata.color | + | one | user | red | + And messaging will have posts + | payload.channelId | matches_type | + | one | joinUserChannelRequest | + | {null} | getCurrentChannelRequest | + + Scenario: Changing Channel via Deprecated API + You should be able to join a channel knowing it's ID. + + When I call "{api}" with "joinChannel" with parameter "one" + When I call "{api}" with "getCurrentChannel" + Then "{result}" is an object with the following contents + | id | type | displayMetadata.color | + | one | user | red | + And messaging will have posts + | payload.channelId | matches_type | + | one | joinUserChannelRequest | + | {null} | getCurrentChannelRequest | + + Scenario: Adding a Typed Listener on a given User Channel + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | one | {null} | joinUserChannelRequest | + | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | addContextListenerRequest | + + Scenario: Adding an Un-Typed Listener on a given User Channel + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "addContextListener" with parameters "{empty}" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | one | {null} | joinUserChannelRequest | + | {null} | {null} | getCurrentChannelRequest | + | one | {null} | addContextListenerRequest | + + Scenario: Adding an Un-Typed Listener on a given User Channel (deprecated API) + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "addContextListener" with parameter "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | one | {null} | joinUserChannelRequest | + | {null} | {null} | getCurrentChannelRequest | + | one | {null} | addContextListenerRequest | + + Scenario: If you haven't joined a channel, your listener receives nothing + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is empty + And messaging will have posts + | payload.channelId | payload.contextType | matches_type | + | {null} | {null} | getCurrentChannelRequest | + | {null} | fdc3.instrument | addContextListenerRequest | + + Scenario: After unsubscribing, my listener shouldn't receive any more messages + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And I refer to "{result}" as "theListener" + And messaging receives "{instrumentMessageOne}" + And I call "{theListener}" with "unsubscribe" + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.contextType | payload.listenerUUID | matches_type | + | one | {null} | {null} | joinUserChannelRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | {null} | addContextListenerRequest | + | {null} | {null} | {theListener.id} | contextListenerUnsubscribeRequest | + + Scenario: I should be able to leave a user channel, and not receive messages on it + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "addContextListener" with parameters "fdc3.instrument" and "{resultHandler}" + And I call "{api}" with "leaveCurrentChannel" + Then messaging will have posts + | payload.channelId | payload.contextType | payload.listenerUUID | matches_type | + | one | {null} | {null} | joinUserChannelRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | {null} | addContextListenerRequest | + | {null} | {null} | {null} | leaveCurrentChannelRequest | + And messaging receives "{instrumentMessageOne}" + Then "{contexts}" is an array of objects with the following contents + | id.ticker | type | name | + + Scenario: Joining a user channel that doesn't exist throws an error + When I call "{api}" with "joinUserChannel" with parameter "nonexistent" + Then "{result}" is an error with message "NoChannelFound" + + Scenario: Passing invalid arguments to a user channel's addContextListener fn throws an error + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "addContextListener" with parameters "{true}" and "{resultHandler}" + # Specific error message not tested as its not currently standardized + # TODO: Fix when #1490 is resolved + Then "{result}" is an error + And I call "{api}" with "addContextListener" with parameters "{null}" and "{true}" + Then "{result}" is an error + + Scenario: You can get the details of the last context type sent + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "getCurrentChannel" + And I refer to "{result}" as "theChannel" + And I call "{api}" with "broadcast" with parameter "{instrumentContext}" + And I call "{theChannel}" with "getCurrentContext" + Then "{result}" is an object with the following contents + | id.ticker | type | name | + | AAPL | fdc3.instrument | Apple | + And messaging will have posts + | payload.channelId | payload.context.type | payload.context.id.ticker | matches_type | + | one | {null} | {null} | joinUserChannelRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | {null} | {null} | {null} | getCurrentChannelRequest | + | one | fdc3.instrument | AAPL | broadcastRequest | + | one | {null} | {null} | getCurrentContextRequest | + + Scenario: Asking for a piece of context (e.g. an email) when it's not been sent returns null + Given "resultHandler" pipes context to "contexts" + When I call "{api}" with "joinUserChannel" with parameter "one" + And I call "{api}" with "getCurrentChannel" + And I refer to "{result}" as "theChannel" + And messaging receives "{instrumentMessageOne}" + And I call "{theChannel}" with "getCurrentContext" with parameter "fdc3.email" + Then "{result}" is null + + Scenario: User Channel Updated By Desktop Agent + When messaging receives "{userChannelMessage2}" + Then "{channelId}" is "two" + + Scenario: Adding and removing A User Channel Changed Event Listener + Given "typesHandler" pipes events to "types" + When I call "{api}" with "addEventListener" with parameters "userChannelChanged" and "{typesHandler}" + And I refer to "{result}" as "theListener" + And messaging receives "{userChannelMessage2}" + And messaging receives "{userChannelMessage1}" + And I call "{theListener}" with "unsubscribe" + And messaging receives "{userChannelMessage3}" + Then "{types}" is an array of objects with the following contents + | newChannelId | + | two | + | one | + + Scenario: Adding An Unknown Event Listener + Given "typesHandler" pipes events to "types" + When I call "{api}" with "addEventListener" with parameters "unknownEventType" and "{typesHandler}" + Then "{result}" is an error with message "UnknownEventType" diff --git a/packages/fdc3-agent-proxy/test/features/utils.feature b/packages/fdc3-agent-proxy/test/features/utils.feature new file mode 100644 index 000000000..6298470e3 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/features/utils.feature @@ -0,0 +1,10 @@ +Feature: Utility functions + + Scenario: throwIfUndefined is used to check properties + When I call throwIfUndefined it throws if a specified property is not defined + And I call throwIfUndefined it does NOT throw if a specified property IS defined + + Scenario: Logger utility + When All log functions are used with a message + When All log functions are used with an error + \ No newline at end of file diff --git a/packages/fdc3-agent-proxy/test/step-definitions/channelSelector.steps.ts b/packages/fdc3-agent-proxy/test/step-definitions/channelSelector.steps.ts new file mode 100644 index 000000000..d6f04cbff --- /dev/null +++ b/packages/fdc3-agent-proxy/test/step-definitions/channelSelector.steps.ts @@ -0,0 +1,69 @@ +import { Given, When } from '@cucumber/cucumber'; +import { SimpleIntentResolver } from '@finos/testing'; +import { CustomWorld } from '../world/index'; +import { CHANNEL_STATE } from '@finos/testing'; +import { + DefaultChannelSupport, + DefaultHeartbeatSupport, + DefaultIntentSupport, + DefaultAppSupport, + DesktopAgentProxy, +} from '../../src'; +import { TestChannelSelector } from '../support/TestChannelSelector'; +import { TestMessaging } from '../support/TestMessaging'; +import { LogLevel } from '@finos/fdc3-standard'; + +//Update this to enable debug output when debugging test failures +const logLevel = LogLevel.WARN; + +Given( + 'A Channel Selector in {string} and a Desktop Agent in {string}', + async function (this: CustomWorld, selectorField: string, daField: string) { + if (!this.messaging) { + this.messaging = new TestMessaging(this.props[CHANNEL_STATE]); + } + + const ts = new TestChannelSelector(); + this.props[selectorField] = ts; + + const cs = new DefaultChannelSupport(this.messaging, ts, 10000); + const hs = new DefaultHeartbeatSupport(this.messaging); + const is = new DefaultIntentSupport(this.messaging, new SimpleIntentResolver(this), 10000, 100000); + const as = new DefaultAppSupport(this.messaging, 10000, 100000); + + const da = new DesktopAgentProxy(hs, cs, is, as, [hs], logLevel); + await da.connect(); + + this.props[daField] = da; + this.props['result'] = null; + + //populate the channel selector + const channel = await cs.getUserChannel(); + const userChannels = await cs.getUserChannels(); + ts.updateChannel(channel?.id ?? null, userChannels); + } +); + +When( + 'The first channel is selected via the channel selector in {string}', + async function (this: CustomWorld, selectorField: string) { + const selector = this.props[selectorField] as TestChannelSelector; + selector.selectFirstChannel(); + } +); + +When( + 'The second channel is selected via the channel selector in {string}', + async function (this: CustomWorld, selectorField: string) { + const selector = this.props[selectorField] as TestChannelSelector; + selector.selectSecondChannel(); + } +); + +When( + 'The channel is deselected via the channel selector in {string}', + async function (this: CustomWorld, selectorField: string) { + const selector = this.props[selectorField] as TestChannelSelector; + selector.deselectChannel(); + } +); diff --git a/packages/fdc3-agent-proxy/test/step-definitions/channels.steps.ts b/packages/fdc3-agent-proxy/test/step-definitions/channels.steps.ts new file mode 100644 index 000000000..986c241af --- /dev/null +++ b/packages/fdc3-agent-proxy/test/step-definitions/channels.steps.ts @@ -0,0 +1,211 @@ +import { DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { Context } from '@finos/fdc3-context'; +import { handleResolve, matchData } from '@finos/testing'; +import { CustomWorld } from '../world/index'; +import { CHANNEL_STATE } from '@finos/testing'; +import { ApiEvent } from '@finos/fdc3-standard'; +import { + BroadcastEvent, + ChannelChangedEvent, + PrivateChannelOnAddContextListenerEvent, + PrivateChannelOnDisconnectEvent, + PrivateChannelOnUnsubscribeEvent, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +const contextMap: Record = { + 'fdc3.instrument': { + type: 'fdc3.instrument', + name: 'Apple', + id: { + ticker: 'AAPL', + }, + }, + 'fdc3.country': { + type: 'fdc3.country', + name: 'Sweden', + id: { + COUNTRY_ISOALPHA2: 'SE', + COUNTRY_ISOALPHA3: 'SWE', + }, + }, + 'fdc3.unsupported': { + type: 'fdc3.unsupported', + bogus: true, + }, + 'fdc3.cancel-me': { + type: 'fdc3.cancel-me', + }, +}; + +Given('{string} is a {string} context', function (this: CustomWorld, field: string, type: string) { + this.props[field] = contextMap[type]; +}); + +Given( + '{string} is a BroadcastEvent message on channel {string} with context {string}', + function (this: CustomWorld, field: string, channel: string, context: string) { + const message = { + meta: { + ...this.messaging!.createEventMeta(), + }, + payload: { + channelId: handleResolve(channel, this), + context: contextMap[context], + }, + type: 'broadcastEvent', + } as BroadcastEvent; + + this.props[field] = message; + } +); + +Given( + '{string} is a {string} message on channel {string}', + function (this: CustomWorld, field: string, type: string, channel: string) { + const message = { + meta: this.messaging!.createEventMeta(), + payload: { + privateChannelId: handleResolve(channel, this), + }, + type, + } as PrivateChannelOnDisconnectEvent; + + this.props[field] = message; + } +); + +Given( + '{string} is a {string} message on channel {string} with listenerType as {string}', + function (this: CustomWorld, field: string, type: string, channel: string, listenerType: string) { + const message = { + meta: this.messaging!.createMeta(), + payload: { + channelId: handleResolve(channel, this), + listenerType, + }, + type, + }; + + this.props[field] = message; + } +); + +Given( + '{string} is a channelChangedEvent message on channel {string}', + function (this: CustomWorld, field: string, channel: string) { + const message = { + meta: { + eventUuid: this.messaging!.createUUID(), + timestamp: new Date(), + }, + payload: { + newChannelId: handleResolve(channel, this), + }, + type: 'channelChangedEvent', + } as ChannelChangedEvent; + + this.props[field] = message; + } +); + +Given( + '{string} is a PrivateChannelOnUnsubscribeEvent message on channel {string} with contextType as {string}', + function (this: CustomWorld, field: string, channel: string, contextType: string) { + const message = { + meta: this.messaging!.createEventMeta(), + payload: { + privateChannelId: handleResolve(channel, this), + contextType, + }, + type: 'privateChannelOnUnsubscribeEvent', + } as PrivateChannelOnUnsubscribeEvent; + + this.props[field] = message; + } +); + +Given( + '{string} is a PrivateChannelOnAddContextListenerEvent message on channel {string} with contextType as {string}', + function (this: CustomWorld, field: string, channel: string, contextType: string) { + const message = { + meta: this.messaging!.createEventMeta(), + payload: { + privateChannelId: handleResolve(channel, this), + contextType, + }, + type: 'privateChannelOnAddContextListenerEvent', + } as PrivateChannelOnAddContextListenerEvent; + + this.props[field] = message; + } +); + +Given( + '{string} is a PrivateChannelOnDisconnectEvent message on channel {string}', + function (this: CustomWorld, field: string, channel: string) { + const message = { + meta: this.messaging!.createEventMeta(), + payload: { + privateChannelId: handleResolve(channel, this), + }, + type: 'privateChannelOnDisconnectEvent', + } as PrivateChannelOnDisconnectEvent; + + this.props[field] = message; + } +); + +Given('{string} pipes types to {string}', function (this: CustomWorld, typeHandlerName: string, field: string) { + this.props[field] = []; + this.props[typeHandlerName] = (s?: string) => { + this.props[field].push(s); + }; +}); + +Given('{string} pipes events to {string}', function (this: CustomWorld, typeHandlerName: string, field: string) { + this.props[field] = []; + this.props[typeHandlerName] = (s?: ApiEvent) => { + this.props[field].push(s?.details); + }; +}); + +Given('{string} pipes context to {string}', function (this: CustomWorld, contextHandlerName: string, field: string) { + this.props[field] = []; + this.props[contextHandlerName] = (context: Context) => { + this.props[field].push(context); + }; +}); + +When('messaging receives {string}', function (this: CustomWorld, field: string) { + const message = handleResolve(field, this); + console.log(`Sending: `, message); + this.messaging!.receive(message, console.log); +}); + +Then('messaging will have posts', function (this: CustomWorld, dt: DataTable) { + // just take the last few posts and match those + const matching = dt.rows().length; + let toUse = this.messaging!.allPosts!; + if (toUse.length > matching) { + toUse = toUse.slice(toUse.length - matching, toUse.length); + } + matchData(this, toUse, dt); +}); + +Given('channel {string} has context {string}', function (this: CustomWorld, channel: string, context: string) { + const ctxObject = handleResolve(context, this); + const state = this.props[CHANNEL_STATE] ?? {}; + this.props[CHANNEL_STATE] = state; + + const cs = state[channel] ?? []; + cs.push(ctxObject); + state[channel] = cs; +}); + +Given('User Channels one, two and three', function (this: CustomWorld) { + this.props[CHANNEL_STATE] = { + one: [], + two: [], + three: [], + }; +}); diff --git a/packages/fdc3-agent-proxy/test/step-definitions/generic.steps.ts b/packages/fdc3-agent-proxy/test/step-definitions/generic.steps.ts new file mode 100644 index 000000000..3415ea232 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/step-definitions/generic.steps.ts @@ -0,0 +1,47 @@ +import { TestMessaging } from '../support/TestMessaging'; +import { Given, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world/index'; +import { + DesktopAgentProxy, + DefaultAppSupport, + DefaultChannelSupport, + DefaultIntentSupport, + DefaultHeartbeatSupport, +} from '../../src'; +import { SimpleIntentResolver, setupGenericSteps } from '@finos/testing'; +import { CHANNEL_STATE, SimpleChannelSelector } from '@finos/testing/dist/src/agent'; +import { HeartbeatEvent } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { LogLevel } from '@finos/fdc3-standard'; + +//Update this to enable debug output when debugging test failures +const logLevel = LogLevel.WARN; + +Given('A Desktop Agent in {string}', async function (this: CustomWorld, field: string) { + if (!this.messaging) { + this.messaging = new TestMessaging(this.props[CHANNEL_STATE]); + } + + //n.b. using short timeouts to avoid extending tests unnecessarily + const cs = new DefaultChannelSupport(this.messaging, new SimpleChannelSelector(this), 1500); + const hs = new DefaultHeartbeatSupport(this.messaging); + const is = new DefaultIntentSupport(this.messaging, new SimpleIntentResolver(this), 1500, 3000); + const as = new DefaultAppSupport(this.messaging, 1500, 3000); + + const da = new DesktopAgentProxy(hs, cs, is, as, [hs], logLevel); + await da.connect(); + + this.props[field] = da; + this.props['result'] = null; +}); + +When('messaging receives a heartbeat event', function (this: CustomWorld) { + this.messaging?.receive({ + type: 'heartbeatEvent', + meta: this.messaging.createEventMeta(), + payload: { + timestamp: new Date(), + }, + } as HeartbeatEvent); +}); + +setupGenericSteps(); diff --git a/packages/fdc3-agent-proxy/test/step-definitions/intents.steps.ts b/packages/fdc3-agent-proxy/test/step-definitions/intents.steps.ts new file mode 100644 index 000000000..2fad1583a --- /dev/null +++ b/packages/fdc3-agent-proxy/test/step-definitions/intents.steps.ts @@ -0,0 +1,203 @@ +import { Given } from '@cucumber/cucumber'; +import { CustomWorld } from '../world/index'; +import { handleResolve } from '@finos/testing'; +import { Context } from '@finos/fdc3-context'; +import { ContextMetadata, ResolveError } from '@finos/fdc3-standard'; +import { IntentEvent } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +Given('app {string}', function (this: CustomWorld, appStr: string) { + const [appId, instanceId] = appStr.split('/'); + const app = { appId, instanceId }; + this.messaging?.addAppIntentDetail({ + app, + }); + this.props[instanceId] = app; +}); + +Given('app {string} resolves intent {string}', function (this: CustomWorld, appStr: string, intent: string) { + const [appId, instanceId] = appStr.split('/'); + const app = { appId, instanceId }; + this.messaging?.addAppIntentDetail({ + app, + intent, + }); + this.props[instanceId] = app; + this.props[appId] = { + appId, + }; +}); + +Given( + 'app {string} resolves intent {string} with result type {string}', + function (this: CustomWorld, appStr: string, intent: string, resultType: string) { + const [appId, instanceId] = appStr.split('/'); + const app = { appId, instanceId }; + this.messaging?.addAppIntentDetail({ + app, + intent, + resultType, + }); + this.props[instanceId] = app; + this.props[appId] = { + appId, + }; + } +); + +Given( + 'app {string} resolves intent {string} with context {string}', + function (this: CustomWorld, appStr: string, intent: string, context: string) { + const [appId, instanceId] = appStr.split('/'); + const app = { appId, instanceId }; + this.messaging?.addAppIntentDetail({ + app, + intent, + context, + }); + this.props[instanceId] = app; + this.props[appId] = { + appId, + }; + } +); + +Given( + 'app {string} resolves intent {string} with context {string} and result type {string}', + function (this: CustomWorld, appStr: string, intent: string, context: string, resultType: string) { + const [appId, instanceId] = appStr.split('/'); + const app = { appId, instanceId }; + this.messaging?.addAppIntentDetail({ + app, + intent, + context, + resultType, + }); + this.props[instanceId] = app; + } +); + +Given('Raise Intent returns a context of {string}', function (this: CustomWorld, result: string) { + this.messaging?.setIntentResult({ + context: handleResolve(result, this), + }); +}); + +Given('Raise Intent will throw a {string} error', function (this: CustomWorld, error: ResolveError) { + this.messaging?.setIntentResult({ + error, + }); +}); + +Given('Raise Intent returns no result', function (this: CustomWorld) { + this.messaging?.setIntentResult({}); +}); + +Given('Raise Intent times out', function (this: CustomWorld) { + this.messaging?.setIntentResult({ + timeout: true, + }); +}); + +Given('Raise Intent returns an app channel', function (this: CustomWorld) { + this.messaging?.setIntentResult({ + channel: { + type: 'app', + id: 'result-channel', + displayMetadata: { + color: 'purple', + name: 'Result Channel', + }, + }, + }); +}); + +Given('Raise Intent returns a user channel', function (this: CustomWorld) { + this.messaging?.setIntentResult({ + channel: { + type: 'user', + id: 'result-channel', + displayMetadata: { + color: 'purple', + name: 'Result Channel', + }, + }, + }); +}); + +Given('Raise Intent returns a private channel', function (this: CustomWorld) { + this.messaging?.setIntentResult({ + channel: { + type: 'private', + id: 'result-channel', + displayMetadata: { + color: 'purple', + name: 'Result Channel', + }, + }, + }); +}); + +Given( + '{string} is a intentEvent message with intent {string} and context {string}', + function (this: CustomWorld, field: string, intent: string, context: string) { + const msg: IntentEvent = { + type: 'intentEvent', + meta: { + eventUuid: this.messaging!.createUUID(), + timestamp: new Date(), + }, + payload: { + originatingApp: { + appId: 'some-app-id', + desktopAgent: 'some-desktop-agent', + }, + context: handleResolve(context, this), + intent, + raiseIntentRequestUuid: 'request-id', + }, + }; + + this.props[field] = msg; + } +); + +Given('{string} pipes intent to {string}', function (this: CustomWorld, intentHandlerName: string, field: string) { + this.props[field] = []; + this.props[intentHandlerName] = (context: Context, metadata: ContextMetadata) => { + this.props[field].push({ + context, + metadata, + }); + }; +}); + +Given('{string} returns a context item', function (this: CustomWorld, intentHandlerName: string) { + this.props[intentHandlerName] = async () => { + return { + type: 'fdc3.returned-intent', + id: { + in: 'one', + out: 'two', + }, + }; + }; +}); + +Given('{string} returns a channel', function (this: CustomWorld, intentHandlerName: string) { + this.props[intentHandlerName] = async () => { + return { + type: 'private', + id: 'some-channel-id', + displayMetadata: { + color: 'ochre', + name: 'Some Channel', + }, + }; + }; +}); + +Given('{string} returns a void promise', function (this: CustomWorld, intentHandlerName: string) { + this.props[intentHandlerName] = async () => { + return null; + }; +}); diff --git a/packages/fdc3-agent-proxy/test/step-definitions/util.steps.ts b/packages/fdc3-agent-proxy/test/step-definitions/util.steps.ts new file mode 100644 index 000000000..45f0501a8 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/step-definitions/util.steps.ts @@ -0,0 +1,82 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { throwIfUndefined } from '../../src/util/throwIfUndefined'; +import { AgentResponseMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { LogLevel, OpenError } from '@finos/fdc3-standard'; +import expect from 'expect'; +import { Logger } from '../../src/util/Logger'; + +When('I call throwIfUndefined it throws if a specified property is not defined', async function (this: CustomWorld) { + let thrown: Error | null = null; + const someObject: Record = { someProperty: 'value' }; + const dummyMessage: AgentResponseMessage = { + type: 'broadcastResponse', + meta: { + requestUuid: '123', + responseUuid: '456', + timestamp: new Date(), + }, + payload: {}, + }; + try { + throwIfUndefined( + someObject.nonExistent, + 'Deliberately undefined prop did not exist ;-)', + dummyMessage, + OpenError.MalformedContext + ); + } catch (e) { + thrown = e as Error; + } + + expect(thrown).not.toBeNull(); + //should be an error object, with the message we passed in + expect(thrown?.message).toEqual(OpenError.MalformedContext); +}); + +When( + 'I call throwIfUndefined it does NOT throw if a specified property IS defined', + async function (this: CustomWorld) { + let thrown: Error | null = null; + const someObject: Record = { someProperty: 'value' }; + const dummyMessage: AgentResponseMessage = { + type: 'broadcastResponse', + meta: { + requestUuid: '123', + responseUuid: '456', + timestamp: new Date(), + }, + payload: {}, + }; + try { + throwIfUndefined( + someObject.someProperty, + 'Deliberately undefined prop did not exist ;-)', + dummyMessage, + OpenError.MalformedContext + ); + } catch (e) { + thrown = e as Error; + } + + expect(thrown).toBeNull(); + } +); + +const TEST_ERROR = 'Test error - This is expected on the console'; + +When('All log functions are used with a message', async function (this: CustomWorld) { + Logger.setLogLevel(LogLevel.DEBUG); + Logger.debug('Debug msg'); + Logger.log('Log msg'); + Logger.warn('Warning msg'); + Logger.error('Error msg'); +}); + +When('All log functions are used with an error', async function (this: CustomWorld) { + Logger.setLogLevel(LogLevel.DEBUG); + Logger.debug('debug-level error: ', new Error(TEST_ERROR)); + Logger.log('log-level error: ', new Error(TEST_ERROR)); + Logger.warn('warn-level error: ', new Error(TEST_ERROR)); + Logger.error('error-level error: ', new Error(TEST_ERROR)); +}); diff --git a/packages/fdc3-agent-proxy/test/support/TestChannelSelector.ts b/packages/fdc3-agent-proxy/test/support/TestChannelSelector.ts new file mode 100644 index 000000000..5e75db329 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/TestChannelSelector.ts @@ -0,0 +1,47 @@ +import { Channel, ChannelSelector } from '@finos/fdc3-standard'; + +export class TestChannelSelector implements ChannelSelector { + private callback: ((channelId: string | null) => void) | null = null; + channelId: string | null = null; + channels: Channel[] = []; + + constructor() { } + + async updateChannel(channelId: string | null, availableChannels: Channel[]): Promise { + this.channelId = channelId; + this.channels = availableChannels; + } + + setChannelChangeCallback(callback: (channelId: string | null) => void): void { + this.callback = callback; + } + + async connect(): Promise { + console.log('TestChannelSelector was connected'); + } + + async disconnect(): Promise { + console.log('TestChannelSelector was disconnected'); + } + + selectChannel(channelId: string | null): void { + this.channelId = channelId; + if (this.callback) { + this.callback(this.channelId); + } else { + throw new Error('Channel selected before Channel Change callback was set!'); + } + } + + selectFirstChannel(): void { + this.selectChannel(this.channels[0].id); + } + + selectSecondChannel(): void { + this.selectChannel(this.channels[1].id); + } + + deselectChannel(): void { + this.selectChannel(null); + } +} diff --git a/packages/fdc3-agent-proxy/test/support/TestMessaging.ts b/packages/fdc3-agent-proxy/test/support/TestMessaging.ts new file mode 100644 index 000000000..dcf08c450 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/TestMessaging.ts @@ -0,0 +1,239 @@ +import { AppIdentifier, ResolveError } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { v4 as uuidv4 } from 'uuid'; +import { AbstractMessaging } from '../../src/messaging/AbstractMessaging'; +import { RegisterableListener } from '../../src/listeners/RegisterableListener'; +import { FindIntent } from './responses/FindIntent'; +import { FindIntentByContext } from './responses/FindIntentByContext'; +import { RaiseIntent } from './responses/RaiseIntent'; +import { GetAppMetadata } from './responses/GetAppMetadata'; +import { FindInstances } from './responses/FindInstances'; +import { Open } from './responses/Open'; +import { GetOrCreateChannel } from './responses/GetOrCreateChannel'; +import { ChannelState } from './responses/ChannelState'; +import { GetUserChannels } from './responses/GetUserChannels'; +import { RegisterListeners } from './responses/RegisterListeners'; +import { UnsubscribeListeners } from './responses/UnsubscribeListeners'; +import { CreatePrivateChannel } from './responses/CreatePrivateChannel'; +import { DisconnectPrivateChannel } from './responses/DisconnectPrivateChannel'; +import { IntentResult } from './responses/IntentResult'; +import { RaiseIntentForContext } from './responses/RaiseIntentForContext'; +import { + AgentEventMessage, + AgentResponseMessage, + AppRequestMessage, + Channel, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { GetInfo } from './responses/GetInfo'; + +export interface IntentDetail { + app?: AppIdentifier; + intent?: string; + context?: string; + resultType?: string; +} + +export interface AutomaticResponse { + filter: (t: string) => boolean; + action: (input: AppRequestMessage, m: TestMessaging) => Promise; +} + +export interface PossibleIntentResult { + context?: Context; + channel?: Channel; + error?: ResolveError; + timeout?: boolean; +} + +function matchStringOrUndefined(expected: string | undefined, actual: string | undefined) { + if (expected && actual) { + return expected == actual; + } else { + return true; + } +} + +function matchString(expected: string | undefined, actual: string | undefined) { + return expected == actual; +} + +function removeGenericType(t: string) { + const startOfGeneric = t.indexOf('<'); + if (startOfGeneric > -1) { + return t.substring(0, startOfGeneric - 1); + } else { + return t; + } +} + +function matchResultTypes(expected: string | undefined, actual: string | undefined) { + if (expected) { + if (expected.indexOf('<') > -1) { + // looking for a complete match involving generics + return expected == actual; + } else if (actual == undefined) { + // no actual, only expected + return false; + } else { + // expected doesn't have generics, match without + const actualType = removeGenericType(actual); + return expected == actualType; + } + } else { + return true; + } +} + +export function intentDetailMatches( + instance: IntentDetail, + template: IntentDetail, + contextMustMatch: boolean +): boolean { + return ( + matchStringOrUndefined(template.app?.appId, instance.app?.appId) && + matchStringOrUndefined(template.app?.instanceId, instance.app?.instanceId) && + matchStringOrUndefined(template.intent, instance.intent) && + (contextMustMatch + ? matchString(template.context, instance.context) + : matchStringOrUndefined(template.context, instance.context)) && + matchResultTypes(template.resultType, instance.resultType) + ); +} + +export class TestMessaging extends AbstractMessaging { + readonly allPosts: (AppRequestMessage | WebConnectionProtocol6Goodbye)[] = []; + readonly listeners: Map = new Map(); + readonly intentDetails: IntentDetail[] = []; + readonly channelState: { [key: string]: Context[] }; + currentChannel: Channel | null = null; + + readonly automaticResponses: AutomaticResponse[]; + + constructor(channelState: { [key: string]: Context[] }) { + super({ appId: 'cucumber-app', instanceId: 'cucumber-instance' }); + + this.channelState = channelState; + this.automaticResponses = [ + new FindIntent(), + new FindIntentByContext(), + new RaiseIntent(), + new RaiseIntentForContext(), + new IntentResult(), + new GetAppMetadata(), + new GetInfo(), + new FindInstances(), + new Open(), + new GetOrCreateChannel(), + new ChannelState(this.channelState), + new GetUserChannels(), + new RegisterListeners(), + new UnsubscribeListeners(), + new CreatePrivateChannel(), + new DisconnectPrivateChannel(), + ]; + } + + createUUID(): string { + return uuidv4(); + } + + getTimeoutMs(): number { + return 1000; + } + + async disconnect(): Promise { + //Theres no explicit disconnect call for the DA in FDC3, but the DesktopAgentProxy implementation includes one that is called to pagehide + const bye: WebConnectionProtocol6Goodbye = { + type: 'WCP6Goodbye', + meta: { + timestamp: new Date(), + }, + }; + await this.post(bye); + } + + post(message: AppRequestMessage | WebConnectionProtocol6Goodbye): Promise { + this.allPosts.push(message); + + if (message.type != 'WCP6Goodbye') { + for (let i = 0; i < this.automaticResponses.length; i++) { + const ar = this.automaticResponses[i]; + if (ar.filter(message.type)) { + return ar.action(message, this); + } + } + } + + return Promise.resolve(); + } + + addAppIntentDetail(id: IntentDetail) { + this.intentDetails.push(id); + } + + register(l: RegisterableListener) { + if (l.id == null) { + throw new Error('Listener must have ID set'); + } else { + this.listeners.set(l.id, l); + } + } + + unregister(id: string) { + this.listeners.delete(id); + } + + createMeta() { + return { + requestUuid: this.createUUID(), + timestamp: new Date(), + source: this.getAppIdentifier(), + }; + } + + /** + * Used in testing steps + */ + createResponseMeta() { + return { + ...this.createMeta(), + responseUuid: this.createUUID(), + }; + } + + /** + * Used in testing steps + */ + createEventMeta() { + return { + ...this.createMeta(), + eventUuid: this.createUUID(), + }; + } + + receive(m: AgentResponseMessage | AgentEventMessage, log?: (s: string) => void) { + this.listeners.forEach((v, k) => { + if (v.filter(m)) { + if (log) { + log('Processing in ' + k); + } + v.action(m); + } else { + if (log) { + log('Ignoring in ' + k); + } + } + }); + } + + private ir: PossibleIntentResult | null = null; + + getIntentResult() { + return this.ir; + } + + setIntentResult(o: PossibleIntentResult) { + this.ir = o; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/ChannelState.ts b/packages/fdc3-agent-proxy/test/support/responses/ChannelState.ts new file mode 100644 index 000000000..691fa5e10 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/ChannelState.ts @@ -0,0 +1,193 @@ +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { Context } from '@finos/fdc3-context'; +import { createResponseMeta } from './support'; +import { v4 as uuidv4 } from 'uuid'; +import { + AddContextListenerRequest, + AddContextListenerResponse, + AgentResponseMessage, + AppRequestMessage, + BroadcastRequest, + BroadcastResponse, + ContextListenerUnsubscribeRequest, + ContextListenerUnsubscribeResponse, + GetCurrentChannelRequest, + GetCurrentChannelResponse, + GetCurrentContextRequest, + GetCurrentContextResponse, + JoinUserChannelRequest, + JoinUserChannelResponse, + LeaveCurrentChannelRequest, + LeaveCurrentChannelResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class ChannelState implements AutomaticResponse { + private channelId: string | null = null; + private listeners: { [channel: string]: string[] } = {}; + private contextHistory: { [channel: string]: Context[] } = {}; + + constructor(contextHistory: { [channel: string]: Context[] }) { + this.contextHistory = contextHistory; + } + + filter(t: string) { + return ( + t == 'broadcastRequest' || + t == 'joinUserChannelRequest' || + t == 'leaveCurrentChannelRequest' || + t == 'getCurrentChannelRequest' || + t == 'addContextListenerRequest' || + t == 'contextListenerUnsubscribeRequest' || + t == 'getCurrentContextRequest' + ); + } + + action(input: AppRequestMessage, m: TestMessaging) { + let out: AgentResponseMessage | null = null; + switch (input.type) { + case 'joinUserChannelRequest': + out = this.createJoinResponse(input); + break; + case 'leaveCurrentChannelRequest': + out = this.createLeaveResponse(input); + break; + + case 'getCurrentChannelRequest': + out = this.createGetChannelResponse(input); + break; + + case 'addContextListenerRequest': + out = this.createAddListenerResponse(input); + break; + + case 'contextListenerUnsubscribeRequest': + out = this.createUnsubscribeResponse(input); + break; + + case 'getCurrentContextRequest': + out = this.createGetContextResponse(input); + break; + + case 'broadcastRequest': + out = this.createBroadcastResponse(input); + break; + } + + if (out) { + setTimeout(() => { + m.receive(out!); + }, 100); + } + return Promise.resolve(); + } + + private createBroadcastResponse(i: BroadcastRequest): BroadcastResponse { + const channel = i.payload.channelId; + const context = i.payload.context; + this.contextHistory[channel] = this.contextHistory[channel] ?? []; + this.contextHistory[channel].unshift(context); + + return { + meta: createResponseMeta(i.meta), + type: 'broadcastResponse', + payload: {}, + }; + } + + private createJoinResponse(i: JoinUserChannelRequest): JoinUserChannelResponse { + if (i.payload.channelId == 'nonexistent') { + return { + meta: createResponseMeta(i.meta), + type: 'joinUserChannelResponse', + payload: { + error: 'NoChannelFound', + }, + }; + } else { + this.channelId = i.payload.channelId; + return { + meta: createResponseMeta(i.meta), + type: 'joinUserChannelResponse', + payload: {}, + }; + } + } + + private createGetContextResponse(input: GetCurrentContextRequest): GetCurrentContextResponse { + const ch = input.payload.channelId; + let last: Context | undefined; + const contexts = this.contextHistory[ch] ?? []; + if (input.payload.contextType) { + last = contexts.find(c => c.type == input.payload.contextType); + } else { + last = contexts.length > 0 ? contexts[0] : undefined; + } + return { + meta: createResponseMeta(input.meta), + type: 'getCurrentContextResponse', + payload: { + context: last ?? null, + }, + }; + } + + private createLeaveResponse(i: LeaveCurrentChannelRequest): LeaveCurrentChannelResponse { + this.channelId = null; + return { + meta: createResponseMeta(i.meta), + type: 'leaveCurrentChannelResponse', + payload: {}, + }; + } + + private createAddListenerResponse(i: AddContextListenerRequest): AddContextListenerResponse { + const id = uuidv4(); + + if (this.channelId) { + const list = this.listeners[this.channelId] ?? []; + list.push(id); + this.listeners[this.channelId] = list; + } + + return { + meta: createResponseMeta(i.meta), + type: 'addContextListenerResponse', + payload: { + listenerUUID: id, + }, + }; + } + + private createUnsubscribeResponse(i: ContextListenerUnsubscribeRequest): ContextListenerUnsubscribeResponse { + const id = i.payload.listenerUUID; + Object.keys(this.listeners).forEach(k => { + this.listeners[k] = this.listeners[k].filter(v => v != id); + }); + + return { + meta: createResponseMeta(i.meta), + type: 'contextListenerUnsubscribeResponse', + payload: {}, + }; + } + + private createGetChannelResponse(i: GetCurrentChannelRequest): GetCurrentChannelResponse { + return { + meta: createResponseMeta(i.meta), + type: 'getCurrentChannelResponse', + payload: { + channel: this.channelId + ? { + id: this.channelId, + type: 'user', + displayMetadata: { + name: 'The ' + this.channelId + ' channel', + color: 'red', + glyph: 'triangle', + }, + } + : null, + }, + } as GetCurrentChannelResponse; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/CreatePrivateChannel.ts b/packages/fdc3-agent-proxy/test/support/responses/CreatePrivateChannel.ts new file mode 100644 index 000000000..bb917bd84 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/CreatePrivateChannel.ts @@ -0,0 +1,42 @@ +import { + CreatePrivateChannelRequest, + CreatePrivateChannelResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; +import { v4 as uuidv4 } from 'uuid'; + +export class CreatePrivateChannel implements AutomaticResponse { + count: number = 0; + + filter(t: string) { + return t == 'createPrivateChannelRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createResponse(input as CreatePrivateChannelRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: CreatePrivateChannelRequest): CreatePrivateChannelResponse { + return { + meta: createResponseMeta(i.meta), + type: 'createPrivateChannelResponse', + payload: { + privateChannel: { + id: uuidv4(), + type: 'private', + displayMetadata: { + name: 'Private Channel' + this.count++, + color: 'blue', + glyph: 'circle', + }, + }, + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/DisconnectPrivateChannel.ts b/packages/fdc3-agent-proxy/test/support/responses/DisconnectPrivateChannel.ts new file mode 100644 index 000000000..cf0758f99 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/DisconnectPrivateChannel.ts @@ -0,0 +1,31 @@ +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; +import { + PrivateChannelDisconnectRequest, + PrivateChannelDisconnectResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class DisconnectPrivateChannel implements AutomaticResponse { + count: number = 0; + + filter(t: string) { + return t == 'privateChannelDisconnectRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createResponse(input as PrivateChannelDisconnectRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: PrivateChannelDisconnectRequest): PrivateChannelDisconnectResponse { + return { + meta: createResponseMeta(i.meta), + type: 'privateChannelDisconnectResponse', + payload: {}, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/FindInstances.ts b/packages/fdc3-agent-proxy/test/support/responses/FindInstances.ts new file mode 100644 index 000000000..823c5a6ab --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/FindInstances.ts @@ -0,0 +1,32 @@ +import { FindInstancesRequest, FindInstancesResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; + +export class FindInstances implements AutomaticResponse { + filter(t: string) { + return t == 'findInstancesRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createFindInstancesResponse(input as FindInstancesRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createFindInstancesResponse(m: FindInstancesRequest): FindInstancesResponse { + return { + meta: createResponseMeta(m.meta), + type: 'findInstancesResponse', + payload: { + appIdentifiers: [ + { appId: 'One', instanceId: '1' }, + { appId: 'Two', instanceId: '2' }, + { appId: 'Three', instanceId: '3' }, + ], + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/FindIntent.ts b/packages/fdc3-agent-proxy/test/support/responses/FindIntent.ts new file mode 100644 index 000000000..cca73ddca --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/FindIntent.ts @@ -0,0 +1,59 @@ +import { AppMetadata } from '@finos/fdc3-standard'; +import { AutomaticResponse, IntentDetail, TestMessaging, intentDetailMatches } from '../TestMessaging'; +import { + AppRequestMessage, + FindIntentRequest, + FindIntentResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { createResponseMeta } from './support'; + +export class FindIntent implements AutomaticResponse { + filter(t: string) { + return t == 'findIntentRequest'; + } + + action(input: AppRequestMessage, m: TestMessaging) { + const intentRequest = input as FindIntentRequest; + const payload = intentRequest.payload; + const intent = payload.intent; + const context = payload.context?.type; + const resultType = payload.resultType; + const template: IntentDetail = { + intent, + context, + resultType, + }; + + const relevant = m.intentDetails.filter(id => intentDetailMatches(id, template, false)); + const response = this.createFindIntentResponseMessage(intentRequest, relevant); + //TODO: annotate why this timeout is needed + setTimeout(() => { + m.receive(response); + }, 100); + return Promise.resolve(); + } + + private createFindIntentResponseMessage(m: FindIntentRequest, relevant: IntentDetail[]): FindIntentResponse { + return { + meta: createResponseMeta(m.meta), + type: 'findIntentResponse', + payload: { + appIntent: { + apps: relevant.reduce((filtered: AppMetadata[], r) => { + if (r?.app?.appId) { + filtered.push({ + appId: r.app?.appId, + instanceId: r.app?.instanceId, + }); + } + return filtered; + }, []), + intent: { + displayName: m.payload.intent, + name: m.payload.intent, + }, + }, + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/FindIntentByContext.ts b/packages/fdc3-agent-proxy/test/support/responses/FindIntentByContext.ts new file mode 100644 index 000000000..ab3b26477 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/FindIntentByContext.ts @@ -0,0 +1,58 @@ +import { + FindIntentsByContextRequest, + FindIntentsByContextResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, IntentDetail, TestMessaging, intentDetailMatches } from '../TestMessaging'; +import { createResponseMeta } from './support'; + +export class FindIntentByContext implements AutomaticResponse { + filter(t: string) { + return t == 'findIntentsByContextRequest'; + } + + action(input: object, m: TestMessaging) { + const intentRequest = input as FindIntentsByContextRequest; + const payload = intentRequest.payload; + const context = payload?.context?.type; + const template: IntentDetail = { + context, + }; + + const relevant = m.intentDetails.filter(id => intentDetailMatches(id, template, true)); + const request = this.createFindIntentsByContextResponseMessage(intentRequest, relevant); + setTimeout(() => { + m.receive(request); + }, 100); + return Promise.resolve(); + } + + private createFindIntentsByContextResponseMessage( + m: FindIntentsByContextRequest, + relevant: IntentDetail[] + ): FindIntentsByContextResponse { + //get unique intent names + const relevantIntents = [ + ...new Set( + relevant.reduce((filtered: string[], r) => { + if (r.intent) { + filtered.push(r.intent); + } + return filtered; + }, []) + ), + ]; + + return { + meta: createResponseMeta(m.meta), + type: 'findIntentsByContextResponse', + payload: { + appIntents: relevantIntents.map(i => { + return { + intent: { name: i, displayName: i }, + apps: relevant.filter(r => r.intent === i && r.app).map(r => r.app!), + }; + }), + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/GetAppMetadata.ts b/packages/fdc3-agent-proxy/test/support/responses/GetAppMetadata.ts new file mode 100644 index 000000000..a8c48839b --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/GetAppMetadata.ts @@ -0,0 +1,32 @@ +import { GetAppMetadataRequest, GetAppMetadataResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; + +export class GetAppMetadata implements AutomaticResponse { + filter(t: string) { + return t == 'getAppMetadataRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createMetadataResponseMessage(input as GetAppMetadataRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createMetadataResponseMessage(m: GetAppMetadataRequest): GetAppMetadataResponse { + return { + meta: createResponseMeta(m.meta), + type: 'getAppMetadataResponse', + payload: { + appMetadata: { + appId: m.payload.app.appId, + name: 'Metadata Name', + description: 'Metadata Description', + }, + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/GetInfo.ts b/packages/fdc3-agent-proxy/test/support/responses/GetInfo.ts new file mode 100644 index 000000000..3ede9978b --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/GetInfo.ts @@ -0,0 +1,41 @@ +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; +import { GetInfoRequest, GetInfoResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class GetInfo implements AutomaticResponse { + filter(t: string) { + return t == 'getInfoRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createInfoResponseMessage(input as GetInfoRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createInfoResponseMessage(m: GetInfoRequest): GetInfoResponse { + return { + meta: createResponseMeta(m.meta), + type: 'getInfoResponse', + payload: { + implementationMetadata: { + appMetadata: { + appId: 'cucumber-app', + instanceId: 'cucumber-instance', + }, + fdc3Version: '2.0', + optionalFeatures: { + DesktopAgentBridging: false, + OriginatingAppMetadata: true, + UserChannelMembershipAPIs: true, + }, + provider: 'cucumber-provider', + providerVersion: 'test', + }, + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/GetOrCreateChannel.ts b/packages/fdc3-agent-proxy/test/support/responses/GetOrCreateChannel.ts new file mode 100644 index 000000000..4aff3bec6 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/GetOrCreateChannel.ts @@ -0,0 +1,62 @@ +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { ChannelError } from '@finos/fdc3-standard'; +import { createResponseMeta } from './support'; +import { + AppRequestMessage, + GetOrCreateChannelRequest, + GetOrCreateChannelResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type ChannelType = { [channelId: string]: 'user' | 'app' | 'private' }; + +export class GetOrCreateChannel implements AutomaticResponse { + private type: ChannelType = {}; + + filter(t: string) { + return t == 'getOrCreateChannelRequest'; + } + + action(input: AppRequestMessage, m: TestMessaging) { + const out = this.registerChannel(input as GetOrCreateChannelRequest); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + registerChannel(r: GetOrCreateChannelRequest): GetOrCreateChannelResponse { + const id = r.payload.channelId; + const type = 'app'; + + const existingType = this.type[id]; + + if (existingType && existingType != type) { + // channel already exists + return { + type: 'getOrCreateChannelResponse', + meta: createResponseMeta(r.meta), + payload: { + error: ChannelError.AccessDenied, + }, + }; + } else { + this.type[id] = type; + return { + type: 'getOrCreateChannelResponse', + meta: createResponseMeta(r.meta), + payload: { + channel: { + id, + type, + displayMetadata: { + name: 'The ' + id + ' Channel', + color: 'cerulean blue', + glyph: 'triangle', + }, + }, + }, + }; + } + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/GetUserChannels.ts b/packages/fdc3-agent-proxy/test/support/responses/GetUserChannels.ts new file mode 100644 index 000000000..43652fd81 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/GetUserChannels.ts @@ -0,0 +1,45 @@ +import { + Channel, + GetUserChannelsRequest, + GetUserChannelsResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; + +export class GetUserChannels implements AutomaticResponse { + filter(t: string) { + return t == 'getUserChannelsRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createResponse(input as GetUserChannelsRequest, m); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: GetUserChannelsRequest, m: TestMessaging): GetUserChannelsResponse { + const userChannels: Channel[] = Object.keys(m.channelState).map(c => { + const aChannel: Channel = { + id: c, + type: 'user', + displayMetadata: { + name: 'The ' + c + ' channel', + color: 'red', + glyph: 'triangle', + }, + }; + return aChannel; + }); + + return { + meta: createResponseMeta(i.meta), + type: 'getUserChannelsResponse', + payload: { + userChannels, + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/IntentResult.ts b/packages/fdc3-agent-proxy/test/support/responses/IntentResult.ts new file mode 100644 index 000000000..720f71a7d --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/IntentResult.ts @@ -0,0 +1,35 @@ +import { IntentResultRequest, IntentResultResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; + +export class IntentResult implements AutomaticResponse { + filter(t: string) { + return t == 'intentResultRequest'; + } + + createIntentResultResponseMessage(intentRequest: IntentResultRequest, m: TestMessaging): IntentResultResponse { + const out: IntentResultResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: {}, + type: 'intentResultResponse', + }; + + return out; + } + + action(input: object, m: TestMessaging) { + const intentRequest = input as IntentResultRequest; + const payload = intentRequest.payload; + + m.setIntentResult(payload.intentResult); + + // next, send the result response + const out2 = this.createIntentResultResponseMessage(intentRequest, m); + setTimeout(() => { + m.receive(out2); + }, 100); + return Promise.resolve(); + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/Open.ts b/packages/fdc3-agent-proxy/test/support/responses/Open.ts new file mode 100644 index 000000000..7ab916ae0 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/Open.ts @@ -0,0 +1,43 @@ +import { OpenRequest, OpenResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; + +export class Open implements AutomaticResponse { + filter(t: string) { + return t == 'openRequest'; + } + + action(input: object, m: TestMessaging) { + const out = this.createOpenResponse(input as OpenRequest, m); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createOpenResponse(m: OpenRequest, tm: TestMessaging): OpenResponse { + const found = tm.intentDetails.find(id => id.app?.appId == m.payload.app.appId); + + if (found && found.app) { + return { + meta: createResponseMeta(m.meta), + type: 'openResponse', + payload: { + appIdentifier: { + appId: found.app.appId, + instanceId: 'abc123', + }, + }, + } as OpenResponse; + } else { + return { + meta: createResponseMeta(m.meta), + type: 'openResponse', + payload: { + error: 'AppNotFound', + }, + } as OpenResponse; + } + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/RaiseIntent.ts b/packages/fdc3-agent-proxy/test/support/responses/RaiseIntent.ts new file mode 100644 index 000000000..38cfd5384 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/RaiseIntent.ts @@ -0,0 +1,171 @@ +import { + RaiseIntentRequest, + RaiseIntentResponse, + RaiseIntentResultResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, IntentDetail, intentDetailMatches, TestMessaging } from '../TestMessaging'; +import { AppMetadata, ResolveError } from '@finos/fdc3-standard'; +import { createResponseMeta } from './support'; + +export class RaiseIntent implements AutomaticResponse { + filter(t: string) { + return t == 'raiseIntentRequest'; + } + + createCannedRaiseIntentResponseMessage(intentRequest: RaiseIntentRequest, m: TestMessaging): RaiseIntentResponse { + const result = m.getIntentResult(); + + if (result && result.error) { + const out: RaiseIntentResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + error: result.error, + }, + type: 'raiseIntentResponse', + }; + + return out; + } else if (result) { + const out: RaiseIntentResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + intentResolution: { + intent: intentRequest.payload.intent, + source: { + appId: 'some-app', + instanceId: 'abc123', + }, + }, + }, + type: 'raiseIntentResponse', + }; + + return out; + } else { + throw new Error('TestMessaging did not return an IntentResult'); + } + } + + private createRaiseIntentResponseMessage( + intentRequest: RaiseIntentRequest, + relevant: IntentDetail[], + m: TestMessaging + ): RaiseIntentResponse { + if (relevant.length == 0) { + return { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + type: 'raiseIntentResponse', + payload: { + error: ResolveError.NoAppsFound, + }, + }; + } else if (relevant.length == 1 && relevant[0].intent && relevant[0].app) { + return { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + type: 'raiseIntentResponse', + payload: { + intentResolution: { + intent: relevant[0].intent, + source: relevant[0].app, + }, + }, + }; + } else if (relevant.length > 0) { + return { + meta: createResponseMeta(intentRequest.meta), + type: 'raiseIntentResponse', + payload: { + appIntent: { + apps: relevant.reduce((filtered, r) => { + if (r.app?.appId) { + filtered.push({ + appId: r.app.appId, + instanceId: r.app.instanceId, + }); + } + return filtered; + }, []), + intent: { + displayName: intentRequest.payload.intent, + name: intentRequest.payload.intent, + }, + }, + }, + }; + } else { + throw new Error('createRaiseIntentResponseMessage did not produce a valid result!'); + } + } + + createRaiseIntentResultResponseMessage( + intentRequest: RaiseIntentRequest, + m: TestMessaging + ): RaiseIntentResultResponse | undefined { + const result = m.getIntentResult(); + if (result?.error) { + return undefined; + } else if (result) { + const out: RaiseIntentResultResponse = { + meta: createResponseMeta(intentRequest.meta), + payload: { + intentResult: result, + }, + type: 'raiseIntentResultResponse', + }; + + return out; + } else { + return; + } + } + + action(input: object, m: TestMessaging) { + const intentRequest = input as RaiseIntentRequest; + const payload = intentRequest.payload; + const intent = payload.intent; + const context = payload?.context?.type; + + if (m.getIntentResult() == undefined) { + // we're going to figure out the right response based on the app details (a la FindIntent) + const app = payload?.app; + const using: IntentDetail = { + intent, + context, + app, + }; + + const relevant = m.intentDetails.filter(id => intentDetailMatches(id, using, false)); + const request = this.createRaiseIntentResponseMessage(intentRequest, relevant, m); + setTimeout(() => { + m.receive(request); + }, 100); + } else if (!m.getIntentResult()?.timeout) { + // this sends out the pre-set intent resolution + const out1 = this.createCannedRaiseIntentResponseMessage(intentRequest, m); + setTimeout(() => { + m.receive(out1); + }, 100); + + // next, send the result response + const out2 = this.createRaiseIntentResultResponseMessage(intentRequest, m); + if (out2) { + setTimeout(() => { + m.receive(out2); + }, 300); + } + } + return Promise.resolve(); + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/RaiseIntentForContext.ts b/packages/fdc3-agent-proxy/test/support/responses/RaiseIntentForContext.ts new file mode 100644 index 000000000..e1a0de607 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/RaiseIntentForContext.ts @@ -0,0 +1,179 @@ +import { + RaiseIntentForContextRequest, + RaiseIntentForContextResponse, + RaiseIntentResultResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, IntentDetail, intentDetailMatches, TestMessaging } from '../TestMessaging'; +import { AppIdentifier, AppIntent, ResolveError } from '@finos/fdc3-standard'; +import { createResponseMeta } from './support'; + +export class RaiseIntentForContext implements AutomaticResponse { + filter(t: string) { + return t == 'raiseIntentForContextRequest'; + } + + createCannedRaiseIntentForContextResponseMessage( + intentRequest: RaiseIntentForContextRequest, + m: TestMessaging + ): RaiseIntentForContextResponse { + const result = m.getIntentResult(); + if (result && result.error) { + const out: RaiseIntentForContextResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + error: result.error, + }, + type: 'raiseIntentForContextResponse', + }; + + return out; + } else { + const out: RaiseIntentForContextResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + intentResolution: { + intent: 'some-canned-intent', + source: { + appId: 'some-app', + instanceId: 'abc123', + }, + }, + }, + type: 'raiseIntentForContextResponse', + }; + + return out; + } + } + + private createRaiseIntentForContextResponseMessage( + intentRequest: RaiseIntentForContextRequest, + relevant: IntentDetail[], + m: TestMessaging + ): RaiseIntentForContextResponse { + if (relevant.length == 0) { + return { + meta: createResponseMeta(intentRequest.meta), + type: 'raiseIntentForContextResponse', + payload: { + error: ResolveError.NoAppsFound, + }, + }; + } else if (relevant.length == 1 && relevant[0].intent && relevant[0].app) { + return { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + type: 'raiseIntentForContextResponse', + payload: { + intentResolution: { + intent: relevant[0].intent, + source: relevant[0].app, + }, + }, + }; + } else if (relevant.length > 0) { + //get unique intent names + const relevantIntents = [ + ...new Set( + relevant.reduce((filtered: string[], r) => { + if (r.intent) { + filtered.push(r.intent); + } + return filtered; + }, []) + ), + ]; + const appIntents = relevantIntents.map(i => { + return { + intent: { name: i, displayName: i }, + apps: relevant.reduce((filtered: AppIdentifier[], r) => { + if (r.intent === i && r.app) { + filtered.push(r.app); + } + return filtered; + }, []), + }; + }); + + return { + meta: createResponseMeta(intentRequest.meta), + type: 'raiseIntentForContextResponse', + payload: { + appIntents: appIntents, + }, + }; + } else { + throw new Error('createRaiseIntentForContextResponseMessage did not produce a valid result!'); + } + } + + createRaiseIntentResultResponseMessage( + intentRequest: RaiseIntentForContextRequest, + m: TestMessaging + ): RaiseIntentResultResponse | undefined { + const result = m.getIntentResult(); + if (result && result.error) { + return undefined; + } else if (result) { + const out: RaiseIntentResultResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + intentResult: result, + }, + type: 'raiseIntentResultResponse', + }; + + return out; + } else { + throw new Error(''); + } + } + + action(input: object, m: TestMessaging) { + const intentRequest = input as RaiseIntentForContextRequest; + const payload = intentRequest.payload; + const context = payload?.context?.type; + + if (m.getIntentResult() == undefined) { + // we're going to figure out the right response based on the app details (a la FindIntent) + const app = payload?.app; + const using: IntentDetail = { + context, + app, + }; + + const relevant = m.intentDetails.filter(id => intentDetailMatches(id, using, false)); + const request = this.createRaiseIntentForContextResponseMessage(intentRequest, relevant, m); + setTimeout(() => { + m.receive(request); + }, 100); + } else if (!m.getIntentResult()?.timeout) { + // this sends out the pre-set intent resolution + const out1 = this.createCannedRaiseIntentForContextResponseMessage(intentRequest, m); + setTimeout(() => { + m.receive(out1); + }, 100); + + // next, send the result response + const out2 = this.createRaiseIntentResultResponseMessage(intentRequest, m); + if (out2) { + setTimeout(() => { + m.receive(out2); + }, 300); + } + } + + return Promise.resolve(); + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/RegisterListeners.ts b/packages/fdc3-agent-proxy/test/support/responses/RegisterListeners.ts new file mode 100644 index 000000000..561d8c5c8 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/RegisterListeners.ts @@ -0,0 +1,56 @@ +import { + AddContextListenerRequest, + AddContextListenerResponse, + AddEventListenerRequest, + AddEventListenerResponse, + AddIntentListenerRequest, + AddIntentListenerResponse, + AppRequestMessage, + PrivateChannelAddEventListenerRequest, + PrivateChannelAddEventListenerResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; +import { v4 as uuidv4 } from 'uuid'; + +type Requests = + | AddContextListenerRequest + | AddIntentListenerRequest + | AddEventListenerRequest + | PrivateChannelAddEventListenerRequest; +type Responses = + | AddContextListenerResponse + | AddIntentListenerResponse + | AddEventListenerResponse + | PrivateChannelAddEventListenerResponse; + +export class RegisterListeners implements AutomaticResponse { + filter(t: string) { + return ( + t == 'addContextListenerRequest' || + t == 'addIntentListenerRequest' || + t == 'addEventListenerRequest' || + t == 'privateChannelAddEventListenerRequest' + ); + } + + action(input: AppRequestMessage, m: TestMessaging) { + const out = this.createResponse(input as Requests); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: Requests): Responses { + return { + meta: createResponseMeta(i.meta), + //TODO: use a typesafe method of creating response messages + type: i.type.replace('Request', 'Response') as Responses['type'], + payload: { + listenerUUID: uuidv4(), + }, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/UnsubscribeListeners.ts b/packages/fdc3-agent-proxy/test/support/responses/UnsubscribeListeners.ts new file mode 100644 index 000000000..203dac233 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/UnsubscribeListeners.ts @@ -0,0 +1,52 @@ +import { + AppRequestMessage, + ContextListenerUnsubscribeRequest, + ContextListenerUnsubscribeResponse, + EventListenerUnsubscribeRequest, + IntentListenerUnsubscribeRequest, + IntentListenerUnsubscribeResponse, + PrivateChannelUnsubscribeEventListenerRequest, + PrivateChannelUnsubscribeEventListenerResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AutomaticResponse, TestMessaging } from '../TestMessaging'; +import { createResponseMeta } from './support'; +import { EventListenerUnsubscribeResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type Requests = + | IntentListenerUnsubscribeRequest + | PrivateChannelUnsubscribeEventListenerRequest + | ContextListenerUnsubscribeRequest + | EventListenerUnsubscribeRequest; +type Responses = + | IntentListenerUnsubscribeResponse + | PrivateChannelUnsubscribeEventListenerResponse + | ContextListenerUnsubscribeResponse + | EventListenerUnsubscribeResponse; + +export class UnsubscribeListeners implements AutomaticResponse { + filter(t: string) { + return ( + t == 'intentListenerUnsubscribeRequest' || + t == 'privateChannelUnsubscribeEventListenerRequest' || + t == 'contextListenerUnsubscribeRequest' || + t == 'eventListenerUnsubscribeRequest' + ); + } + + action(input: AppRequestMessage, m: TestMessaging) { + const out = this.createResponse(input as Requests); + + setTimeout(() => { + m.receive(out); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: Requests): Responses { + return { + meta: createResponseMeta(i.meta), + type: i.type.replace('Request', 'Response') as Responses['type'], + payload: {}, + }; + } +} diff --git a/packages/fdc3-agent-proxy/test/support/responses/support.ts b/packages/fdc3-agent-proxy/test/support/responses/support.ts new file mode 100644 index 000000000..f0f6fe8b4 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/support/responses/support.ts @@ -0,0 +1,12 @@ +import { AppRequestMessageMeta, AgentResponseMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { v4 as uuidv4 } from 'uuid'; + +export function createResponseMeta(m: AppRequestMessageMeta): AgentResponseMessage['meta'] { + const meta: AgentResponseMessage['meta'] = { + requestUuid: m.requestUuid, + responseUuid: uuidv4(), + source: m.source, + timestamp: new Date(), + }; + return meta; +} diff --git a/packages/fdc3-agent-proxy/test/world/index.ts b/packages/fdc3-agent-proxy/test/world/index.ts new file mode 100644 index 000000000..8010a0742 --- /dev/null +++ b/packages/fdc3-agent-proxy/test/world/index.ts @@ -0,0 +1,9 @@ +import { setWorldConstructor } from '@cucumber/cucumber'; +import { TestMessaging } from '../support/TestMessaging'; +import { PropsWorld } from '@finos/testing'; + +export class CustomWorld extends PropsWorld { + messaging: TestMessaging | null = null; +} + +setWorldConstructor(CustomWorld); diff --git a/packages/fdc3-agent-proxy/tsconfig.json b/packages/fdc3-agent-proxy/tsconfig.json new file mode 100644 index 000000000..fb0c43bc4 --- /dev/null +++ b/packages/fdc3-agent-proxy/tsconfig.json @@ -0,0 +1,34 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src", + "test" + ], + "outDir": "dist", + }, + "include": [ + "src" + ], + "exclude": [ + "test/**", + "dist/**" + ], + "references": [ + { + "path": "../fdc3-standard" + }, + { + "path": "../fdc3-schema" + }, + { + "path": "../fdc3-context" + }, + { + "path": "../testing" + }, + { + "path": "../fdc3-context" + } + ] +} \ No newline at end of file diff --git a/packages/fdc3-commonjs/README.md b/packages/fdc3-commonjs/README.md new file mode 100644 index 000000000..60c7e26a1 --- /dev/null +++ b/packages/fdc3-commonjs/README.md @@ -0,0 +1,57 @@ +# FDC3 CommonJS Module + +This is the CommonJS module version of the Financial Desktop Connectivity and Collaboration Consortium (FDC3) javascript API. + +## Warning + +CommonJS is no longer the recommended module system for JavaScript. We recommend using the FDC3 ES6 module at `@finos/fdc3` instead. The FDC3 CommonJS module is provided for compatibility with older projects that use CommonJS. + +## Installation + +To install the FDC3 CommonJS module, use npm: + +```bash +npm install @finos/fdc3-commonjs +``` + +## Usage + +To use the FDC3 CommonJS module in your project, require it as follows: + +```javascript +const fdc3CommonJs = require('@finos/fdc3-commonjs'); + +// getAgent() returns the FDC3 Desktop Agent +const fdc3 = fdc3CommonJs.getAgent(); + +// Example usage +const contact = { + type: 'fdc3.contact', + name: 'Jane Doe', + id: { + email: 'jane@mail.com' + } +}; + +fdc3.raiseIntent('ViewProfile', contact); +``` + +## Documentation + +For detailed documentation and API reference, please visit the [official FDC3 documentation](https://fdc3.finos.org/docs/api/overview). + +## Contributing + +We welcome contributions to the FDC3 project. Please see our [contributing guidelines](https://github.com/finos/FDC3/blob/main/CONTRIBUTING.md) for more information. + +## License + +This project is licensed under the [Apache 2.0 License](LICENSE). + +## Contact + +For any questions or support, please reach out to the FDC3 community on our [Slack channel](https://finos-lf.slack.com/archives/CJ8Q8H4Q1) or [mailing list](mailto:fdc3@finos.org). + +## Further Details + +Further details are avilable in the main [FDC3 Project README](https://github.com/finos/FDC3) diff --git a/packages/fdc3-commonjs/package.json b/packages/fdc3-commonjs/package.json new file mode 100644 index 000000000..5ebe548a1 --- /dev/null +++ b/packages/fdc3-commonjs/package.json @@ -0,0 +1,34 @@ +{ + "name": "@finos/fdc3-commonjs", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "exports": { + "require": "./dist/index.cjs" + }, + "license": "Apache-2.0", + "files": [ + "dist" + ], + "scripts": { + "clean": "npx rimraf dist", + "build": "npx rollup -c rollup.config.mjs" + }, + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^12.1.1", + "rollup": "^4.27.4" + } +} \ No newline at end of file diff --git a/packages/fdc3-commonjs/rollup.config.mjs b/packages/fdc3-commonjs/rollup.config.mjs new file mode 100644 index 000000000..88bcb5a93 --- /dev/null +++ b/packages/fdc3-commonjs/rollup.config.mjs @@ -0,0 +1,35 @@ +import typescript from '@rollup/plugin-typescript'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; + +export default [ + { + input: 'src/index.ts', + + // Property inherited from TSDX. To understand what this is doing, see comments: + // https://github.com/jaredpalmer/tsdx/blob/master/src/createRollupConfig.ts#L77 + treeshake: { + propertyReadSideEffects: false, + }, + + output: { + file: 'dist/index.cjs', + format: 'cjs', + freeze: false, + esModule: false, + sourcemap: true, + exports: 'named', + }, + + plugins: [ + nodeResolve(), + commonjs({ + // use a regex to make sure to include eventual hoisted packages (RM: what is this?) + include: /\/regenerator-runtime\//, + }), + json(), + typescript(), + ], + }, +]; diff --git a/packages/fdc3-commonjs/src/index.ts b/packages/fdc3-commonjs/src/index.ts new file mode 100644 index 000000000..fdb8e2a19 --- /dev/null +++ b/packages/fdc3-commonjs/src/index.ts @@ -0,0 +1 @@ +export * from '@finos/fdc3'; diff --git a/src/bridging/README.md b/packages/fdc3-context/README-Bridging.md similarity index 100% rename from src/bridging/README.md rename to packages/fdc3-context/README-Bridging.md diff --git a/src/context/README.md b/packages/fdc3-context/README-Context.md similarity index 100% rename from src/context/README.md rename to packages/fdc3-context/README-Context.md diff --git a/packages/fdc3-context/eslint.config.mjs b/packages/fdc3-context/eslint.config.mjs new file mode 100644 index 000000000..3bf4cdcbc --- /dev/null +++ b/packages/fdc3-context/eslint.config.mjs @@ -0,0 +1,62 @@ +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import jsxA11Y from 'eslint-plugin-jsx-a11y'; +import globals from 'globals'; +import tsParser from '@typescript-eslint/parser'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import js from '@eslint/js'; +import { FlatCompat } from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + ...compat.extends( + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier' + ), + { + files: ['**/*.ts', '**/*.tsx'], + + plugins: { + '@typescript-eslint': typescriptEslint, + 'jsx-a11y': jsxA11Y, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.jest, + }, + + parser: tsParser, + ecmaVersion: 5, + sourceType: 'script', + + parserOptions: { + project: ['./tsconfig.json'], + }, + }, + + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'warn', + '@typescript-eslint/no-empty-interface': 'warn', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-explicit-any': 'off', + + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + }, + }, +]; diff --git a/packages/fdc3-context/generated/context/ContextTypes.ts b/packages/fdc3-context/generated/context/ContextTypes.ts new file mode 100644 index 000000000..99bf6e8e9 --- /dev/null +++ b/packages/fdc3-context/generated/context/ContextTypes.ts @@ -0,0 +1,3151 @@ +// To parse this data: +// +// import { Convert, Action, Chart, ChatInitSettings, ChatMessage, ChatRoom, ChatSearchCriteria, Contact, ContactList, Context, Country, Currency, Email, FileAttachment, Instrument, InstrumentList, Interaction, Message, Nothing, Order, OrderList, Organization, Portfolio, Position, Product, TimeRange, Trade, TradeList, TransactionResult, Valuation } from "./file"; +// +// const action = Convert.toAction(json); +// const chart = Convert.toChart(json); +// const chatInitSettings = Convert.toChatInitSettings(json); +// const chatMessage = Convert.toChatMessage(json); +// const chatRoom = Convert.toChatRoom(json); +// const chatSearchCriteria = Convert.toChatSearchCriteria(json); +// const contact = Convert.toContact(json); +// const contactList = Convert.toContactList(json); +// const context = Convert.toContext(json); +// const country = Convert.toCountry(json); +// const currency = Convert.toCurrency(json); +// const email = Convert.toEmail(json); +// const fileAttachment = Convert.toFileAttachment(json); +// const instrument = Convert.toInstrument(json); +// const instrumentList = Convert.toInstrumentList(json); +// const interaction = Convert.toInteraction(json); +// const message = Convert.toMessage(json); +// const nothing = Convert.toNothing(json); +// const order = Convert.toOrder(json); +// const orderList = Convert.toOrderList(json); +// const organization = Convert.toOrganization(json); +// const portfolio = Convert.toPortfolio(json); +// const position = Convert.toPosition(json); +// const product = Convert.toProduct(json); +// const timeRange = Convert.toTimeRange(json); +// const trade = Convert.toTrade(json); +// const tradeList = Convert.toTradeList(json); +// const transactionResult = Convert.toTransactionResult(json); +// const valuation = Convert.toValuation(json); +// +// These functions will throw an error if the JSON doesn't +// match the expected interface, even if the JSON is valid. + +/** + * A representation of an FDC3 Action (specified via a Context or Context & Intent) that can + * be inserted inside another object, for example a chat message. + * + * The action may be completed by calling: + * - `fdc3.raiseIntent()` with the specified Intent and Context + * - `fdc3.raiseIntentForContext()` if only a context is specified, (which the Desktop Agent + * will resolve by presenting the user with a list of available Intents for the Context). + * - `channel.broadcast()` with the specified Context, if the `broadcast` action has been + * defined. + * + * Accepts an optional `app` parameter in order to specify a specific app. + */ +export interface Action { + /** + * The **action** field indicates the type of action: + * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` + * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if + * given). + * - **broadcast** : If `broadcast` and a `channelId` are specified then + * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the + * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, + * the context should be broadcast to the current channel (`fdc3.broadcast()`) + */ + action?: ActionType; + /** + * An optional target application identifier that should perform the action. The `app` + * property is ignored unless the action is raiseIntent. + */ + app?: AppIdentifier; + /** + * Optional channel on which to broadcast the context. The `channelId` property is ignored + * unless the `action` is broadcast. + */ + channelId?: string; + /** + * A context object with which the action will be performed + */ + context: ContextElement; + /** + * Optional Intent to raise to perform the actions. Should reference an intent type name, + * such as those defined in the FDC3 Standard. If intent is not set then + * `fdc3.raiseIntentForContext` should be used to perform the action as this will usually + * allow the user to choose the intent to raise. + */ + intent?: string; + /** + * A human readable display name for the action + */ + title: string; + type: 'fdc3.action'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * The **action** field indicates the type of action: + * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` + * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if + * given). + * - **broadcast** : If `broadcast` and a `channelId` are specified then + * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the + * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, + * the context should be broadcast to the current channel (`fdc3.broadcast()`) + */ +export type ActionType = 'broadcast' | 'raiseIntent'; + +/** + * An optional target application identifier that should perform the action. The `app` + * property is ignored unless the action is raiseIntent. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + */ +export interface AppIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * A context object with which the action will be performed + * + * A context object returned by the transaction, possibly with updated data. + * + * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by + * FDC3 operations. As such, it is not really meant to be used on its own, but is imported + * by more specific type definitions (standardized or custom) to provide the structure and + * properties shared by all FDC3 context data types. + * + * The key element of FDC3 context types is their mandatory `type` property, which is used + * to identify what type of data the object represents, and what shape it has. + * + * The FDC3 context type, and all derived types, define the minimum set of fields a context + * data object of a particular type can be expected to have, but this can always be extended + * with custom fields as appropriate. + */ +export interface ContextElement { + /** + * Context data objects may include a set of equivalent key-value pairs that can be used to + * help applications identify and look up the context type they receive in their own domain. + * The idea behind this design is that applications can provide as many equivalent + * identifiers to a target application as possible, e.g. an instrument may be represented by + * an ISIN, CUSIP or Bloomberg identifier. + * + * Identifiers do not make sense for all types of data, so the `id` property is therefore + * optional, but some derived types may choose to require at least one identifier. + * Identifier values SHOULD always be of type string. + */ + id?: { [key: string]: any }; + /** + * Context data objects may include a name property that can be used for more information, + * or display purposes. Some derived types may require the name object as mandatory, + * depending on use case. + */ + name?: string; + /** + * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 + * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present + * to route shared context data appropriately. + * + * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data + * types they support in an FDC3 [App + * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery + * and routing. + * + * Standardized FDC3 context types have well-known `type` properties prefixed with the + * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and + * used by a particular organization, the convention is to prefix them with an + * organization-specific namespace, e.g. `blackrock.fund`. + * + * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more + * information about context data types. + */ + type: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A context type representing details of a Chart, which may be used to request plotting of + * a particular chart or to otherwise share details of its composition, such as: + * + * - A list of instruments for comparison + * - The time period to plot the chart over + * - The style of chart (line, bar, mountain, candle etc.) + * - Other settings such as indicators to calculate, or data representing drawings and + * annotations. + * + * In addition to handling requests to plot charts, a charting application may use this type + * to output a representation of what it is currently displaying so that it can be recorded + * by another application. + */ +export interface Chart { + /** + * An array of instrument contexts whose data should be plotted. + */ + instruments: InstrumentElement[]; + /** + * It is common for charts to support other configuration, such as indicators, annotations + * etc., which do not have standardized formats, but may be included in the `otherConfig` + * array as context objects. + */ + otherConfig?: ContextElement[]; + /** + * The time range that should be plotted + */ + range?: TimeRangeObject; + /** + * The type of chart that should be plotted + */ + style?: ChartStyle; + type: 'fdc3.chart'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * A financial instrument that relates to the definition of this product + * + * + * + * A financial instrument from any asset class. + */ +export interface InstrumentElement { + /** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + */ + id: PurpleInstrumentIdentifiers; + /** + * The `market` map can be used to further specify the instrument and help achieve + * interoperability between disparate data sources. This is especially useful when using an + * `id` field that is not globally unique. + */ + market?: OrganizationMarket; + /** + * An optional human-readable name for the instrument + */ + name?: string; + type: 'fdc3.instrument'; + [property: string]: any; +} + +/** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + */ +export interface PurpleInstrumentIdentifiers { + /** + * https://www.bloomberg.com/ + */ + BBG?: string; + /** + * https://www.cusip.com/ + */ + CUSIP?: string; + /** + * https://www.factset.com/ + */ + FDS_ID?: string; + /** + * https://www.openfigi.com/ + */ + FIGI?: string; + /** + * https://www.isin.org/ + */ + ISIN?: string; + /** + * https://permid.org/ + */ + PERMID?: string; + /** + * https://www.refinitiv.com/ + */ + RIC?: string; + /** + * https://www.lseg.com/sedol + */ + SEDOL?: string; + /** + * Unstandardized stock tickers + */ + ticker?: string; + [property: string]: any; +} + +/** + * The `market` map can be used to further specify the instrument and help achieve + * interoperability between disparate data sources. This is especially useful when using an + * `id` field that is not globally unique. + */ +export interface OrganizationMarket { + /** + * https://www.bloomberg.com/ + */ + BBG?: string; + /** + * https://www.iso.org/iso-3166-country-codes.html + */ + COUNTRY_ISOALPHA2?: string; + /** + * https://en.wikipedia.org/wiki/Market_Identifier_Code + */ + MIC?: string; + /** + * Human readable market name + */ + name?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * The time range that should be plotted + * + * The time range over which the interaction occurred + * + * A context representing a period of time. Any user interfaces that represent or visualize + * events or activity over time can be filtered or focused on a particular time period, + * e.g.: + * + * - A pricing chart + * - A trade blotter + * - A record of client contact/activity in a CRM + * + * Example use cases: + * + * - User may want to view pricing/trades/customer activity for a security over a particular + * time period, the time range might be specified as the context for the `ViewChart` intent + * OR it might be embedded in another context (e.g. a context representing a chart to plot). + * - User filters a visualization (e.g. a pricing chart) to show a particular period, the + * `TimeRange` is broadcast and other visualizations (e.g. a heatmap of activity by + * instrument, or industry sector etc.) receive it and filter themselves to show data over + * the same range. + * + * Notes: + * + * - A `TimeRange` may be closed (i.e. `startTime` and `endTime` are both known) or open + * (i.e. only one of `startTime` or `endTime` is known). + * - Ranges corresponding to dates (e.g. `2022-05-12` to `2022-05-19`) should be specified + * using times as this prevents issues with timezone conversions and inclusive/exclusive + * date ranges. + * - String fields representing times are encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html). + * - A timezone indicator should be specified, e.g. `"2022-05-12T15:18:03Z"` or + * `"2022-05-12T16:18:03+01:00"` + * - Times MAY be specified with millisecond precision, e.g. `"2022-05-12T15:18:03.349Z"` + */ +export interface TimeRangeObject { + /** + * The end time of the range, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. + */ + endTime?: Date; + /** + * The start time of the range, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. + */ + startTime?: Date; + type: 'fdc3.timeRange'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * The type of chart that should be plotted + */ +export type ChartStyle = + | 'line' + | 'bar' + | 'stacked-bar' + | 'mountain' + | 'candle' + | 'pie' + | 'scatter' + | 'histogram' + | 'heatmap' + | 'custom'; + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A collection of settings to start a new chat conversation + */ +export interface ChatInitSettings { + /** + * Name to apply to the chat created + */ + chatName?: string; + /** + * Contacts to add to the chat + */ + members?: ContactListObject; + /** + * An initial message to post in the chat when created. + */ + message?: MessageObject | string; + /** + * Option settings that affect the creation of the chat + */ + options?: ChatOptions; + type: 'fdc3.chat.initSettings'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * Contacts to add to the chat + * + * A list of contacts involved in the interaction + * + * A collection of contacts, e.g. for chatting to or calling multiple contacts. + * + * The contact list schema does not explicitly include identifiers in the `id` section, as + * there is not a common standard for such identifiers. Applications can, however, populate + * this part of the contract with custom identifiers if so desired. + */ +export interface ContactListObject { + /** + * An array of contact contexts that forms the list. + */ + contacts: ContactElement[]; + /** + * One or more identifiers that refer to the contact list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An optional human-readable summary of the contact list + */ + name?: string; + type: 'fdc3.contactList'; + [property: string]: any; +} + +/** + * The contact that initiated the interaction + * + * A person contact that can be engaged with through email, calling, messaging, CMS, etc. + */ +export interface ContactElement { + /** + * Identifiers that relate to the Contact represented by this context + */ + id: PurpleContactIdentifiers; + /** + * An optional human-readable name for the contact + */ + name?: string; + type: 'fdc3.contact'; + [property: string]: any; +} + +/** + * Identifiers that relate to the Contact represented by this context + */ +export interface PurpleContactIdentifiers { + /** + * The email address for the contact + */ + email?: string; + /** + * FactSet Permanent Identifier representing the contact + */ + FDS_ID?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A chat message to be sent through an instant messaging application. Can contain one or + * several text bodies (organized by mime-type, plaintext or markdown), as well as attached + * entities (either arbitrary file attachments or FDC3 actions to be embedded in the + * message). To be put inside a ChatInitSettings object. + */ +export interface MessageObject { + /** + * A map of string IDs to entities that should be attached to the message, such as an action + * to perform, a file attachment, or other FDC3 context object. + */ + entities?: { [key: string]: EntityValue }; + /** + * A map of string mime-type to string content + */ + text?: PurpleMessageText; + type: 'fdc3.message'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * A representation of an FDC3 Action (specified via a Context or Context & Intent) that can + * be inserted inside another object, for example a chat message. + * + * The action may be completed by calling: + * - `fdc3.raiseIntent()` with the specified Intent and Context + * - `fdc3.raiseIntentForContext()` if only a context is specified, (which the Desktop Agent + * will resolve by presenting the user with a list of available Intents for the Context). + * - `channel.broadcast()` with the specified Context, if the `broadcast` action has been + * defined. + * + * Accepts an optional `app` parameter in order to specify a specific app. + * + * A File attachment encoded in the form of a data URI. Can be added to a Message. + */ +export interface EntityValue { + /** + * The **action** field indicates the type of action: + * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` + * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if + * given). + * - **broadcast** : If `broadcast` and a `channelId` are specified then + * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the + * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, + * the context should be broadcast to the current channel (`fdc3.broadcast()`) + */ + action?: ActionType; + /** + * An optional target application identifier that should perform the action. The `app` + * property is ignored unless the action is raiseIntent. + */ + app?: AppIdentifier; + /** + * Optional channel on which to broadcast the context. The `channelId` property is ignored + * unless the `action` is broadcast. + */ + channelId?: string; + /** + * A context object with which the action will be performed + */ + context?: ContextElement; + /** + * Optional Intent to raise to perform the actions. Should reference an intent type name, + * such as those defined in the FDC3 Standard. If intent is not set then + * `fdc3.raiseIntentForContext` should be used to perform the action as this will usually + * allow the user to choose the intent to raise. + */ + intent?: string; + /** + * A human readable display name for the action + */ + title?: string; + type: EntityType; + id?: { [key: string]: any }; + name?: string; + data?: EntityData; + [property: string]: any; +} + +export interface EntityData { + /** + * A data URI encoding the content of the file to be attached + */ + dataUri: string; + /** + * The name of the attached file + */ + name: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ +export type EntityType = 'fdc3.action' | 'fdc3.fileAttachment'; + +/** + * A map of string mime-type to string content + */ +export interface PurpleMessageText { + /** + * Markdown encoded content + */ + 'text/markdown'?: string; + /** + * Plain text encoded content. + */ + 'text/plain'?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Option settings that affect the creation of the chat + */ +export interface ChatOptions { + /** + * if true members will be allowed to add other members to the chat + */ + allowAddUser?: boolean; + /** + * if true members will be allowed to browse past messages + */ + allowHistoryBrowsing?: boolean; + /** + * if true members will be allowed to copy/paste messages + */ + allowMessageCopy?: boolean; + /** + * if false a separate chat will be created for each member + */ + groupRecipients?: boolean; + /** + * if true the room will be visible to everyone in the chat application + */ + isPublic?: boolean; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A context representing a chat message. Typically used to send the message or to + * pre-populate a message for sending. + */ +export interface ChatMessage { + chatRoom: ChatRoomObject; + message: MessageObject; + type: 'fdc3.chat.message'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * Reference to the chat room which could be used to send a message to the room + */ +export interface ChatRoomObject { + /** + * Identifier(s) for the chat - currently unstandardized + */ + id: { [key: string]: string }; + /** + * Display name for the chat room + */ + name?: string; + /** + * The name of the service that hosts the chat + */ + providerName: string; + type: 'fdc3.chat.room'; + /** + * Universal url to access to the room. It could be opened from a browser, a mobile app, + * etc... + */ + url?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Reference to the chat room which could be used to send a message to the room + */ +export interface ChatRoom { + /** + * Identifier(s) for the chat - currently unstandardized + */ + id: { [key: string]: string }; + /** + * Display name for the chat room + */ + name?: string; + /** + * The name of the service that hosts the chat + */ + providerName: string; + type: 'fdc3.chat.room'; + /** + * Universal url to access to the room. It could be opened from a browser, a mobile app, + * etc... + */ + url?: string; + [property: string]: any; +} + +/** + * A context type that represents a simple search criterion, based on a list of other + * context objects, that can be used to search or filter messages in a chat application. + */ +export interface ChatSearchCriteria { + /** + * An array of criteria that should match chats returned from by a search. + * + * ⚠️ Operators (and/or/not) are not defined in `fdc3.chat.searchCriteria`. It is up to the + * application that processes the FDC3 Intent to choose and apply the operators between the + * criteria. + * + * Empty search criteria can be supported to allow resetting of filters. + */ + criteria: Array; + type: 'fdc3.chat.searchCriteria'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * A financial instrument that relates to the definition of this product + * + * + * + * A financial instrument from any asset class. + * + * An entity that can be used when referencing private companies and other organizations + * where a specific instrument is not available or desired e.g. CRM and News workflows. + * + * It is valid to include extra properties and metadata as part of the organization payload, + * but the minimum requirement is for at least one specified identifier to be provided. + * + * The contact that initiated the interaction + * + * A person contact that can be engaged with through email, calling, messaging, CMS, etc. + */ +export interface OrganizationObject { + /** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + * + * Identifiers for the organization, at least one must be provided. + * + * Identifiers that relate to the Contact represented by this context + */ + id: Identifiers; + /** + * The `market` map can be used to further specify the instrument and help achieve + * interoperability between disparate data sources. This is especially useful when using an + * `id` field that is not globally unique. + */ + market?: OrganizationMarket; + /** + * An optional human-readable name for the instrument + * + * An optional human-readable name of the organization + * + * An optional human-readable name for the contact + */ + name?: string; + type: TentacledInteractionType; + [property: string]: any; +} + +/** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + * + * Identifiers for the organization, at least one must be provided. + * + * Identifiers that relate to the Contact represented by this context + */ +export interface Identifiers { + /** + * https://www.bloomberg.com/ + */ + BBG?: string; + /** + * https://www.cusip.com/ + */ + CUSIP?: string; + /** + * https://www.factset.com/ + * + * FactSet Permanent Identifier representing the organization + * + * FactSet Permanent Identifier representing the contact + */ + FDS_ID?: string; + /** + * https://www.openfigi.com/ + */ + FIGI?: string; + /** + * https://www.isin.org/ + */ + ISIN?: string; + /** + * https://permid.org/ + * + * Refinitiv Permanent Identifiers, or PermID for the organization + */ + PERMID?: string; + /** + * https://www.refinitiv.com/ + */ + RIC?: string; + /** + * https://www.lseg.com/sedol + */ + SEDOL?: string; + /** + * Unstandardized stock tickers + */ + ticker?: string; + /** + * The Legal Entity Identifier (LEI) is a 20-character, alpha-numeric code based on the ISO + * 17442 standard developed by the International Organization for Standardization (ISO). It + * connects to key reference information that enables clear and unique identification of + * legal entities participating in financial transactions. + */ + LEI?: string; + /** + * The email address for the contact + */ + email?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ +export type TentacledInteractionType = 'fdc3.instrument' | 'fdc3.organization' | 'fdc3.contact'; + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A person contact that can be engaged with through email, calling, messaging, CMS, etc. + */ +export interface Contact { + /** + * Identifiers that relate to the Contact represented by this context + */ + id: FluffyContactIdentifiers; + /** + * An optional human-readable name for the contact + */ + name?: string; + type: 'fdc3.contact'; + [property: string]: any; +} + +/** + * Identifiers that relate to the Contact represented by this context + */ +export interface FluffyContactIdentifiers { + /** + * The email address for the contact + */ + email?: string; + /** + * FactSet Permanent Identifier representing the contact + */ + FDS_ID?: string; + [property: string]: any; +} + +/** + * A collection of contacts, e.g. for chatting to or calling multiple contacts. + * + * The contact list schema does not explicitly include identifiers in the `id` section, as + * there is not a common standard for such identifiers. Applications can, however, populate + * this part of the contract with custom identifiers if so desired. + */ +export interface ContactList { + /** + * An array of contact contexts that forms the list. + */ + contacts: ContactElement[]; + /** + * One or more identifiers that refer to the contact list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An optional human-readable summary of the contact list + */ + name?: string; + type: 'fdc3.contactList'; + [property: string]: any; +} + +/** + * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by + * FDC3 operations. As such, it is not really meant to be used on its own, but is imported + * by more specific type definitions (standardized or custom) to provide the structure and + * properties shared by all FDC3 context data types. + * + * The key element of FDC3 context types is their mandatory `type` property, which is used + * to identify what type of data the object represents, and what shape it has. + * + * The FDC3 context type, and all derived types, define the minimum set of fields a context + * data object of a particular type can be expected to have, but this can always be extended + * with custom fields as appropriate. + */ +export interface Context { + /** + * Context data objects may include a set of equivalent key-value pairs that can be used to + * help applications identify and look up the context type they receive in their own domain. + * The idea behind this design is that applications can provide as many equivalent + * identifiers to a target application as possible, e.g. an instrument may be represented by + * an ISIN, CUSIP or Bloomberg identifier. + * + * Identifiers do not make sense for all types of data, so the `id` property is therefore + * optional, but some derived types may choose to require at least one identifier. + * Identifier values SHOULD always be of type string. + */ + id?: { [key: string]: any }; + /** + * Context data objects may include a name property that can be used for more information, + * or display purposes. Some derived types may require the name object as mandatory, + * depending on use case. + */ + name?: string; + /** + * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 + * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present + * to route shared context data appropriately. + * + * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data + * types they support in an FDC3 [App + * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery + * and routing. + * + * Standardized FDC3 context types have well-known `type` properties prefixed with the + * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and + * used by a particular organization, the convention is to prefix them with an + * organization-specific namespace, e.g. `blackrock.fund`. + * + * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more + * information about context data types. + */ + type: string; + [property: string]: any; +} + +/** + * A country entity. + * + * Notes: + * + * - It is valid to include extra properties and metadata as part of the country payload, + * but the minimum requirement is for at least one standardized identifier to be provided + * + * - `COUNTRY_ISOALPHA2` SHOULD be preferred. + * + * - Try to only use country identifiers as intended and specified in the [ISO + * standard](https://en.wikipedia.org/wiki/ISO_3166-1). E.g. the `COUNTRY_ISOALPHA2` + * property must be a recognized value and not a proprietary two-letter code. If the + * identifier you want to share is not a standardized and recognized one, rather define a + * property that makes it clear what value it is. This makes it easier for target + * applications. + */ +export interface Country { + id: CountryID; + /** + * An optional human-readable name for the country + */ + name?: string; + type: 'fdc3.country'; + [property: string]: any; +} + +export interface CountryID { + /** + * Two-letter ISO country code + */ + COUNTRY_ISOALPHA2?: string; + /** + * Three-letter ISO country code + */ + COUNTRY_ISOALPHA3?: string; + /** + * Two-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed + * with `COUNTRY_`. + */ + ISOALPHA2?: string; + /** + * Three-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed + * with `COUNTRY_`. + */ + ISOALPHA3?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A context representing an individual Currency. + */ +export interface Currency { + id: CurrencyID; + /** + * The name of the currency for display purposes + */ + name?: string; + type: 'fdc3.currency'; + [property: string]: any; +} + +export interface CurrencyID { + /** + * The `CURRENCY_ISOCODE` should conform to 3 character alphabetic codes defined in [ISO + * 4217](https://www.iso.org/iso-4217-currency-codes.html) + */ + CURRENCY_ISOCODE?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A collection of information to be used to initiate an email with a Contact or ContactList. + */ +export interface Email { + /** + * One or more recipients for the email. + */ + recipients: EmailRecipients; + /** + * Subject line for the email. + */ + subject?: string; + /** + * Body content for the email. + */ + textBody?: string; + type: 'fdc3.email'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * One or more recipients for the email. + * + * The contact that initiated the interaction + * + * A person contact that can be engaged with through email, calling, messaging, CMS, etc. + * + * Contacts to add to the chat + * + * A list of contacts involved in the interaction + * + * A collection of contacts, e.g. for chatting to or calling multiple contacts. + * + * The contact list schema does not explicitly include identifiers in the `id` section, as + * there is not a common standard for such identifiers. Applications can, however, populate + * this part of the contract with custom identifiers if so desired. + */ +export interface EmailRecipients { + /** + * Identifiers that relate to the Contact represented by this context + * + * One or more identifiers that refer to the contact list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: ContactTIdentifiers; + /** + * An optional human-readable name for the contact + * + * An optional human-readable summary of the contact list + */ + name?: string; + type: EmailRecipientsType; + /** + * An array of contact contexts that forms the list. + */ + contacts?: ContactElement[]; + [property: string]: any; +} + +/** + * Identifiers that relate to the Contact represented by this context + * + * One or more identifiers that refer to the contact list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ +export interface ContactTIdentifiers { + /** + * The email address for the contact + */ + email?: string; + /** + * FactSet Permanent Identifier representing the contact + */ + FDS_ID?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ +export type EmailRecipientsType = 'fdc3.contact' | 'fdc3.contactList'; + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A File attachment encoded in the form of a data URI. Can be added to a Message. + */ +export interface FileAttachment { + data: FileAttachmentData; + type: 'fdc3.fileAttachment'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +export interface FileAttachmentData { + /** + * A data URI encoding the content of the file to be attached + */ + dataUri: string; + /** + * The name of the attached file + */ + name: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A financial instrument from any asset class. + */ +export interface Instrument { + /** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + */ + id: FluffyInstrumentIdentifiers; + /** + * The `market` map can be used to further specify the instrument and help achieve + * interoperability between disparate data sources. This is especially useful when using an + * `id` field that is not globally unique. + */ + market?: PurpleMarket; + /** + * An optional human-readable name for the instrument + */ + name?: string; + type: 'fdc3.instrument'; + [property: string]: any; +} + +/** + * Any combination of instrument identifiers can be used together to resolve ambiguity, or + * for a better match. Not all applications will use the same instrument identifiers, which + * is why FDC3 allows for multiple to be specified. In general, the more identifiers an + * application can provide, the easier it will be to achieve interoperability. + * + * It is valid to include extra properties and metadata as part of the instrument payload, + * but the minimum requirement is for at least one instrument identifier to be provided. + * + * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant + * for tickers as used by an exchange. + * If the identifier you want to share is not a ticker or one of the other standardized + * fields, define a property that makes it clear what the value represents. Doing so will + * make interpretation easier for the developers of target applications. + */ +export interface FluffyInstrumentIdentifiers { + /** + * https://www.bloomberg.com/ + */ + BBG?: string; + /** + * https://www.cusip.com/ + */ + CUSIP?: string; + /** + * https://www.factset.com/ + */ + FDS_ID?: string; + /** + * https://www.openfigi.com/ + */ + FIGI?: string; + /** + * https://www.isin.org/ + */ + ISIN?: string; + /** + * https://permid.org/ + */ + PERMID?: string; + /** + * https://www.refinitiv.com/ + */ + RIC?: string; + /** + * https://www.lseg.com/sedol + */ + SEDOL?: string; + /** + * Unstandardized stock tickers + */ + ticker?: string; + [property: string]: any; +} + +/** + * The `market` map can be used to further specify the instrument and help achieve + * interoperability between disparate data sources. This is especially useful when using an + * `id` field that is not globally unique. + */ +export interface PurpleMarket { + /** + * https://www.bloomberg.com/ + */ + BBG?: string; + /** + * https://www.iso.org/iso-3166-country-codes.html + */ + COUNTRY_ISOALPHA2?: string; + /** + * https://en.wikipedia.org/wiki/Market_Identifier_Code + */ + MIC?: string; + /** + * Human readable market name + */ + name?: string; + [property: string]: any; +} + +/** + * A collection of instruments. Use this type for use cases that require not just a single + * instrument, but multiple (e.g. to populate a watchlist). However, when holding + * information for each instrument is required, it is recommended to use the + * [Portfolio](Portfolio) type. + * + * The instrument list schema does not explicitly include identifiers in the `id` section, + * as there is not a common standard for such identifiers. Applications can, however, + * populate this part of the contract with custom identifiers if so desired. + */ +export interface InstrumentList { + /** + * One or more identifiers that refer to the instrument list in an OMS, EMS or related + * system. Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An array of instrument contexts that forms the list. + */ + instruments: InstrumentElement[]; + /** + * An optional human-readable summary of the instrument list + */ + name?: string; + type: 'fdc3.instrumentList'; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * An `Interaction` is a significant direct exchange of ideas or information between a + * number of participants, e.g. a Sell Side party and one or more Buy Side parties. An + * `Interaction` might be a call, a meeting (physical or virtual), an IM or the preparation + * of some specialist data, such as financial data for a given company or sector. + */ +export interface Interaction { + /** + * A human-readable description of the interaction + */ + description: string; + /** + * Can be used by a target application to pass an identifier back to the originating + * application after an interaction record has been created, updated or deleted. An + * interaction ID does not need to be populated by the originating application, however the + * target application could store it for future reference and SHOULD return it in a + * `TransactionResult`. + */ + id?: InteractionID; + /** + * The contact that initiated the interaction + */ + initiator?: ContactElement; + /** + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + interactionType: string; + /** + * Used to represent the application or service that the interaction was created from to aid + * in tracing the source of an interaction. + */ + origin?: string; + /** + * A list of contacts involved in the interaction + */ + participants: ContactListObject; + /** + * The time range over which the interaction occurred + */ + timeRange: TimeRangeObject; + type: 'fdc3.interaction'; + name?: string; + [property: string]: any; +} + +/** + * Can be used by a target application to pass an identifier back to the originating + * application after an interaction record has been created, updated or deleted. An + * interaction ID does not need to be populated by the originating application, however the + * target application could store it for future reference and SHOULD return it in a + * `TransactionResult`. + */ +export interface InteractionID { + /** + * Interactions ID in Salesforce + */ + SALESFORCE?: string; + /** + * Interaction ID in SingleTrack + */ + SINGLETRACK?: string; + /** + * Can be used by a target application to pass a record's link back to the originating + * application. This offers the originating application a way to open the record for a user + * to view. + */ + URI?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A chat message to be sent through an instant messaging application. Can contain one or + * several text bodies (organized by mime-type, plaintext or markdown), as well as attached + * entities (either arbitrary file attachments or FDC3 actions to be embedded in the + * message). To be put inside a ChatInitSettings object. + */ +export interface Message { + /** + * A map of string IDs to entities that should be attached to the message, such as an action + * to perform, a file attachment, or other FDC3 context object. + */ + entities?: { [key: string]: EntityValue }; + /** + * A map of string mime-type to string content + */ + text?: FluffyMessageText; + type: 'fdc3.message'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * A map of string mime-type to string content + */ +export interface FluffyMessageText { + /** + * Markdown encoded content + */ + 'text/markdown'?: string; + /** + * Plain text encoded content. + */ + 'text/plain'?: string; + [property: string]: any; +} + +/** + * A type that explicitly represents a lack of context. + * + * Notes: + * + * - Intended to be used in situations where no context is desired. + * - For example: + * - Raising an intent without context (e.g. opening a blank order form, or chat interface + * without a contact selected). + * - Resetting context on a channel (e.g. when context is used to set a filter in other + * applications a null context might release the filter). + * - An explicit representation of a Null or empty context allows apps to declare support + * for a lack of context, for example in their intent metadata in an app directory. + */ +export interface Nothing { + type: 'fdc3.nothing'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * @experimental context type representing an order. To be used with OMS and EMS systems. + * + * This type currently only defines a required `id` field, which should provide a reference + * to the order in one or more systems, an optional human readable `name` field to be used + * to summarize the order and an optional `details` field that may be used to provide + * additional detail about the order, including a context representing a `product`, which + * may be extended with arbitrary properties. The `details.product` field is currently typed + * as a unspecified Context type, but both `details` and `details.product` are expected to + * be standardized in future. + */ +export interface Order { + /** + * Optional additional details about the order, which may include a product element that is + * an, as yet undefined but extensible, Context + */ + details?: PurpleOrderDetails; + /** + * One or more identifiers that refer to the order in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * An optional human-readable summary of the order. + */ + name?: string; + type: 'fdc3.order'; + [property: string]: any; +} + +/** + * Optional additional details about the order, which may include a product element that is + * an, as yet undefined but extensible, Context + */ +export interface PurpleOrderDetails { + product?: ProductObject; + [property: string]: any; +} + +/** + * A product that is the subject of the trade. + * + * @experimental context type representing a tradable product. To be used with OMS and EMS + * systems. + * + * This type is currently only loosely defined as an extensible context object, with an + * optional instrument field. + * + * The Product schema does not explicitly include identifiers in the id section, as there is + * not a common standard for such identifiers. Applications can, however, populate this part + * of the contract with custom identifiers if so desired. + */ +export interface ProductObject { + /** + * One or more identifiers that refer to the product. Specific key names for systems are + * expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * A financial instrument that relates to the definition of this product + */ + instrument?: InstrumentElement; + /** + * A human-readable summary of the product. + */ + name?: string; + type: 'fdc3.product'; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * @experimental A list of orders. Use this type for use cases that require not just a + * single order, but multiple. + * + * The OrderList schema does not explicitly include identifiers in the id section, as there + * is not a common standard for such identifiers. Applications can, however, populate this + * part of the contract with custom identifiers if so desired. + */ +export interface OrderList { + /** + * One or more identifiers that refer to the order list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An optional human-readable summary of the order list + */ + name?: string; + /** + * An array of order contexts that forms the list. + */ + orders: OrderElement[]; + type: 'fdc3.orderList'; + [property: string]: any; +} + +/** + * @experimental context type representing an order. To be used with OMS and EMS systems. + * + * This type currently only defines a required `id` field, which should provide a reference + * to the order in one or more systems, an optional human readable `name` field to be used + * to summarize the order and an optional `details` field that may be used to provide + * additional detail about the order, including a context representing a `product`, which + * may be extended with arbitrary properties. The `details.product` field is currently typed + * as a unspecified Context type, but both `details` and `details.product` are expected to + * be standardized in future. + */ +export interface OrderElement { + /** + * Optional additional details about the order, which may include a product element that is + * an, as yet undefined but extensible, Context + */ + details?: FluffyOrderDetails; + /** + * One or more identifiers that refer to the order in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * An optional human-readable summary of the order. + */ + name?: string; + type: 'fdc3.order'; + [property: string]: any; +} + +/** + * Optional additional details about the order, which may include a product element that is + * an, as yet undefined but extensible, Context + */ +export interface FluffyOrderDetails { + product?: ProductObject; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * An entity that can be used when referencing private companies and other organizations + * where a specific instrument is not available or desired e.g. CRM and News workflows. + * + * It is valid to include extra properties and metadata as part of the organization payload, + * but the minimum requirement is for at least one specified identifier to be provided. + */ +export interface Organization { + /** + * Identifiers for the organization, at least one must be provided. + */ + id: OrganizationIdentifiers; + /** + * An optional human-readable name of the organization + */ + name?: string; + type: 'fdc3.organization'; + [property: string]: any; +} + +/** + * Identifiers for the organization, at least one must be provided. + */ +export interface OrganizationIdentifiers { + /** + * FactSet Permanent Identifier representing the organization + */ + FDS_ID?: string; + /** + * The Legal Entity Identifier (LEI) is a 20-character, alpha-numeric code based on the ISO + * 17442 standard developed by the International Organization for Standardization (ISO). It + * connects to key reference information that enables clear and unique identification of + * legal entities participating in financial transactions. + */ + LEI?: string; + /** + * Refinitiv Permanent Identifiers, or PermID for the organization + */ + PERMID?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A financial portfolio made up of multiple positions (holdings) in several instruments. + * Contrast this with e.g. the [InstrumentList](InstrumentList) type, which is just a list + * of instruments. + * + * This is a good example of how types can be composed and extended with extra properties to + * define more complex types. + * + * The Portfolio type consists of an array of [Position](Position) types, each of which + * refers to a single [Instrument](Instrument) and a holding amount for that instrument. + * + * The portfolio schema does not explicitly include identifiers in the `id` section, as + * there bis not a common standard for such identifiers. Applications can, however, populate + * this part of the contract with custom identifiers if so desired. + */ +export interface Portfolio { + /** + * One or more identifiers that refer to the portfolio in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An optional human-readable name for the portfolio + */ + name?: string; + /** + * The List of Positions which make up the Portfolio + */ + positions: PositionElement[]; + type: 'fdc3.portfolio'; + [property: string]: any; +} + +/** + * A financial position made up of an instrument and a holding in that instrument. This type + * is a good example of how new context types can be composed from existing types. + * + * In this case, the instrument and the holding amount for that instrument are required + * values. + * + * The [Position](Position) type goes hand-in-hand with the [Portfolio](Portfolio) type, + * which represents multiple holdings in a combination of instruments. + * + * The position schema does not explicitly include identifiers in the `id` section, as there + * is not a common standard for such identifiers. Applications can, however, populate this + * part of the contract with custom identifiers if so desired. + */ +export interface PositionElement { + /** + * The amount of the holding, e.g. a number of shares + */ + holding: number; + /** + * One or more identifiers that refer to the position in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + instrument: InstrumentElement; + /** + * An optional human-readable name for the position + */ + name?: string; + type: 'fdc3.position'; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A financial position made up of an instrument and a holding in that instrument. This type + * is a good example of how new context types can be composed from existing types. + * + * In this case, the instrument and the holding amount for that instrument are required + * values. + * + * The [Position](Position) type goes hand-in-hand with the [Portfolio](Portfolio) type, + * which represents multiple holdings in a combination of instruments. + * + * The position schema does not explicitly include identifiers in the `id` section, as there + * is not a common standard for such identifiers. Applications can, however, populate this + * part of the contract with custom identifiers if so desired. + */ +export interface Position { + /** + * The amount of the holding, e.g. a number of shares + */ + holding: number; + /** + * One or more identifiers that refer to the position in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + instrument: InstrumentElement; + /** + * An optional human-readable name for the position + */ + name?: string; + type: 'fdc3.position'; + [property: string]: any; +} + +/** + * @experimental context type representing a tradable product. To be used with OMS and EMS + * systems. + * + * This type is currently only loosely defined as an extensible context object, with an + * optional instrument field. + * + * The Product schema does not explicitly include identifiers in the id section, as there is + * not a common standard for such identifiers. Applications can, however, populate this part + * of the contract with custom identifiers if so desired. + */ +export interface Product { + /** + * One or more identifiers that refer to the product. Specific key names for systems are + * expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * A financial instrument that relates to the definition of this product + */ + instrument?: InstrumentElement; + /** + * A human-readable summary of the product. + */ + name?: string; + type: 'fdc3.product'; + [property: string]: any; +} + +/** + * A context representing a period of time. Any user interfaces that represent or visualize + * events or activity over time can be filtered or focused on a particular time period, + * e.g.: + * + * - A pricing chart + * - A trade blotter + * - A record of client contact/activity in a CRM + * + * Example use cases: + * + * - User may want to view pricing/trades/customer activity for a security over a particular + * time period, the time range might be specified as the context for the `ViewChart` intent + * OR it might be embedded in another context (e.g. a context representing a chart to plot). + * - User filters a visualization (e.g. a pricing chart) to show a particular period, the + * `TimeRange` is broadcast and other visualizations (e.g. a heatmap of activity by + * instrument, or industry sector etc.) receive it and filter themselves to show data over + * the same range. + * + * Notes: + * + * - A `TimeRange` may be closed (i.e. `startTime` and `endTime` are both known) or open + * (i.e. only one of `startTime` or `endTime` is known). + * - Ranges corresponding to dates (e.g. `2022-05-12` to `2022-05-19`) should be specified + * using times as this prevents issues with timezone conversions and inclusive/exclusive + * date ranges. + * - String fields representing times are encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html). + * - A timezone indicator should be specified, e.g. `"2022-05-12T15:18:03Z"` or + * `"2022-05-12T16:18:03+01:00"` + * - Times MAY be specified with millisecond precision, e.g. `"2022-05-12T15:18:03.349Z"` + */ +export interface TimeRange { + /** + * The end time of the range, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. + */ + endTime?: Date; + /** + * The start time of the range, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. + */ + startTime?: Date; + type: 'fdc3.timeRange'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * @experimental context type representing a trade. To be used with execution systems. + * + * This type currently only defines a required `id` field, which should provide a reference + * to the trade in one or more systems, an optional human readable `name` field to be used + * to summarize the trade and a required `product` field that may be used to provide + * additional detail about the trade, which is currently typed as a unspecified Context + * type, but `product` is expected to be standardized in future. + * + * The Trade schema does not explicitly include identifiers in the id section, as there is + * not a common standard for such identifiers. Applications can, however, populate this part + * of the contract with custom identifiers if so desired. + */ +export interface Trade { + /** + * One or more identifiers that refer to the trade in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * A human-readable summary of the trade. + */ + name?: string; + /** + * A product that is the subject of the trade. + */ + product: ProductObject; + type: 'fdc3.trade'; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * @experimental A list of trades. Use this type for use cases that require not just a + * single trade, but multiple. + * + * The TradeList schema does not explicitly include identifiers in the id section, as there + * is not a common standard for such identifiers. Applications can, however, populate this + * part of the contract with custom identifiers if so desired. + */ +export interface TradeList { + /** + * One or more identifiers that refer to the trade list in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id?: { [key: string]: string }; + /** + * An optional human-readable name for the trade list + */ + name?: string; + /** + * An array of trade contexts that forms the list. + */ + trades: TradeElement[]; + type: 'fdc3.tradeList'; + [property: string]: any; +} + +/** + * @experimental context type representing a trade. To be used with execution systems. + * + * This type currently only defines a required `id` field, which should provide a reference + * to the trade in one or more systems, an optional human readable `name` field to be used + * to summarize the trade and a required `product` field that may be used to provide + * additional detail about the trade, which is currently typed as a unspecified Context + * type, but `product` is expected to be standardized in future. + * + * The Trade schema does not explicitly include identifiers in the id section, as there is + * not a common standard for such identifiers. Applications can, however, populate this part + * of the contract with custom identifiers if so desired. + */ +export interface TradeElement { + /** + * One or more identifiers that refer to the trade in an OMS, EMS or related system. + * Specific key names for systems are expected to be standardized in future. + */ + id: { [key: string]: string }; + /** + * A human-readable summary of the trade. + */ + name?: string; + /** + * A product that is the subject of the trade. + */ + product: ProductObject; + type: 'fdc3.trade'; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A context type representing the result of a transaction initiated via FDC3, which SHOULD + * be returned as an `IntentResult` by intents that create, retrieve, update or delete + * content or records in another application. Its purpose is to provide a status and message + * (where needed) for the transaction and MAY wrap a returned context object. + */ +export interface TransactionResult { + /** + * A context object returned by the transaction, possibly with updated data. + */ + context?: ContextElement; + /** + * A human readable message describing the outcome of the transaction. + */ + message?: string; + /** + * The status of the transaction being reported. + */ + status: TransactionStatus; + type: 'fdc3.transactionResult'; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * The status of the transaction being reported. + */ +export type TransactionStatus = 'Created' | 'Deleted' | 'Updated' | 'Failed'; + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +/** + * A context type representing the price and value of a holding. + */ +export interface Valuation { + /** + * The valuation currency, which should conform to 3 character alphabetic codes defined in + * [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) + */ + CURRENCY_ISOCODE: string; + /** + * The time at which this valuation expires, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included. + */ + expiryTime?: Date; + /** + * The price per unit the the valuation is based on. + */ + price?: number; + type: 'fdc3.valuation'; + /** + * The time at which the valuation was performed, encoded according to [ISO + * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included. + */ + valuationTime?: Date; + /** + * The value of the holding, expresses in the nominated currency. + */ + value: number; + id?: { [key: string]: any }; + name?: string; + [property: string]: any; +} + +/** + * Free text to be used for a keyword search + * + * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or + * `'Meeting'` although other string values are permitted. + */ + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toAction(json: string): Action { + return cast(JSON.parse(json), r('Action')); + } + + public static actionToJson(value: Action): string { + return JSON.stringify(uncast(value, r('Action')), null, 2); + } + + public static toChart(json: string): Chart { + return cast(JSON.parse(json), r('Chart')); + } + + public static chartToJson(value: Chart): string { + return JSON.stringify(uncast(value, r('Chart')), null, 2); + } + + public static toChatInitSettings(json: string): ChatInitSettings { + return cast(JSON.parse(json), r('ChatInitSettings')); + } + + public static chatInitSettingsToJson(value: ChatInitSettings): string { + return JSON.stringify(uncast(value, r('ChatInitSettings')), null, 2); + } + + public static toChatMessage(json: string): ChatMessage { + return cast(JSON.parse(json), r('ChatMessage')); + } + + public static chatMessageToJson(value: ChatMessage): string { + return JSON.stringify(uncast(value, r('ChatMessage')), null, 2); + } + + public static toChatRoom(json: string): ChatRoom { + return cast(JSON.parse(json), r('ChatRoom')); + } + + public static chatRoomToJson(value: ChatRoom): string { + return JSON.stringify(uncast(value, r('ChatRoom')), null, 2); + } + + public static toChatSearchCriteria(json: string): ChatSearchCriteria { + return cast(JSON.parse(json), r('ChatSearchCriteria')); + } + + public static chatSearchCriteriaToJson(value: ChatSearchCriteria): string { + return JSON.stringify(uncast(value, r('ChatSearchCriteria')), null, 2); + } + + public static toContact(json: string): Contact { + return cast(JSON.parse(json), r('Contact')); + } + + public static contactToJson(value: Contact): string { + return JSON.stringify(uncast(value, r('Contact')), null, 2); + } + + public static toContactList(json: string): ContactList { + return cast(JSON.parse(json), r('ContactList')); + } + + public static contactListToJson(value: ContactList): string { + return JSON.stringify(uncast(value, r('ContactList')), null, 2); + } + + public static toContext(json: string): Context { + return cast(JSON.parse(json), r('Context')); + } + + public static contextToJson(value: Context): string { + return JSON.stringify(uncast(value, r('Context')), null, 2); + } + + public static toCountry(json: string): Country { + return cast(JSON.parse(json), r('Country')); + } + + public static countryToJson(value: Country): string { + return JSON.stringify(uncast(value, r('Country')), null, 2); + } + + public static toCurrency(json: string): Currency { + return cast(JSON.parse(json), r('Currency')); + } + + public static currencyToJson(value: Currency): string { + return JSON.stringify(uncast(value, r('Currency')), null, 2); + } + + public static toEmail(json: string): Email { + return cast(JSON.parse(json), r('Email')); + } + + public static emailToJson(value: Email): string { + return JSON.stringify(uncast(value, r('Email')), null, 2); + } + + public static toFileAttachment(json: string): FileAttachment { + return cast(JSON.parse(json), r('FileAttachment')); + } + + public static fileAttachmentToJson(value: FileAttachment): string { + return JSON.stringify(uncast(value, r('FileAttachment')), null, 2); + } + + public static toInstrument(json: string): Instrument { + return cast(JSON.parse(json), r('Instrument')); + } + + public static instrumentToJson(value: Instrument): string { + return JSON.stringify(uncast(value, r('Instrument')), null, 2); + } + + public static toInstrumentList(json: string): InstrumentList { + return cast(JSON.parse(json), r('InstrumentList')); + } + + public static instrumentListToJson(value: InstrumentList): string { + return JSON.stringify(uncast(value, r('InstrumentList')), null, 2); + } + + public static toInteraction(json: string): Interaction { + return cast(JSON.parse(json), r('Interaction')); + } + + public static interactionToJson(value: Interaction): string { + return JSON.stringify(uncast(value, r('Interaction')), null, 2); + } + + public static toMessage(json: string): Message { + return cast(JSON.parse(json), r('Message')); + } + + public static messageToJson(value: Message): string { + return JSON.stringify(uncast(value, r('Message')), null, 2); + } + + public static toNothing(json: string): Nothing { + return cast(JSON.parse(json), r('Nothing')); + } + + public static nothingToJson(value: Nothing): string { + return JSON.stringify(uncast(value, r('Nothing')), null, 2); + } + + public static toOrder(json: string): Order { + return cast(JSON.parse(json), r('Order')); + } + + public static orderToJson(value: Order): string { + return JSON.stringify(uncast(value, r('Order')), null, 2); + } + + public static toOrderList(json: string): OrderList { + return cast(JSON.parse(json), r('OrderList')); + } + + public static orderListToJson(value: OrderList): string { + return JSON.stringify(uncast(value, r('OrderList')), null, 2); + } + + public static toOrganization(json: string): Organization { + return cast(JSON.parse(json), r('Organization')); + } + + public static organizationToJson(value: Organization): string { + return JSON.stringify(uncast(value, r('Organization')), null, 2); + } + + public static toPortfolio(json: string): Portfolio { + return cast(JSON.parse(json), r('Portfolio')); + } + + public static portfolioToJson(value: Portfolio): string { + return JSON.stringify(uncast(value, r('Portfolio')), null, 2); + } + + public static toPosition(json: string): Position { + return cast(JSON.parse(json), r('Position')); + } + + public static positionToJson(value: Position): string { + return JSON.stringify(uncast(value, r('Position')), null, 2); + } + + public static toProduct(json: string): Product { + return cast(JSON.parse(json), r('Product')); + } + + public static productToJson(value: Product): string { + return JSON.stringify(uncast(value, r('Product')), null, 2); + } + + public static toTimeRange(json: string): TimeRange { + return cast(JSON.parse(json), r('TimeRange')); + } + + public static timeRangeToJson(value: TimeRange): string { + return JSON.stringify(uncast(value, r('TimeRange')), null, 2); + } + + public static toTrade(json: string): Trade { + return cast(JSON.parse(json), r('Trade')); + } + + public static tradeToJson(value: Trade): string { + return JSON.stringify(uncast(value, r('Trade')), null, 2); + } + + public static toTradeList(json: string): TradeList { + return cast(JSON.parse(json), r('TradeList')); + } + + public static tradeListToJson(value: TradeList): string { + return JSON.stringify(uncast(value, r('TradeList')), null, 2); + } + + public static toTransactionResult(json: string): TransactionResult { + return cast(JSON.parse(json), r('TransactionResult')); + } + + public static transactionResultToJson(value: TransactionResult): string { + return JSON.stringify(uncast(value, r('TransactionResult')), null, 2); + } + + public static toValuation(json: string): Valuation { + return cast(JSON.parse(json), r('Valuation')); + } + + public static valuationToJson(value: Valuation): string { + return JSON.stringify(uncast(value, r('Valuation')), null, 2); + } +} + +function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { + const prettyTyp = prettyTypeName(typ); + const parentText = parent ? ` on ${parent}` : ''; + const keyText = key ? ` for key "${key}"` : ''; + throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); +} + +function prettyTypeName(typ: any): string { + if (Array.isArray(typ)) { + if (typ.length === 2 && typ[0] === undefined) { + return `an optional ${prettyTypeName(typ[1])}`; + } else { + return `one of [${typ + .map(a => { + return prettyTypeName(a); + }) + .join(', ')}]`; + } + } else if (typeof typ === 'object' && typ.literal !== undefined) { + return typ.literal; + } else { + return typeof typ; + } +} + +function jsonToJSProps(typ: any): any { + if (typ.jsonToJS === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.json] = { key: p.js, typ: p.typ })); + typ.jsonToJS = map; + } + return typ.jsonToJS; +} + +function jsToJSONProps(typ: any): any { + if (typ.jsToJSON === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.js] = { key: p.json, typ: p.typ })); + typ.jsToJSON = map; + } + return typ.jsToJSON; +} + +function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { + function transformPrimitive(typ: string, val: any): any { + if (typeof typ === typeof val) return val; + return invalidValue(typ, val, key, parent); + } + + function transformUnion(typs: any[], val: any): any { + // val must validate against one typ in typs + const l = typs.length; + for (let i = 0; i < l; i++) { + const typ = typs[i]; + try { + return transform(val, typ, getProps); + } catch (_) {} + } + return invalidValue(typs, val, key, parent); + } + + function transformEnum(cases: string[], val: any): any { + if (cases.indexOf(val) !== -1) return val; + return invalidValue( + cases.map(a => { + return l(a); + }), + val, + key, + parent + ); + } + + function transformArray(typ: any, val: any): any { + // val must be an array with no invalid elements + if (!Array.isArray(val)) return invalidValue(l('array'), val, key, parent); + return val.map(el => transform(el, typ, getProps)); + } + + function transformDate(val: any): any { + if (val === null) { + return null; + } + const d = new Date(val); + if (isNaN(d.valueOf())) { + return invalidValue(l('Date'), val, key, parent); + } + return d; + } + + function transformObject(props: { [k: string]: any }, additional: any, val: any): any { + if (val === null || typeof val !== 'object' || Array.isArray(val)) { + return invalidValue(l(ref || 'object'), val, key, parent); + } + const result: any = {}; + Object.getOwnPropertyNames(props).forEach(key => { + const prop = props[key]; + const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; + result[prop.key] = transform(v, prop.typ, getProps, key, ref); + }); + Object.getOwnPropertyNames(val).forEach(key => { + if (!Object.prototype.hasOwnProperty.call(props, key)) { + result[key] = transform(val[key], additional, getProps, key, ref); + } + }); + return result; + } + + if (typ === 'any') return val; + if (typ === null) { + if (val === null) return val; + return invalidValue(typ, val, key, parent); + } + if (typ === false) return invalidValue(typ, val, key, parent); + let ref: any = undefined; + while (typeof typ === 'object' && typ.ref !== undefined) { + ref = typ.ref; + typ = typeMap[typ.ref]; + } + if (Array.isArray(typ)) return transformEnum(typ, val); + if (typeof typ === 'object') { + return typ.hasOwnProperty('unionMembers') + ? transformUnion(typ.unionMembers, val) + : typ.hasOwnProperty('arrayItems') + ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty('props') + ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val, key, parent); + } + // Numbers can be parsed by Date but shouldn't be. + if (typ === Date && typeof val !== 'number') return transformDate(val); + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + Action: o( + [ + { json: 'action', js: 'action', typ: u(undefined, r('ActionType')) }, + { json: 'app', js: 'app', typ: u(undefined, r('AppIdentifier')) }, + { json: 'channelId', js: 'channelId', typ: u(undefined, '') }, + { json: 'context', js: 'context', typ: r('ContextElement') }, + { json: 'intent', js: 'intent', typ: u(undefined, '') }, + { json: 'title', js: 'title', typ: '' }, + { json: 'type', js: 'type', typ: r('ActionTypeEnum') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + AppIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + ContextElement: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + Chart: o( + [ + { json: 'instruments', js: 'instruments', typ: a(r('InstrumentElement')) }, + { json: 'otherConfig', js: 'otherConfig', typ: u(undefined, a(r('ContextElement'))) }, + { json: 'range', js: 'range', typ: u(undefined, r('TimeRangeObject')) }, + { json: 'style', js: 'style', typ: u(undefined, r('ChartStyle')) }, + { json: 'type', js: 'type', typ: r('ChartType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + InstrumentElement: o( + [ + { json: 'id', js: 'id', typ: r('PurpleInstrumentIdentifiers') }, + { json: 'market', js: 'market', typ: u(undefined, r('OrganizationMarket')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('PurpleInteractionType') }, + ], + 'any' + ), + PurpleInstrumentIdentifiers: o( + [ + { json: 'BBG', js: 'BBG', typ: u(undefined, '') }, + { json: 'CUSIP', js: 'CUSIP', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + { json: 'FIGI', js: 'FIGI', typ: u(undefined, '') }, + { json: 'ISIN', js: 'ISIN', typ: u(undefined, '') }, + { json: 'PERMID', js: 'PERMID', typ: u(undefined, '') }, + { json: 'RIC', js: 'RIC', typ: u(undefined, '') }, + { json: 'SEDOL', js: 'SEDOL', typ: u(undefined, '') }, + { json: 'ticker', js: 'ticker', typ: u(undefined, '') }, + ], + 'any' + ), + OrganizationMarket: o( + [ + { json: 'BBG', js: 'BBG', typ: u(undefined, '') }, + { json: 'COUNTRY_ISOALPHA2', js: 'COUNTRY_ISOALPHA2', typ: u(undefined, '') }, + { json: 'MIC', js: 'MIC', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + TimeRangeObject: o( + [ + { json: 'endTime', js: 'endTime', typ: u(undefined, Date) }, + { json: 'startTime', js: 'startTime', typ: u(undefined, Date) }, + { json: 'type', js: 'type', typ: r('TimeRangeType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + ChatInitSettings: o( + [ + { json: 'chatName', js: 'chatName', typ: u(undefined, '') }, + { json: 'members', js: 'members', typ: u(undefined, r('ContactListObject')) }, + { json: 'message', js: 'message', typ: u(undefined, u(r('MessageObject'), '')) }, + { json: 'options', js: 'options', typ: u(undefined, r('ChatOptions')) }, + { json: 'type', js: 'type', typ: r('ChatInitSettingsType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + ContactListObject: o( + [ + { json: 'contacts', js: 'contacts', typ: a(r('ContactElement')) }, + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('ContactListType') }, + ], + 'any' + ), + ContactElement: o( + [ + { json: 'id', js: 'id', typ: r('PurpleContactIdentifiers') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('FluffyInteractionType') }, + ], + 'any' + ), + PurpleContactIdentifiers: o( + [ + { json: 'email', js: 'email', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + ], + 'any' + ), + MessageObject: o( + [ + { json: 'entities', js: 'entities', typ: u(undefined, m(r('EntityValue'))) }, + { json: 'text', js: 'text', typ: u(undefined, r('PurpleMessageText')) }, + { json: 'type', js: 'type', typ: r('MessageType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + EntityValue: o( + [ + { json: 'action', js: 'action', typ: u(undefined, r('ActionType')) }, + { json: 'app', js: 'app', typ: u(undefined, r('AppIdentifier')) }, + { json: 'channelId', js: 'channelId', typ: u(undefined, '') }, + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, + { json: 'intent', js: 'intent', typ: u(undefined, '') }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('EntityType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'data', js: 'data', typ: u(undefined, r('EntityData')) }, + ], + 'any' + ), + EntityData: o( + [ + { json: 'dataUri', js: 'dataUri', typ: '' }, + { json: 'name', js: 'name', typ: '' }, + ], + 'any' + ), + PurpleMessageText: o( + [ + { json: 'text/markdown', js: 'text/markdown', typ: u(undefined, '') }, + { json: 'text/plain', js: 'text/plain', typ: u(undefined, '') }, + ], + 'any' + ), + ChatOptions: o( + [ + { json: 'allowAddUser', js: 'allowAddUser', typ: u(undefined, true) }, + { json: 'allowHistoryBrowsing', js: 'allowHistoryBrowsing', typ: u(undefined, true) }, + { json: 'allowMessageCopy', js: 'allowMessageCopy', typ: u(undefined, true) }, + { json: 'groupRecipients', js: 'groupRecipients', typ: u(undefined, true) }, + { json: 'isPublic', js: 'isPublic', typ: u(undefined, true) }, + ], + 'any' + ), + ChatMessage: o( + [ + { json: 'chatRoom', js: 'chatRoom', typ: r('ChatRoomObject') }, + { json: 'message', js: 'message', typ: r('MessageObject') }, + { json: 'type', js: 'type', typ: r('ChatMessageType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + ChatRoomObject: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'providerName', js: 'providerName', typ: '' }, + { json: 'type', js: 'type', typ: r('ChatRoomType') }, + { json: 'url', js: 'url', typ: u(undefined, '') }, + ], + 'any' + ), + ChatRoom: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'providerName', js: 'providerName', typ: '' }, + { json: 'type', js: 'type', typ: r('ChatRoomType') }, + { json: 'url', js: 'url', typ: u(undefined, '') }, + ], + 'any' + ), + ChatSearchCriteria: o( + [ + { json: 'criteria', js: 'criteria', typ: a(u(r('OrganizationObject'), '')) }, + { json: 'type', js: 'type', typ: r('ChatSearchCriteriaType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + OrganizationObject: o( + [ + { json: 'id', js: 'id', typ: r('Identifiers') }, + { json: 'market', js: 'market', typ: u(undefined, r('OrganizationMarket')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('TentacledInteractionType') }, + ], + 'any' + ), + Identifiers: o( + [ + { json: 'BBG', js: 'BBG', typ: u(undefined, '') }, + { json: 'CUSIP', js: 'CUSIP', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + { json: 'FIGI', js: 'FIGI', typ: u(undefined, '') }, + { json: 'ISIN', js: 'ISIN', typ: u(undefined, '') }, + { json: 'PERMID', js: 'PERMID', typ: u(undefined, '') }, + { json: 'RIC', js: 'RIC', typ: u(undefined, '') }, + { json: 'SEDOL', js: 'SEDOL', typ: u(undefined, '') }, + { json: 'ticker', js: 'ticker', typ: u(undefined, '') }, + { json: 'LEI', js: 'LEI', typ: u(undefined, '') }, + { json: 'email', js: 'email', typ: u(undefined, '') }, + ], + 'any' + ), + Contact: o( + [ + { json: 'id', js: 'id', typ: r('FluffyContactIdentifiers') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('FluffyInteractionType') }, + ], + 'any' + ), + FluffyContactIdentifiers: o( + [ + { json: 'email', js: 'email', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + ], + 'any' + ), + ContactList: o( + [ + { json: 'contacts', js: 'contacts', typ: a(r('ContactElement')) }, + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('ContactListType') }, + ], + 'any' + ), + Context: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + Country: o( + [ + { json: 'id', js: 'id', typ: r('CountryID') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('CountryType') }, + ], + 'any' + ), + CountryID: o( + [ + { json: 'COUNTRY_ISOALPHA2', js: 'COUNTRY_ISOALPHA2', typ: u(undefined, '') }, + { json: 'COUNTRY_ISOALPHA3', js: 'COUNTRY_ISOALPHA3', typ: u(undefined, '') }, + { json: 'ISOALPHA2', js: 'ISOALPHA2', typ: u(undefined, '') }, + { json: 'ISOALPHA3', js: 'ISOALPHA3', typ: u(undefined, '') }, + ], + 'any' + ), + Currency: o( + [ + { json: 'id', js: 'id', typ: r('CurrencyID') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('CurrencyType') }, + ], + 'any' + ), + CurrencyID: o([{ json: 'CURRENCY_ISOCODE', js: 'CURRENCY_ISOCODE', typ: u(undefined, '') }], 'any'), + Email: o( + [ + { json: 'recipients', js: 'recipients', typ: r('EmailRecipients') }, + { json: 'subject', js: 'subject', typ: u(undefined, '') }, + { json: 'textBody', js: 'textBody', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('EmailType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + EmailRecipients: o( + [ + { json: 'id', js: 'id', typ: u(undefined, r('ContactTIdentifiers')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('EmailRecipientsType') }, + { json: 'contacts', js: 'contacts', typ: u(undefined, a(r('ContactElement'))) }, + ], + 'any' + ), + ContactTIdentifiers: o( + [ + { json: 'email', js: 'email', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + ], + 'any' + ), + FileAttachment: o( + [ + { json: 'data', js: 'data', typ: r('FileAttachmentData') }, + { json: 'type', js: 'type', typ: r('FileAttachmentType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + FileAttachmentData: o( + [ + { json: 'dataUri', js: 'dataUri', typ: '' }, + { json: 'name', js: 'name', typ: '' }, + ], + 'any' + ), + Instrument: o( + [ + { json: 'id', js: 'id', typ: r('FluffyInstrumentIdentifiers') }, + { json: 'market', js: 'market', typ: u(undefined, r('PurpleMarket')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('PurpleInteractionType') }, + ], + 'any' + ), + FluffyInstrumentIdentifiers: o( + [ + { json: 'BBG', js: 'BBG', typ: u(undefined, '') }, + { json: 'CUSIP', js: 'CUSIP', typ: u(undefined, '') }, + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + { json: 'FIGI', js: 'FIGI', typ: u(undefined, '') }, + { json: 'ISIN', js: 'ISIN', typ: u(undefined, '') }, + { json: 'PERMID', js: 'PERMID', typ: u(undefined, '') }, + { json: 'RIC', js: 'RIC', typ: u(undefined, '') }, + { json: 'SEDOL', js: 'SEDOL', typ: u(undefined, '') }, + { json: 'ticker', js: 'ticker', typ: u(undefined, '') }, + ], + 'any' + ), + PurpleMarket: o( + [ + { json: 'BBG', js: 'BBG', typ: u(undefined, '') }, + { json: 'COUNTRY_ISOALPHA2', js: 'COUNTRY_ISOALPHA2', typ: u(undefined, '') }, + { json: 'MIC', js: 'MIC', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + InstrumentList: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'instruments', js: 'instruments', typ: a(r('InstrumentElement')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('InstrumentListType') }, + ], + 'any' + ), + Interaction: o( + [ + { json: 'description', js: 'description', typ: '' }, + { json: 'id', js: 'id', typ: u(undefined, r('InteractionID')) }, + { json: 'initiator', js: 'initiator', typ: u(undefined, r('ContactElement')) }, + { json: 'interactionType', js: 'interactionType', typ: '' }, + { json: 'origin', js: 'origin', typ: u(undefined, '') }, + { json: 'participants', js: 'participants', typ: r('ContactListObject') }, + { json: 'timeRange', js: 'timeRange', typ: r('TimeRangeObject') }, + { json: 'type', js: 'type', typ: r('InteractionType') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + InteractionID: o( + [ + { json: 'SALESFORCE', js: 'SALESFORCE', typ: u(undefined, '') }, + { json: 'SINGLETRACK', js: 'SINGLETRACK', typ: u(undefined, '') }, + { json: 'URI', js: 'URI', typ: u(undefined, '') }, + ], + 'any' + ), + Message: o( + [ + { json: 'entities', js: 'entities', typ: u(undefined, m(r('EntityValue'))) }, + { json: 'text', js: 'text', typ: u(undefined, r('FluffyMessageText')) }, + { json: 'type', js: 'type', typ: r('MessageType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + FluffyMessageText: o( + [ + { json: 'text/markdown', js: 'text/markdown', typ: u(undefined, '') }, + { json: 'text/plain', js: 'text/plain', typ: u(undefined, '') }, + ], + 'any' + ), + Nothing: o( + [ + { json: 'type', js: 'type', typ: r('NothingType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + Order: o( + [ + { json: 'details', js: 'details', typ: u(undefined, r('PurpleOrderDetails')) }, + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('OrderType') }, + ], + 'any' + ), + PurpleOrderDetails: o([{ json: 'product', js: 'product', typ: u(undefined, r('ProductObject')) }], 'any'), + ProductObject: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'instrument', js: 'instrument', typ: u(undefined, r('InstrumentElement')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('ProductType') }, + ], + 'any' + ), + OrderList: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'orders', js: 'orders', typ: a(r('OrderElement')) }, + { json: 'type', js: 'type', typ: r('OrderListType') }, + ], + 'any' + ), + OrderElement: o( + [ + { json: 'details', js: 'details', typ: u(undefined, r('FluffyOrderDetails')) }, + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('OrderType') }, + ], + 'any' + ), + FluffyOrderDetails: o([{ json: 'product', js: 'product', typ: u(undefined, r('ProductObject')) }], 'any'), + Organization: o( + [ + { json: 'id', js: 'id', typ: r('OrganizationIdentifiers') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('StickyInteractionType') }, + ], + 'any' + ), + OrganizationIdentifiers: o( + [ + { json: 'FDS_ID', js: 'FDS_ID', typ: u(undefined, '') }, + { json: 'LEI', js: 'LEI', typ: u(undefined, '') }, + { json: 'PERMID', js: 'PERMID', typ: u(undefined, '') }, + ], + 'any' + ), + Portfolio: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'positions', js: 'positions', typ: a(r('PositionElement')) }, + { json: 'type', js: 'type', typ: r('PortfolioType') }, + ], + 'any' + ), + PositionElement: o( + [ + { json: 'holding', js: 'holding', typ: 3.14 }, + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'instrument', js: 'instrument', typ: r('InstrumentElement') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('PositionType') }, + ], + 'any' + ), + Position: o( + [ + { json: 'holding', js: 'holding', typ: 3.14 }, + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'instrument', js: 'instrument', typ: r('InstrumentElement') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('PositionType') }, + ], + 'any' + ), + Product: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'instrument', js: 'instrument', typ: u(undefined, r('InstrumentElement')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: r('ProductType') }, + ], + 'any' + ), + TimeRange: o( + [ + { json: 'endTime', js: 'endTime', typ: u(undefined, Date) }, + { json: 'startTime', js: 'startTime', typ: u(undefined, Date) }, + { json: 'type', js: 'type', typ: r('TimeRangeType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + Trade: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'product', js: 'product', typ: r('ProductObject') }, + { json: 'type', js: 'type', typ: r('TradeType') }, + ], + 'any' + ), + TradeList: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'trades', js: 'trades', typ: a(r('TradeElement')) }, + { json: 'type', js: 'type', typ: r('TradeListType') }, + ], + 'any' + ), + TradeElement: o( + [ + { json: 'id', js: 'id', typ: m('') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'product', js: 'product', typ: r('ProductObject') }, + { json: 'type', js: 'type', typ: r('TradeType') }, + ], + 'any' + ), + TransactionResult: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('ContextElement')) }, + { json: 'message', js: 'message', typ: u(undefined, '') }, + { json: 'status', js: 'status', typ: r('TransactionStatus') }, + { json: 'type', js: 'type', typ: r('TransactionResultType') }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + Valuation: o( + [ + { json: 'CURRENCY_ISOCODE', js: 'CURRENCY_ISOCODE', typ: '' }, + { json: 'expiryTime', js: 'expiryTime', typ: u(undefined, Date) }, + { json: 'price', js: 'price', typ: u(undefined, 3.14) }, + { json: 'type', js: 'type', typ: r('ValuationType') }, + { json: 'valuationTime', js: 'valuationTime', typ: u(undefined, Date) }, + { json: 'value', js: 'value', typ: 3.14 }, + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + 'any' + ), + ActionType: ['broadcast', 'raiseIntent'], + ActionTypeEnum: ['fdc3.action'], + PurpleInteractionType: ['fdc3.instrument'], + TimeRangeType: ['fdc3.timeRange'], + ChartStyle: ['bar', 'candle', 'custom', 'heatmap', 'histogram', 'line', 'mountain', 'pie', 'scatter', 'stacked-bar'], + ChartType: ['fdc3.chart'], + FluffyInteractionType: ['fdc3.contact'], + ContactListType: ['fdc3.contactList'], + EntityType: ['fdc3.action', 'fdc3.fileAttachment'], + MessageType: ['fdc3.message'], + ChatInitSettingsType: ['fdc3.chat.initSettings'], + ChatRoomType: ['fdc3.chat.room'], + ChatMessageType: ['fdc3.chat.message'], + TentacledInteractionType: ['fdc3.contact', 'fdc3.instrument', 'fdc3.organization'], + ChatSearchCriteriaType: ['fdc3.chat.searchCriteria'], + CountryType: ['fdc3.country'], + CurrencyType: ['fdc3.currency'], + EmailRecipientsType: ['fdc3.contact', 'fdc3.contactList'], + EmailType: ['fdc3.email'], + FileAttachmentType: ['fdc3.fileAttachment'], + InstrumentListType: ['fdc3.instrumentList'], + InteractionType: ['fdc3.interaction'], + NothingType: ['fdc3.nothing'], + ProductType: ['fdc3.product'], + OrderType: ['fdc3.order'], + OrderListType: ['fdc3.orderList'], + StickyInteractionType: ['fdc3.organization'], + PositionType: ['fdc3.position'], + PortfolioType: ['fdc3.portfolio'], + TradeType: ['fdc3.trade'], + TradeListType: ['fdc3.tradeList'], + TransactionStatus: ['Created', 'Deleted', 'Failed', 'Updated'], + TransactionResultType: ['fdc3.transactionResult'], + ValuationType: ['fdc3.valuation'], +}; diff --git a/packages/fdc3-context/package.json b/packages/fdc3-context/package.json new file mode 100644 index 000000000..f7d812c09 --- /dev/null +++ b/packages/fdc3-context/package.json @@ -0,0 +1,46 @@ +{ + "name": "@finos/fdc3-context", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "rimraf dist && rimraf generated", + "mkdirs": "npx mkdirp generated/context", + "generate": "npm run mkdirs && npm run typegen && npm run lint", + "build": "npm run generate && tsc --module es2022", + "lint": "eslint generated/ --fix && npx prettier generated/ --write", + "test": "npm run generate && tsc", + "typegen": "cd schemas && node ../s2tQuicktypeUtil.js context ../generated/context/ContextTypes.ts" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "mkdirp": "^3.0.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } +} \ No newline at end of file diff --git a/s2tQuicktypeUtil.js b/packages/fdc3-context/s2tQuicktypeUtil.js similarity index 85% rename from s2tQuicktypeUtil.js rename to packages/fdc3-context/s2tQuicktypeUtil.js index bd0c7a855..fd27e242e 100644 --- a/s2tQuicktypeUtil.js +++ b/packages/fdc3-context/s2tQuicktypeUtil.js @@ -1,18 +1,18 @@ /** * SPDX-License-Identifier: Apache-2.0 * Copyright FINOS FDC3 contributors - see NOTICE file - */ + */ /** Utility for preparing arguments to quicktype, which workaround a specific * quicktype bug in command line argument handling (where a directory is used * as input the source language argument is ignored which causes our schemas * to be interpreted as JSON input, rather than JSONSchema). - * + * * Individual file arguments will be interpreted as 'additional' schema files - * that will be referenced from the other schemas and will not have top-level output + * that will be referenced from the other schemas and will not have top-level output * schemas generated, while folders will be listed and the schema files they contain - * added as inputs and will have top-level types generated. - * + * added as inputs and will have top-level types generated. + * * */ const path = require('path'); @@ -29,33 +29,33 @@ console.log('Inputs schema files: ' + inputs.join(' | ')); console.log('Output file argument: ' + outputFile); let sources = ''; -let additionalSchemaFiles = '' +let additionalSchemaFiles = ''; //skip duplicate paths (we might want to specify some files to go first, and might duplicate them) const allPaths = new Set(); -const addAPath = (aPath,paths,sources,type) => { +const addAPath = (aPath, paths, sources, type) => { if (!paths.has(aPath)) { - paths.add(aPath) + paths.add(aPath); return sources + ` ${type} ${aPath}`; } else { console.log(`skipping duplicate path ${aPath}`); return sources; } -} +}; //process the content of folders to produce code for top-level types let inputIndex = 0; while (inputIndex < inputs.length) { if (inputs[inputIndex].endsWith('.schema.json')) { //add individual files with -S as additional schema files used in references (rather than ones that need a top-level output) - additionalSchemaFiles = addAPath(path.join(inputs[inputIndex]),allPaths,additionalSchemaFiles, "-S"); + additionalSchemaFiles = addAPath(path.join(inputs[inputIndex]), allPaths, additionalSchemaFiles, '-S'); } else { fs.readdirSync(inputs[inputIndex], { withFileTypes: true }).forEach(file => { if (file.isDirectory()) { inputs.push(path.join(inputs[inputIndex], file.name)); } else if (file.name.endsWith('.schema.json')) { - sources = addAPath(path.join(inputs[inputIndex], file.name),allPaths,sources, "--src"); + sources = addAPath(path.join(inputs[inputIndex], file.name), allPaths, sources, '--src'); } }); } @@ -64,12 +64,12 @@ while (inputIndex < inputs.length) { // Normalise path to local quicktype executable. //const quicktypeExec = "node " + ["..","quicktype","dist","index.js"].join(path.sep); -const quicktypeExec = ['..', 'node_modules', '.bin', 'quicktype'].join(path.sep); +const quicktypeExec = ['..', '..', '..', 'node_modules', '.bin', 'quicktype'].join(path.sep); const command = `${quicktypeExec} --prefer-const-values --prefer-unions -s schema -o ${outputFile} ${additionalSchemaFiles} ${sources}`; console.log('command to run: ' + command); -exec(command, function(error, stdout, stderr) { +exec(command, function (error, stdout, stderr) { if (stdout) { console.log(stdout); } diff --git a/schemas/context/action.schema.json b/packages/fdc3-context/schemas/context/action.schema.json similarity index 100% rename from schemas/context/action.schema.json rename to packages/fdc3-context/schemas/context/action.schema.json diff --git a/schemas/context/chart.schema.json b/packages/fdc3-context/schemas/context/chart.schema.json similarity index 100% rename from schemas/context/chart.schema.json rename to packages/fdc3-context/schemas/context/chart.schema.json diff --git a/schemas/context/chatInitSettings.schema.json b/packages/fdc3-context/schemas/context/chatInitSettings.schema.json similarity index 100% rename from schemas/context/chatInitSettings.schema.json rename to packages/fdc3-context/schemas/context/chatInitSettings.schema.json diff --git a/schemas/context/chatMessage.schema.json b/packages/fdc3-context/schemas/context/chatMessage.schema.json similarity index 100% rename from schemas/context/chatMessage.schema.json rename to packages/fdc3-context/schemas/context/chatMessage.schema.json diff --git a/schemas/context/chatRoom.schema.json b/packages/fdc3-context/schemas/context/chatRoom.schema.json similarity index 100% rename from schemas/context/chatRoom.schema.json rename to packages/fdc3-context/schemas/context/chatRoom.schema.json diff --git a/schemas/context/chatSearchCriteria.schema.json b/packages/fdc3-context/schemas/context/chatSearchCriteria.schema.json similarity index 100% rename from schemas/context/chatSearchCriteria.schema.json rename to packages/fdc3-context/schemas/context/chatSearchCriteria.schema.json diff --git a/schemas/context/contact.schema.json b/packages/fdc3-context/schemas/context/contact.schema.json similarity index 100% rename from schemas/context/contact.schema.json rename to packages/fdc3-context/schemas/context/contact.schema.json diff --git a/schemas/context/contactList.schema.json b/packages/fdc3-context/schemas/context/contactList.schema.json similarity index 100% rename from schemas/context/contactList.schema.json rename to packages/fdc3-context/schemas/context/contactList.schema.json diff --git a/schemas/context/context.schema.json b/packages/fdc3-context/schemas/context/context.schema.json similarity index 100% rename from schemas/context/context.schema.json rename to packages/fdc3-context/schemas/context/context.schema.json diff --git a/schemas/context/country.schema.json b/packages/fdc3-context/schemas/context/country.schema.json similarity index 100% rename from schemas/context/country.schema.json rename to packages/fdc3-context/schemas/context/country.schema.json diff --git a/schemas/context/currency.schema.json b/packages/fdc3-context/schemas/context/currency.schema.json similarity index 100% rename from schemas/context/currency.schema.json rename to packages/fdc3-context/schemas/context/currency.schema.json diff --git a/schemas/context/email.schema.json b/packages/fdc3-context/schemas/context/email.schema.json similarity index 100% rename from schemas/context/email.schema.json rename to packages/fdc3-context/schemas/context/email.schema.json diff --git a/schemas/context/fileAttachment.schema.json b/packages/fdc3-context/schemas/context/fileAttachment.schema.json similarity index 100% rename from schemas/context/fileAttachment.schema.json rename to packages/fdc3-context/schemas/context/fileAttachment.schema.json diff --git a/schemas/context/instrument.schema.json b/packages/fdc3-context/schemas/context/instrument.schema.json similarity index 100% rename from schemas/context/instrument.schema.json rename to packages/fdc3-context/schemas/context/instrument.schema.json diff --git a/schemas/context/instrumentList.schema.json b/packages/fdc3-context/schemas/context/instrumentList.schema.json similarity index 100% rename from schemas/context/instrumentList.schema.json rename to packages/fdc3-context/schemas/context/instrumentList.schema.json diff --git a/schemas/context/interaction.schema.json b/packages/fdc3-context/schemas/context/interaction.schema.json similarity index 100% rename from schemas/context/interaction.schema.json rename to packages/fdc3-context/schemas/context/interaction.schema.json diff --git a/schemas/context/message.schema.json b/packages/fdc3-context/schemas/context/message.schema.json similarity index 100% rename from schemas/context/message.schema.json rename to packages/fdc3-context/schemas/context/message.schema.json diff --git a/schemas/context/nothing.schema.json b/packages/fdc3-context/schemas/context/nothing.schema.json similarity index 100% rename from schemas/context/nothing.schema.json rename to packages/fdc3-context/schemas/context/nothing.schema.json diff --git a/schemas/context/order.schema.json b/packages/fdc3-context/schemas/context/order.schema.json similarity index 100% rename from schemas/context/order.schema.json rename to packages/fdc3-context/schemas/context/order.schema.json diff --git a/schemas/context/orderList.schema.json b/packages/fdc3-context/schemas/context/orderList.schema.json similarity index 100% rename from schemas/context/orderList.schema.json rename to packages/fdc3-context/schemas/context/orderList.schema.json diff --git a/schemas/context/organization.schema.json b/packages/fdc3-context/schemas/context/organization.schema.json similarity index 100% rename from schemas/context/organization.schema.json rename to packages/fdc3-context/schemas/context/organization.schema.json diff --git a/schemas/context/portfolio.schema.json b/packages/fdc3-context/schemas/context/portfolio.schema.json similarity index 100% rename from schemas/context/portfolio.schema.json rename to packages/fdc3-context/schemas/context/portfolio.schema.json diff --git a/schemas/context/position.schema.json b/packages/fdc3-context/schemas/context/position.schema.json similarity index 100% rename from schemas/context/position.schema.json rename to packages/fdc3-context/schemas/context/position.schema.json diff --git a/schemas/context/product.schema.json b/packages/fdc3-context/schemas/context/product.schema.json similarity index 100% rename from schemas/context/product.schema.json rename to packages/fdc3-context/schemas/context/product.schema.json diff --git a/schemas/context/timeRange.schema.json b/packages/fdc3-context/schemas/context/timeRange.schema.json similarity index 100% rename from schemas/context/timeRange.schema.json rename to packages/fdc3-context/schemas/context/timeRange.schema.json diff --git a/schemas/context/trade.schema.json b/packages/fdc3-context/schemas/context/trade.schema.json similarity index 100% rename from schemas/context/trade.schema.json rename to packages/fdc3-context/schemas/context/trade.schema.json diff --git a/schemas/context/tradeList.schema.json b/packages/fdc3-context/schemas/context/tradeList.schema.json similarity index 100% rename from schemas/context/tradeList.schema.json rename to packages/fdc3-context/schemas/context/tradeList.schema.json diff --git a/schemas/context/transactionresult.schema.json b/packages/fdc3-context/schemas/context/transactionresult.schema.json similarity index 100% rename from schemas/context/transactionresult.schema.json rename to packages/fdc3-context/schemas/context/transactionresult.schema.json diff --git a/schemas/context/valuation.schema.json b/packages/fdc3-context/schemas/context/valuation.schema.json similarity index 100% rename from schemas/context/valuation.schema.json rename to packages/fdc3-context/schemas/context/valuation.schema.json diff --git a/packages/fdc3-context/src/index.ts b/packages/fdc3-context/src/index.ts new file mode 100644 index 000000000..996ccfffb --- /dev/null +++ b/packages/fdc3-context/src/index.ts @@ -0,0 +1 @@ +export * from '../generated/context/ContextTypes'; diff --git a/packages/fdc3-context/tsconfig.json b/packages/fdc3-context/tsconfig.json new file mode 100644 index 000000000..275f759db --- /dev/null +++ b/packages/fdc3-context/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src", + "generated" + ], + "outDir": "dist", + }, + "include": [ + "src/**/*.ts", + "generated/**/*", + "schemas/**/*.json" + ], + "exclude": [ + "dist/**" + ], + "references": [] +} \ No newline at end of file diff --git a/packages/fdc3-get-agent/cucumber.yml b/packages/fdc3-get-agent/cucumber.yml new file mode 100644 index 000000000..2572a0c7b --- /dev/null +++ b/packages/fdc3-get-agent/cucumber.yml @@ -0,0 +1,15 @@ +default: + format: + - html:cucumber-report.html + - "@cucumber/pretty-formatter" + - junit:test-results.xml + paths: + - test/features/*.feature + require: + - test/step-definitions/*.steps.ts + - test/support/*.ts + - test/world/index.ts + requireModule: + - ts-node/register + tags: "not @failing" + diff --git a/packages/fdc3-get-agent/eslint.config.mjs b/packages/fdc3-get-agent/eslint.config.mjs new file mode 100644 index 000000000..c7018a2c8 --- /dev/null +++ b/packages/fdc3-get-agent/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, +]; diff --git a/packages/fdc3-get-agent/package.json b/packages/fdc3-get-agent/package.json new file mode 100644 index 000000000..621a54f00 --- /dev/null +++ b/packages/fdc3-get-agent/package.json @@ -0,0 +1,52 @@ +{ + "name": "@finos/fdc3-get-agent", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc --module es2022", + "test": "tsc && nyc --reporter=lcov --reporter=text --reporter json cucumber-js", + "clean": "rimraf dist cucumber-report.html coverage .nyc_output node_modules test-results.xml", + "lint": "eslint src/" + }, + "dependencies": { + "@finos/fdc3-agent-proxy": "2.2.0-alpha.3", + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3", + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@eslint/js": "^9.16.0", + "@finos/fdc3-web-impl": "2.2.0-alpha.3", + "@finos/testing": "2.2.0-alpha.3", + "@types/node": "^20.16.11", + "@types/wtfnode": "^0.7.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "expect": "^29.7.0", + "globals": "^15.13.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "rimraf": "^6.0.1", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "wtfnode": "^0.9.3" + } +} \ No newline at end of file diff --git a/packages/fdc3-get-agent/src/Fdc3Version.ts b/packages/fdc3-get-agent/src/Fdc3Version.ts new file mode 100644 index 000000000..dd4efaadd --- /dev/null +++ b/packages/fdc3-get-agent/src/Fdc3Version.ts @@ -0,0 +1 @@ +export const FDC3_VERSION = '2.2'; diff --git a/packages/fdc3-get-agent/src/apps/NoopAppSupport.ts b/packages/fdc3-get-agent/src/apps/NoopAppSupport.ts new file mode 100644 index 000000000..a159b7555 --- /dev/null +++ b/packages/fdc3-get-agent/src/apps/NoopAppSupport.ts @@ -0,0 +1,15 @@ +import { AppIdentifier, AppMetadata } from '@finos/fdc3-standard'; +import { Messaging } from '@finos/fdc3-agent-proxy'; +import { DefaultAppSupport } from '@finos/fdc3-agent-proxy'; + +export class NoopAppSupport extends DefaultAppSupport { + constructor(messaging: Messaging, messageExchangeTimeout: number, appLaunchTimeout: number) { + super(messaging, messageExchangeTimeout, appLaunchTimeout); + } + + async getAppMetadata(app: AppIdentifier): Promise { + return { + appId: app.appId, + }; + } +} diff --git a/packages/fdc3-get-agent/src/index.ts b/packages/fdc3-get-agent/src/index.ts new file mode 100644 index 000000000..5dece7ca9 --- /dev/null +++ b/packages/fdc3-get-agent/src/index.ts @@ -0,0 +1,36 @@ +import { DesktopAgent } from '@finos/fdc3-standard'; +import { getAgent } from './strategies/getAgent'; +import { AbstractUIComponent } from './ui/AbstractUIComponent'; +import { DefaultDesktopAgentChannelSelector } from './ui/DefaultDesktopAgentChannelSelector'; +import { DefaultDesktopAgentIntentResolver } from './ui/DefaultDesktopAgentIntentResolver'; +import { NullChannelSelector } from './ui/NullChannelSelector'; +import { NullIntentResolver } from './ui/NullIntentResolver'; + +const DEFAULT_WAIT_FOR_MS = 20000; + +export { + getAgent, + AbstractUIComponent, + DefaultDesktopAgentChannelSelector, + DefaultDesktopAgentIntentResolver, + NullChannelSelector, + NullIntentResolver, +}; + +/** + * Replaces the original fdc3Ready function from FDC3 2.0 with a new one that uses the new getAgent function. + * + * @param waitForMs Amount of time to wait before failing the promise (20 seconds is the default). + * @returns A DesktopAgent promise. + * + * @deprecated This function is provided for backwards compatibility. Use `const fdc3 = getAgent()` to retrieve (and + * wait for) a reference to the FDC3 API instead. + */ +export function fdc3Ready(waitForMs = DEFAULT_WAIT_FOR_MS): Promise { + return getAgent({ + timeoutMs: waitForMs, + dontSetWindowFdc3: false, + channelSelector: true, + intentResolver: true, + }); +} diff --git a/packages/fdc3-get-agent/src/messaging/MessagePortMessaging.ts b/packages/fdc3-get-agent/src/messaging/MessagePortMessaging.ts new file mode 100644 index 000000000..54422c45c --- /dev/null +++ b/packages/fdc3-get-agent/src/messaging/MessagePortMessaging.ts @@ -0,0 +1,77 @@ +import { AbstractMessaging, RegisterableListener } from '@finos/fdc3-agent-proxy'; +import { AppIdentifier, GetAgentParams, WebDesktopAgentType } from '@finos/fdc3-standard'; +import { v4 as uuidv4 } from 'uuid'; +import { + AppRequestMessage, + WebConnectionProtocol3Handshake, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +/** + * Details needed to set up the Messaging instance and Desktop AgentDetails record + */ +export type ConnectionDetails = { + connectionAttemptUuid: string; + handshake: WebConnectionProtocol3Handshake; + messagePort: MessagePort; + actualUrl: string; + options: GetAgentParams; + agentType: WebDesktopAgentType; + agentUrl?: string; + messageExchangeTimeout: number; + appLaunchTimeout: number; +}; +export class MessagePortMessaging extends AbstractMessaging { + private readonly cd: ConnectionDetails; + private readonly listeners: Map = new Map(); + + constructor(cd: ConnectionDetails, appIdentifier: AppIdentifier) { + super(appIdentifier); + this.cd = cd; + + this.cd.messagePort.addEventListener('message', m => { + this.listeners.forEach(v => { + if (v.filter(m.data)) { + v.action(m.data); + } + }); + }); + } + + createUUID(): string { + return uuidv4(); + } + + async post(message: AppRequestMessage | WebConnectionProtocol6Goodbye): Promise { + this.cd.messagePort.postMessage(message); + return Promise.resolve(); + } + + register(l: RegisterableListener): void { + this.listeners.set(l.id!, l); + } + + unregister(id: string): void { + this.listeners.delete(id); + } + + createMeta(): AppRequestMessage['meta'] { + return { + requestUuid: this.createUUID(), + timestamp: new Date(), + source: super.getAppIdentifier(), + }; + } + + async disconnect(): Promise { + const bye: WebConnectionProtocol6Goodbye = { + type: 'WCP6Goodbye', + meta: { + timestamp: new Date(), + }, + }; + await this.post(bye); + + this.cd.messagePort.close(); + } +} diff --git a/packages/fdc3-get-agent/src/messaging/message-port.ts b/packages/fdc3-get-agent/src/messaging/message-port.ts new file mode 100644 index 000000000..ea1d24d54 --- /dev/null +++ b/packages/fdc3-get-agent/src/messaging/message-port.ts @@ -0,0 +1,102 @@ +import { AppIdentifier, DesktopAgent, LogLevel } from '@finos/fdc3-standard'; +import { + DesktopAgentProxy, + DefaultChannelSupport, + DefaultAppSupport, + DefaultIntentSupport, + ChannelSupport, + DefaultHeartbeatSupport, +} from '@finos/fdc3-agent-proxy'; +import { ConnectionDetails, MessagePortMessaging } from './MessagePortMessaging'; +import { DefaultDesktopAgentIntentResolver } from '../ui/DefaultDesktopAgentIntentResolver'; +import { DefaultDesktopAgentChannelSelector } from '../ui/DefaultDesktopAgentChannelSelector'; +import { NullIntentResolver } from '../ui/NullIntentResolver'; +import { NullChannelSelector } from '../ui/NullChannelSelector'; +import { ChannelSelector } from '@finos/fdc3-standard'; +import { Logger } from '../util/Logger'; + +/** + * Given a message port, constructs a desktop agent to communicate via that. + */ +export async function createDesktopAgentAPI( + cd: ConnectionDetails, + appIdentifier: AppIdentifier, + logLevel: LogLevel | null +): Promise { + Logger.debug('message-port: Creating Desktop Agent...'); + + //Message port should have already been started for use in identity validation + + function string(o: string | boolean): string | null { + if (o == true || o == false) { + return null; + } else { + return o; + } + } + + const messaging = new MessagePortMessaging(cd, appIdentifier); + + const useResolver = cd.handshake.payload.intentResolverUrl && cd.options.intentResolver; + const useSelector = cd.handshake.payload.channelSelectorUrl && cd.options.channelSelector; + + const intentResolver = useResolver + ? new DefaultDesktopAgentIntentResolver(string(cd.handshake.payload.intentResolverUrl)) + : new NullIntentResolver(); + + const channelSelector = useSelector + ? new DefaultDesktopAgentChannelSelector(string(cd.handshake.payload.channelSelectorUrl)) + : new NullChannelSelector(); + + Logger.debug('message-port: Setting up support components...'); + + const hs = new DefaultHeartbeatSupport(messaging); + const cs = new DefaultChannelSupport(messaging, channelSelector, cd.messageExchangeTimeout); + const is = new DefaultIntentSupport(messaging, intentResolver, cd.messageExchangeTimeout, cd.appLaunchTimeout); + const as = new DefaultAppSupport(messaging, cd.messageExchangeTimeout, cd.appLaunchTimeout); + const da = new DesktopAgentProxy(hs, cs, is, as, [hs, intentResolver, channelSelector], logLevel); + + Logger.debug('message-port: Connecting components ...'); + + await da.connect(); + + Logger.debug('message-port: Populating channel selector...'); + + await populateChannelSelector(cs, channelSelector); + + Logger.debug('message-port: Setting up disconnect handling...'); + + handleDisconnectOnPageHide(da, messaging); + + Logger.debug('message-port: Returning...'); + + return da; +} + +async function populateChannelSelector(cs: ChannelSupport, channelSelector: ChannelSelector): Promise { + const channel = await cs.getUserChannel(); + const userChannels = await cs.getUserChannels(); + channelSelector.updateChannel(channel?.id ?? null, userChannels); +} + +function handleDisconnectOnPageHide(da: DesktopAgentProxy, messaging: MessagePortMessaging) { + globalThis.window.addEventListener('pagehide', async event => { + Logger.log(`Received pagehide event with persisted ${event.persisted}`); + + //If persisted == true then the page is stored and might come back if the user hits back + // In that case don't disconnect and let heartbeat handle that instead + + //TODO: implement disconnect on any hide and reconnect if the page is shown again + // Will have to happen inside the DesktopAgentProxy as the reference to the DA needs to remain the same + // and any listeners need to be re-registered automatically etc. + if (!event.persisted) { + //the page is being destroyed, disconnect from the DA + + //Notify the Desktop Agent implementation to disconnect + da.disconnect(); + + //disconnect the MessagePort - which should send WCP6Goodbye first + messaging.disconnect(); + } + }); +} diff --git a/packages/fdc3-get-agent/src/sessionStorage/DesktopAgentDetails.ts b/packages/fdc3-get-agent/src/sessionStorage/DesktopAgentDetails.ts new file mode 100644 index 000000000..d30cf1082 --- /dev/null +++ b/packages/fdc3-get-agent/src/sessionStorage/DesktopAgentDetails.ts @@ -0,0 +1,92 @@ +import { DesktopAgentDetails, DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX } from '@finos/fdc3-standard'; +import { Logger } from '../util/Logger'; +import { createUUID } from '../util/Uuid'; + +/** + * Note that we also key by the window name as well, in case multiple iframes are using the same session storage. + */ +export function sessionKey(): string { + //If the window or frame is not named, create and apply a unique name to it + if (!globalThis.window.name) { + globalThis.window.name = createUUID(); + } + const windowName = globalThis.window.name; + const keyName = DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-' + windowName; + return keyName; +} + +/** Used to persist data on the connection, which can later be used to ensure + * reconnection to the same Desktop Agent and to request the same instanceId. + */ +export function storeDesktopAgentDetails(details: DesktopAgentDetails) { + Logger.debug(`DesktopAgentDetails: Storing Desktop Agent details:`, details); + //check if there are existing details in storage to update + let detailsToStore = retrieveAllDesktopAgentDetails(); + if (!detailsToStore) { + detailsToStore = {}; + } + detailsToStore[details.identityUrl] = details; + globalThis.sessionStorage.setItem(sessionKey(), JSON.stringify(detailsToStore)); +} + +/** Retrieves persisted data about previous connections. Used to ensure reconnection + * to the same agent and to request the same instanceId. + */ +export function retrieveAllDesktopAgentDetails(): Record | null { + const detailsStr = globalThis.sessionStorage.getItem(sessionKey()); + + if (detailsStr) { + try { + const theData: Record = JSON.parse(detailsStr) as Record< + string, + DesktopAgentDetails + >; + if (typeof theData !== 'object' || Array.isArray(theData)) { + throw new Error('Stored DesktopAgentDetails is not in the expected format!'); + } + return theData; + } catch (e) { + Logger.warn( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + `DesktopAgentDetails: FDC3 connection data couldn't be parsed\nstorage key: ${sessionKey()}\nvalue: ${detailsStr}\nmessage: ${(e as any).message ?? e}` + ); + return null; + } + } else { + return null; + } +} + +/** Retrieves persisted data about previous connections for this specific app + * (identified by the identityUrl). Used to ensure reconnection to the same + * agent and to request the same instanceId. + */ +export function retrieveDesktopAgentDetails(identityUrl: string): DesktopAgentDetails | null { + const allDetails = retrieveAllDesktopAgentDetails(); + Logger.debug(`DesktopAgentDetails: retrieveDesktopAgentDetails:`, allDetails); + if (allDetails) { + const theData: DesktopAgentDetails = allDetails[identityUrl]; + + if (theData) { + //check we got the minimum properties + if ( + typeof theData.agentType === 'string' && + theData.agentType && //TODO: check this is one of the enum values + typeof theData.appId === 'string' && + theData.appId && + typeof theData.instanceId === 'string' && + theData.instanceId + ) { + return theData; + } else { + //ignore it and post a warning + Logger.warn( + `DesktopAgentDetails: Stored details do not meet minimum requirements and will be ignored:\n${JSON.stringify(theData, null, 2)}` + ); + return null; + } + } + } + + return null; +} diff --git a/packages/fdc3-get-agent/src/strategies/DesktopAgentPreloadLoader.ts b/packages/fdc3-get-agent/src/strategies/DesktopAgentPreloadLoader.ts new file mode 100644 index 000000000..d00368601 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/DesktopAgentPreloadLoader.ts @@ -0,0 +1,112 @@ +import { AgentError, DesktopAgent, WebDesktopAgentType } from '@finos/fdc3-standard'; +import { GetAgentParams } from '@finos/fdc3-standard'; +import { DesktopAgentSelection, Loader } from './Loader'; +import { Logger } from '../util/Logger'; +import { DEFAULT_GETAGENT_TIMEOUT_MS } from './Timeouts'; + +/** + * This approach will resolve the loader promise if the fdc3Ready event occurs. + * This is done by Desktop Agent Preload implementations setting window.fdc3. + */ +export class DesktopAgentPreloadLoader implements Loader { + name = 'DesktopAgentPreloadLoader'; + + /** Reference to the handler for the fdc3Ready event (used to remove it) */ + readyEventHandler: (() => void) | null = null; + /** Variable used to end polling */ + done: boolean = false; + /** Overall timeout */ + timeout: NodeJS.Timeout | null = null; + /** Timeout used in polling */ + pollingTimeout: NodeJS.Timeout | null = null; + + /** Reference to the get fn's Promise's reject call - used when cancelling. */ + rejectFn: ((reason?: string) => void) | null = null; + + async poll(resolve: (value: DesktopAgentSelection) => void) { + if (!this.done) { + if (globalThis.window.fdc3) { + Logger.debug(`DesktopAgentPreloadLoader.get(): Discovered DA through polling...`); + this.prepareSelection(globalThis.window.fdc3, resolve); + } else { + this.pollingTimeout = setTimeout(() => this.poll(resolve), 100); + } + } + } + + async prepareSelection(fdc3: DesktopAgent, resolve: (value: DesktopAgentSelection) => void) { + Logger.debug('DesktopAgentPreloadLoader: Preparing selection'); + + //note that we've found an agent and will be settling our get promise + this.rejectFn = null; + //stop polling and listening for fdc3Ready + this.cancel(); + + //retrieve appId from DA + const implMetadata = await fdc3.getInfo(); + const selection: DesktopAgentSelection = { + agent: fdc3, + details: { + agentType: WebDesktopAgentType.Preload, + identityUrl: globalThis.window.location.href, + actualUrl: globalThis.window.location.href, + appId: implMetadata.appMetadata.appId, + instanceId: implMetadata.appMetadata.instanceId ?? 'unknown', + instanceUuid: implMetadata.appMetadata.instanceId ?? 'unknown', // preload DAs don't issue these so repeat the instanceId + }, + }; + + resolve(selection); + } + + get(options: GetAgentParams): Promise { + Logger.debug(`DesktopAgentPreloadLoader.get(): Initiating search for Desktop Agent Preload`); + return new Promise((resolve, reject) => { + //save reject fn in case we get cancelled + this.rejectFn = reject; + + //do an initial check + if (globalThis.window.fdc3) { + this.prepareSelection(globalThis.window.fdc3, resolve); + } else { + //setup a timeout so that we can reject if don't find anything + const timeoutMs = options.timeoutMs ?? DEFAULT_GETAGENT_TIMEOUT_MS; + this.timeout = setTimeout(() => { + Logger.debug(`DesktopAgentPreloadLoader.get(): timeout (${timeoutMs} ms) at ${new Date().toISOString()}`); + reject(AgentError.AgentNotFound); + this.cancel(); + }, timeoutMs); + + //listen for the fdc3Ready event + this.readyEventHandler = () => { + Logger.debug(`DesktopAgentPreloadLoader.get(): discovered DA through fdc3Ready event`); + if (globalThis.window.fdc3) { + this.prepareSelection(globalThis.window.fdc3, resolve); + } + }; + globalThis.window.addEventListener('fdc3Ready', this.readyEventHandler); + + //also do polling (just in case) + this.poll(resolve); + } + }); + } + + async cancel(): Promise { + Logger.debug('DesktopAgentPreloadLoader: Cleaning up'); + this.done = true; + if (this.timeout) { + clearTimeout(this.timeout); + } + if (this.pollingTimeout) { + clearTimeout(this.pollingTimeout); + } + if (this.readyEventHandler) { + globalThis.window.removeEventListener('fdc3Ready', this.readyEventHandler); + } + if (this.rejectFn) { + this.rejectFn(AgentError.AgentNotFound); + this.rejectFn = null; + } + } +} diff --git a/packages/fdc3-get-agent/src/strategies/FailoverHandler.ts b/packages/fdc3-get-agent/src/strategies/FailoverHandler.ts new file mode 100644 index 000000000..ec55e7d84 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/FailoverHandler.ts @@ -0,0 +1,151 @@ +import { + GetAgentParams, + DesktopAgent, + WebDesktopAgentType, + AgentError, + AppIdentifier, + LogLevel, +} from '@finos/fdc3-standard'; +import { createDesktopAgentAPI } from '../messaging/message-port'; +import { DesktopAgentSelection } from './Loader'; +import { v4 as uuidv4 } from 'uuid'; +import { HelloHandler } from './HelloHandler'; +import { IdentityValidationHandler } from './IdentityValidationHandler'; +import { Logger } from '../util/Logger'; +import { ConnectionDetails } from '../messaging/MessagePortMessaging'; + +/** TypeGuard for a Desktop Agent */ +function isDesktopAgent(da: WindowProxy | DesktopAgent): da is DesktopAgent { + return (da as DesktopAgent).getInfo !== undefined; +} + +/** TypeGuard for a Window */ +function isWindow(da: Window | DesktopAgent): da is Window { + return (da as Window).postMessage !== undefined; +} + +export class FailoverHandler { + constructor(options: GetAgentParams) { + this.options = options; + this.connectionAttemptUuid = uuidv4(); // we use a different connectionAttemptUuid to differnetiate from any (failed) messaging to a parent window + this.helloHandler = new HelloHandler(this.options, this.connectionAttemptUuid, WebDesktopAgentType.Failover); + } + + /** Parameters passed to getAgent */ + options: GetAgentParams; + + /** UUID used to filter messages */ + connectionAttemptUuid: string; + + /** Handler class for hello/handshake messages */ + helloHandler: HelloHandler; + + /** Handler class for identity validation steps used for Desktop Agent Proxies */ + identityValidationHandler?: IdentityValidationHandler; + + /** + * This is a variation of the PostMessageLoader used for handling failover. + * If the failover returns a WindowProxy this is used to create a Desktop + * Agent Proxy. If a DesktopAgent is returned directly it is passed through. + * + */ + async handleFailover(): Promise { + try { + //set-up a event listeners in case the failover returns a Window that wants to message us + const handshakePromise = this.helloHandler.listenForHelloResponses(); + + if (typeof this.options.failover === 'function') { + const failoverResult = await this.options.failover(this.options); + + if (isDesktopAgent(failoverResult)) { + return await this.failoverResultIsDesktopAgent(failoverResult); + } else if (isWindow(failoverResult)) { + return await this.failoverResultIsProxyWindow(failoverResult, handshakePromise); + } else { + Logger.error('Failover function returned an invalid result: ', failoverResult); + throw AgentError.InvalidFailover; + } + } else { + Logger.error('Failover was not a function, actual type: ', typeof this.options.failover); + throw AgentError.InvalidFailover; + } + } finally { + //cleanup any remaining listeners + this.cancel(); + } + } + + private async failoverResultIsProxyWindow(failoverResult: Window, handshakePromise: Promise) { + this.helloHandler.sendWCP1Hello(failoverResult, '*'); + + //if we received a WindowProxy from failover, and it sent us a handshake, try to validate its identity + const connectionDetails = await handshakePromise; + try { + this.identityValidationHandler = new IdentityValidationHandler( + connectionDetails.messagePort, + this.options, + this.connectionAttemptUuid + ); + const idValidationPromise = this.identityValidationHandler.listenForIDValidationResponses(); + + //start the message port so that we can receive responses + connectionDetails.messagePort.start(); + + this.identityValidationHandler.sendIdValidationMessage(); + const idDetails = await idValidationPromise; + const appIdentifier: AppIdentifier = { + appId: idDetails.payload.appId, + instanceId: idDetails.payload.instanceId, + }; + + //prep log settings to pass on to the proxy + const logLevel: LogLevel | null = this.options?.logLevels?.proxy ?? null; + + const desktopAgentSelection: DesktopAgentSelection = { + agent: await createDesktopAgentAPI(connectionDetails, appIdentifier, logLevel), + details: { + agentType: connectionDetails.agentType, + agentUrl: connectionDetails.agentUrl ?? undefined, + identityUrl: connectionDetails.options.identityUrl ?? connectionDetails.actualUrl, + actualUrl: connectionDetails.actualUrl, + appId: idDetails.payload.appId, + instanceId: idDetails.payload.instanceId, + instanceUuid: idDetails.payload.instanceUuid, + }, + }; + + return desktopAgentSelection; + } catch (e) { + //identity validation may have failed + Logger.error('Error during identity validation of Failover', e); + throw e; + } + } + + private async failoverResultIsDesktopAgent(failoverResult: DesktopAgent) { + this.cancel(); + + //retrieve appId and instanceId from the DA + const implMetadata = await failoverResult.getInfo(); + const desktopAgentSelection: DesktopAgentSelection = { + agent: failoverResult, + details: { + agentType: WebDesktopAgentType.Failover, + identityUrl: globalThis.window.location.href, + actualUrl: globalThis.window.location.href, + appId: implMetadata.appMetadata.appId, + instanceId: implMetadata.appMetadata.instanceId ?? 'unknown', + instanceUuid: implMetadata.appMetadata.instanceId ?? 'unknown', // preload DAs don't issue these so repeat the instanceId + }, + }; + return desktopAgentSelection; + } + + /** Removes listeners so that events are no longer processed */ + cancel() { + this.helloHandler.cancel(); + if (this.identityValidationHandler) { + this.identityValidationHandler.cancel(); + } + } +} diff --git a/packages/fdc3-get-agent/src/strategies/HelloHandler.ts b/packages/fdc3-get-agent/src/strategies/HelloHandler.ts new file mode 100644 index 000000000..4b0c6a2ee --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/HelloHandler.ts @@ -0,0 +1,165 @@ +import { FDC3_VERSION, GetAgentParams, WebDesktopAgentType } from '@finos/fdc3-standard'; +import { ConnectionDetails } from '../messaging/MessagePortMessaging'; +import { Logger } from '../util/Logger'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { DEFAULT_MESSAGE_EXCHANGE_TIMEOUT_MS, DEFAULT_APP_LAUNCH_TIMEOUT_MS } from './Timeouts'; +const { isWebConnectionProtocol2LoadURL, isWebConnectionProtocol3Handshake } = BrowserTypes; +type WebConnectionProtocolMessage = BrowserTypes.WebConnectionProtocolMessage; +type WebConnectionProtocol1Hello = BrowserTypes.WebConnectionProtocol1Hello; + +export class HelloHandler { + constructor( + options: GetAgentParams, + connectionAttemptUuid: string, + agentType: WebDesktopAgentType = WebDesktopAgentType.ProxyParent + ) { + this.options = options; + this.connectionAttemptUuid = connectionAttemptUuid; + this.agentType = agentType; + this.helloResponseListener = null; + } + + /** Parameters passed to getAgent */ + options: GetAgentParams; + + /** UUID used to filter messages */ + connectionAttemptUuid: string; + + /** The agentType to set, which may change if we're asked to load a URL into an iframe */ + agentType: WebDesktopAgentType; + + /** If we're asked to load a URL into an iframe, it is stored here to be saved in Session Storage */ + agentUrl: string | null = null; + + /** Reference to event listener used for responses from Desktop Agents - + * Used to remove them when no longer needed. + * Initialized when + * - listening for hello responses + * - listening for identity validation responses + * */ + helloResponseListener: ((event: MessageEvent) => void) | null; + + /** + * Starts the connection process off by sending a hello message + */ + sendWCP1Hello(w: MessageEventSource, origin: string) { + const requestMessage: WebConnectionProtocol1Hello = { + type: 'WCP1Hello', + meta: { + connectionAttemptUuid: this.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + channelSelector: this.options.channelSelector, + fdc3Version: FDC3_VERSION, + resolver: this.options.intentResolver, + identityUrl: this.options.identityUrl!, + actualUrl: globalThis.window.location.href, + }, + }; + + Logger.debug(`HelloHandler: Sending hello msg:\n${JSON.stringify(requestMessage, null, 2)}`); + + w.postMessage(requestMessage, { targetOrigin: origin }); + } + + /** + * Handle a request from a desktop agent that the client loads an adaptor URL + * into an iframe instead of working with the parent window. + */ + openFrame(url: string) { + const IFRAME_ID = 'fdc3-communications-embedded-iframe'; + + // remove an old one if it's there + document.getElementById(IFRAME_ID)?.remove(); + + //note the iframe URL and desktop agent type have changed + this.agentType = WebDesktopAgentType.ProxyUrl; + this.agentUrl = url; + + // create a new one + const iframe = document.createElement('iframe'); + + //Wait for the iframe to load... then send it a hello message + iframe.addEventListener('load', () => { + if (iframe.contentWindow) { + Logger.debug('Sending hello message to communication iframe'); + this.sendWCP1Hello(iframe.contentWindow, '*'); + } else { + throw new Error( + `An iframe (url: ${url}) added to support communication with a Desktop Agent does not have a contentWindow, despite firing its load event!` + ); + } + }); + + iframe.setAttribute('src', url); + iframe.setAttribute('id', IFRAME_ID); + iframe.setAttribute('name', 'FDC3 Communications'); + iframe.style.width = '0px'; + iframe.style.height = '0px'; + iframe.style.border = '0'; + iframe.style.position = 'fixed'; + + document.body.appendChild(iframe); + } + + /** Listen for WCP responses from 'parent' windows and frames and handle them. + * Resolves when a response is received. + * @returns A Promise resolving to a set of ConnectionDetails + */ + listenForHelloResponses(): Promise { + return new Promise(resolve => { + // setup listener for message and retrieve JS URL from it + this.helloResponseListener = (event: MessageEvent) => { + const data = event.data; + + if (data?.meta?.connectionAttemptUuid == this.connectionAttemptUuid) { + if (isWebConnectionProtocol2LoadURL(data)) { + // in this case, we need to load the URL with the embedded Iframe + const url = data.payload.iframeUrl; + this.openFrame(url); + + //n.b event listener remains in place to receive messages from the iframe + } else if (isWebConnectionProtocol3Handshake(data)) { + Logger.debug(`HelloHandler: successful handshake:`, data); + const connectionDetails: ConnectionDetails = { + connectionAttemptUuid: this.connectionAttemptUuid, + handshake: data, + messagePort: event.ports[0], + options: this.options, + actualUrl: globalThis.window.location.href, + agentType: this.agentType, + agentUrl: this.agentUrl ?? undefined, + messageExchangeTimeout: data.payload.messageExchangeTimeout ?? DEFAULT_MESSAGE_EXCHANGE_TIMEOUT_MS, + appLaunchTimeout: data.payload.appLaunchTimeout ?? DEFAULT_APP_LAUNCH_TIMEOUT_MS, + }; + resolve(connectionDetails); + + //remove the event listener as we've received a messagePort to use + this.cancel(); + } else { + Logger.debug( + `Ignoring unexpected message in HelloHandler (because its not WCP2LoadUrl or WCP3Handshake).`, + data + ); + } + } else { + Logger.warn( + `HelloHandler: Ignoring message with invalid connectionAttemptUuid. Expected ${this.connectionAttemptUuid}, received: ${data?.meta?.connectionAttemptUuid}`, + data + ); + } + }; + + globalThis.window.addEventListener('message', this.helloResponseListener); + }); + } + + /** Removes listeners so that events are no longer processed */ + cancel() { + if (this.helloResponseListener) { + globalThis.window.removeEventListener('message', this.helloResponseListener); + this.helloResponseListener = null; + } + } +} diff --git a/packages/fdc3-get-agent/src/strategies/IdentityValidationHandler.ts b/packages/fdc3-get-agent/src/strategies/IdentityValidationHandler.ts new file mode 100644 index 000000000..7b4a1a550 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/IdentityValidationHandler.ts @@ -0,0 +1,141 @@ +import { GetAgentParams, AgentError } from '@finos/fdc3-standard'; +import { retrieveDesktopAgentDetails } from '../sessionStorage/DesktopAgentDetails'; +import { Logger } from '../util/Logger'; + +import { BrowserTypes } from '@finos/fdc3-schema'; +const { + isWebConnectionProtocol5ValidateAppIdentitySuccessResponse, + isWebConnectionProtocol5ValidateAppIdentityFailedResponse, +} = BrowserTypes; +type WebConnectionProtocol4ValidateAppIdentity = BrowserTypes.WebConnectionProtocol4ValidateAppIdentity; +type WebConnectionProtocol5ValidateAppIdentitySuccessResponse = + BrowserTypes.WebConnectionProtocol5ValidateAppIdentitySuccessResponse; +type WebConnectionProtocolMessage = BrowserTypes.WebConnectionProtocolMessage; + +/** Timeout allowed for id validation to occur and for the DA to respond with details. + * This is additional to the app's specified timeout for discovery - we have already + * found an agent at that point we are just finishing setting up the connection. */ +const ID_VALIDATION_TIMEOUT = 5000; + +export class IdentityValidationHandler { + constructor(mp: MessagePort, options: GetAgentParams, connectionAttemptUuid: string) { + this.messagePort = mp; + this.options = options; + this.connectionAttemptUuid = connectionAttemptUuid; + this.idValidationResponseListener = null; + } + + /** Reference to the MessagePort received. Used to remove listeners when cancelling. */ + messagePort: MessagePort; + + /** Parameters passed to getAgent */ + options: GetAgentParams; + + /** UUID used to filter messages */ + connectionAttemptUuid: string; + + /** Event listener for ID validation response from Desktop Agents over the MessagePort. + * Used to remove them when no longer needed. + * Initialized during the id validation step. + */ + idValidationResponseListener: ((event: MessageEvent) => void) | null; + + /** + * Starts the connection process off by sending a hello message + */ + sendIdValidationMessage() { + const actualUrl = globalThis.window.location.href; + const identityUrl = this.options.identityUrl ?? actualUrl; + + const requestMessage: WebConnectionProtocol4ValidateAppIdentity = { + type: 'WCP4ValidateAppIdentity', + meta: { + connectionAttemptUuid: this.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + identityUrl, + actualUrl, + }, + }; + + const persistedDetails = retrieveDesktopAgentDetails(identityUrl); + + if (persistedDetails) { + requestMessage.payload.instanceId = persistedDetails.instanceId; + requestMessage.payload.instanceUuid = persistedDetails.instanceUuid; + } + + this.messagePort.postMessage(requestMessage); + } + + /** Listen for WCP responses over the message port to identity validation messages. */ + listenForIDValidationResponses(): Promise { + return new Promise((resolve, reject) => { + // setup listener for message and retrieve JS URL from it + this.idValidationResponseListener = (event: MessageEvent) => { + const data = event.data; + + if (data?.meta?.connectionAttemptUuid == this.connectionAttemptUuid) { + if (isWebConnectionProtocol5ValidateAppIdentitySuccessResponse(data)) { + //passed validation + clearTimeout(timeout); + if (this.idValidationResponseListener) { + //remove the event listener as we've received a messagePort to use + this.messagePort.removeEventListener('message', this.idValidationResponseListener); + } + Logger.debug( + `IdentityValidationHandler: Validated app identity, appId: ${data.payload.appId}, instanceId: ${data.payload.instanceId}` + ); + resolve(data); + } else if (isWebConnectionProtocol5ValidateAppIdentityFailedResponse(data)) { + //failed validation... + clearTimeout(timeout); + if (this.idValidationResponseListener) { + //remove the event listener as we've received a messagePort to use + this.messagePort.removeEventListener('message', this.idValidationResponseListener); + } + Logger.error( + `IdentityValidationHandler: App identity validation failed: ${data.payload.message ?? 'No reason given'}` + ); + reject(AgentError.AccessDenied); + } else { + Logger.debug( + `IdentityValidationHandler: Ignoring message unexpected message in PostMessageLoader (because its not a WCP5 message).`, + data + ); + } + } else { + Logger.warn( + `IdentityValidationHandler: Ignoring message with invalid connectionAttemptUuid. Expected ${this.connectionAttemptUuid}, received: ${data?.meta?.connectionAttemptUuid}`, + data + ); + } + }; + + //listening on a message port + this.messagePort.addEventListener('message', this.idValidationResponseListener); + + //timeout for id validation only + const timeout = setTimeout(() => { + Logger.warn(`IdentityValidationHandler: Identity validation timed out`); + + if (this.idValidationResponseListener) { + //remove the event listener as we won't proceed further + this.messagePort.removeEventListener('message', this.idValidationResponseListener); + } + Logger.error( + `The Desktop Agent didn't respond to ID validation within ${ID_VALIDATION_TIMEOUT / 1000} seconds` + ); + reject(AgentError.ErrorOnConnect); + }, ID_VALIDATION_TIMEOUT); + }); + } + + cancel(): void { + if (this.idValidationResponseListener) { + this.messagePort.removeEventListener('message', this.idValidationResponseListener); + } + //TODO: cancel any timeouts and reject any returned promises + } +} diff --git a/packages/fdc3-get-agent/src/strategies/Loader.ts b/packages/fdc3-get-agent/src/strategies/Loader.ts new file mode 100644 index 000000000..70629da59 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/Loader.ts @@ -0,0 +1,33 @@ +import { DesktopAgent, WebDesktopAgentType } from '@finos/fdc3-standard'; +import { GetAgentParams } from '@finos/fdc3-standard'; + +/** + * Represents the common interface for a loading strategy + */ +export interface Loader { + /** + * Promise will either resolve to a DesktopAgent or reject with an error + */ + get(options: GetAgentParams): Promise; + + cancel(): Promise; + + name: string; +} + +/** Specific partial of DesktopAgentDetails defining the details that Loaders + * must return with a DesktopAgent to be put into SessionStorage at the end + * of the process. + */ +export interface DesktopAgentSelection { + agent: DesktopAgent; + details: { + agentType: WebDesktopAgentType; + identityUrl: string; + actualUrl: string; + agentUrl?: string; + appId: string; + instanceId: string; + instanceUuid: string; + }; +} diff --git a/packages/fdc3-get-agent/src/strategies/PostMessageLoader.ts b/packages/fdc3-get-agent/src/strategies/PostMessageLoader.ts new file mode 100644 index 000000000..f47173599 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/PostMessageLoader.ts @@ -0,0 +1,187 @@ +import { AgentError, AppIdentifier, GetAgentParams, LogLevel } from '@finos/fdc3-standard'; +import { createDesktopAgentAPI } from '../messaging/message-port'; +import { v4 as uuidv4 } from 'uuid'; +import { DesktopAgentSelection, Loader } from './Loader'; +import { HelloHandler } from './HelloHandler'; +import { IdentityValidationHandler } from './IdentityValidationHandler'; +import { Logger } from '../util/Logger'; +import { DEFAULT_GETAGENT_TIMEOUT_MS } from './Timeouts'; + +/** + * Recursive search for all possible parent frames (windows) that we may + * target with the WCP. + * @param startWindow window object to search + * @param found window objects found so far + */ +function collectPossibleTargets(startWindow: Window, found: Window[]) { + _recursePossibleTargets(startWindow, startWindow, found); + Logger.debug(`Possible parent windows/frames found: ${found.length}`); +} + +function _recursePossibleTargets(startWindow: Window, w: Window, found: Window[]) { + if (w) { + if (found.indexOf(w) == -1 && w != startWindow) { + found.push(w); + } + + if (w.opener) { + _recursePossibleTargets(startWindow, w.opener, found); + } + + if (w.parent != w) { + _recursePossibleTargets(startWindow, w.parent, found); + } + } +} + +/** Loader for Desktop Agent Proxy implementations. Attempts to + * connect to parent windows or frames via teh Web Connection Protocol, + * which may include setting up an iframe to load an adaptor URL. + * A previously persisted adaptor URL may be passed to skip the + * discovery of parent windows and to move straight to loading that. + */ +export class PostMessageLoader implements Loader { + name = 'PostMessageLoader'; + private proxyLogLevel: LogLevel | null; + + constructor(options: GetAgentParams, previousUrl?: string) { + //prep log settings to pass on to the proxy + this.proxyLogLevel = options.logLevels?.proxy ?? null; + + this.previousUrl = previousUrl ?? null; + } + + previousUrl: string | null; + connectionAttemptUuid = uuidv4(); + + helloHandler?: HelloHandler; + identityValidationHandler?: IdentityValidationHandler; + + /** Initial timeout (released once a MessagePort is received - additional steps are outside timeout) */ + timeout: NodeJS.Timeout | null = null; + + /** Reference to the get fn's Promise's reject call - used when cancelling. */ + rejectFn: ((reason?: string) => void) | null = null; + + get(options: GetAgentParams): Promise { + Logger.debug(`PostMessageLoader.get(): Initiating search for Desktop Agent Proxy`); + return new Promise((resolve, reject) => { + //save reject fn in case we get cancelled + this.rejectFn = reject; + + //setup a timeout so we can reject if it runs out + const timeoutMs = options.timeoutMs ?? DEFAULT_GETAGENT_TIMEOUT_MS; + this.timeout = setTimeout(() => { + Logger.debug(`PostMessageLoader.get(): timeout (${timeoutMs} ms) at ${new Date().toISOString()}`); + this.cancel(); + reject(AgentError.AgentNotFound); + }, timeoutMs); + + this.helloHandler = new HelloHandler(options, this.connectionAttemptUuid); + + // ok, begin the process + const handshakePromise = this.helloHandler.listenForHelloResponses(); + + if (this.previousUrl) { + Logger.debug(`PostMessageLoader.get(): Loading previously used adaptor URL: ${this.previousUrl}`); + + //skip looking for target parent windows and open an iframe immediately + this.helloHandler.openFrame(this.previousUrl); + } else { + //collect target parent window references + const targets: Window[] = []; + collectPossibleTargets(globalThis.window, targets); + + // use of origin '*': See https://github.com/finos/FDC3/issues/1316 + for (let t = 0; t < targets.length; t++) { + this.helloHandler.sendWCP1Hello(targets[t], '*'); + } + } + + // wait for one of the windows to respond + // This may involve a WCP2LoadUrl response being received + // and an adaptor iframe setup to load it, resolves on + // WCP3Handshake response. + // If no WCP3Handshake is ever received this will not resolve + handshakePromise.then(connectionDetails => { + //prevent us being cancelled + this.rejectFn = null; + + //cancel the initial timeout as we got a handshake response + if (this.timeout) { + clearTimeout(this.timeout); + } + + //perform id validation + this.identityValidationHandler = new IdentityValidationHandler( + connectionDetails.messagePort, + options, + this.connectionAttemptUuid + ); + const idValidationPromise = this.identityValidationHandler.listenForIDValidationResponses(); + + //start the message port so that we can receive responses + connectionDetails.messagePort.start(); + + this.identityValidationHandler.sendIdValidationMessage(); + + idValidationPromise + .then(idDetails => { + //resolve + const appIdentifier: AppIdentifier = { + appId: idDetails.payload.appId, + instanceId: idDetails.payload.instanceId, + }; + + createDesktopAgentAPI(connectionDetails, appIdentifier, this.proxyLogLevel).then(da => { + const desktopAgentSelection: DesktopAgentSelection = { + agent: da, + details: { + agentType: connectionDetails.agentType, + agentUrl: connectionDetails.agentUrl ?? undefined, + identityUrl: connectionDetails.options.identityUrl ?? connectionDetails.actualUrl, + actualUrl: connectionDetails.actualUrl, + appId: idDetails.payload.appId, + instanceId: idDetails.payload.instanceId, + instanceUuid: idDetails.payload.instanceUuid, + }, + }; + + //clean up + this.cancel(); + + resolve(desktopAgentSelection); + }); + }) + .catch(e => { + //id validation may have failed + reject(e); + }); + }); + }); + } + + async cancel(): Promise { + Logger.debug('PostMessageLoader: Cleaning up'); + + //if we're being cancelled while still running, reject the promise + if (this.rejectFn) { + this.rejectFn(AgentError.AgentNotFound); + this.rejectFn = null; + } + + //cancel the timeout + if (this.timeout) { + clearTimeout(this.timeout); + } + + //remove any event listeners to end processing + if (this.helloHandler) { + this.helloHandler.cancel(); + } + + if (this.identityValidationHandler) { + this.identityValidationHandler.cancel(); + } + } +} diff --git a/packages/fdc3-get-agent/src/strategies/Timeouts.ts b/packages/fdc3-get-agent/src/strategies/Timeouts.ts new file mode 100644 index 000000000..1d452cce6 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/Timeouts.ts @@ -0,0 +1,18 @@ +/** + * The default timeout used by getAgent when discovering Desktop Agents. + */ +export const DEFAULT_GETAGENT_TIMEOUT_MS = 1000; + +/** Default timeout used by a DesktopAgentProxy for all message exchanges + * with a DesktopAgent, except those that involve the launch of an application. + * May be overridden by a DesktopAgent by passing a value in the + * payload.messageExchangeTimeout of a WCP3Handshake message. + */ +export const DEFAULT_MESSAGE_EXCHANGE_TIMEOUT_MS = 10000; + +/** Default timeout used by a DesktopAgentProxy for message exchanges with a + * DesktopAgent that involve launching applications. May be overridden by a + * DesktopAgent by passing a value in the payload.appLaunchTimeout of a + * WCP3Handshake message. + * */ +export const DEFAULT_APP_LAUNCH_TIMEOUT_MS = 100000; diff --git a/packages/fdc3-get-agent/src/strategies/getAgent.ts b/packages/fdc3-get-agent/src/strategies/getAgent.ts new file mode 100644 index 000000000..3df28bdc6 --- /dev/null +++ b/packages/fdc3-get-agent/src/strategies/getAgent.ts @@ -0,0 +1,235 @@ +import { + DesktopAgent, + GetAgentType, + GetAgentParams, + AgentError, + DesktopAgentDetails, + WebDesktopAgentType, +} from '@finos/fdc3-standard'; +import { DesktopAgentPreloadLoader } from './DesktopAgentPreloadLoader'; +import { PostMessageLoader } from './PostMessageLoader'; +import { retrieveDesktopAgentDetails, storeDesktopAgentDetails } from '../sessionStorage/DesktopAgentDetails'; +import { FailoverHandler } from './FailoverHandler'; +import { Loader } from './Loader'; +import { Logger } from '../util/Logger'; +import { DEFAULT_GETAGENT_TIMEOUT_MS } from './Timeouts'; + +// TypeGuards used to examine results of Loaders +const isRejected = (input: PromiseSettledResult): input is PromiseRejectedResult => + input.status === 'rejected'; + +const isFulfilled = (input: PromiseSettledResult): input is PromiseFulfilledResult => + input.status === 'fulfilled'; + +/** + * For now, we only allow a single call to getAgent per application, so + * we keep track of the promise we use here. + */ +let theAgentPromise: Promise | null = null; + +const CLEAR_PROMISE_DELAY = 500; + +export function clearAgentPromise() { + theAgentPromise = null; +} + +function initAgentPromise(options: GetAgentParams): Promise { + if (options?.logLevels?.connection) { + Logger.setLogLevel(options.logLevels.connection); + } + + Logger.log(`Initiating Desktop Agent discovery at ${new Date().toISOString()}`); + let strategies: Loader[]; + + //if options doesn't contain an identityURL, use the actualUrl + if (!options.identityUrl) { + options.identityUrl = globalThis.window.location.href; + } + + //Retrieve persisted connection data limit to a previous strategy if one exists + const persistedData = retrieveDesktopAgentDetails(options.identityUrl); + if (persistedData) { + switch (persistedData.agentType) { + case WebDesktopAgentType.Preload: + strategies = [new DesktopAgentPreloadLoader()]; + break; + case WebDesktopAgentType.ProxyUrl: + //agentUrl will only be used by PostMessageLoader if not falsey + strategies = [new PostMessageLoader(options, persistedData.agentUrl)]; + break; + case WebDesktopAgentType.ProxyParent: + strategies = [new PostMessageLoader(options)]; + break; + case WebDesktopAgentType.Failover: + strategies = []; + break; + default: + Logger.warn('Unexpected agentType value in SessionStorage, ignoring. Stored data:', persistedData); + strategies = [new DesktopAgentPreloadLoader(), new PostMessageLoader(options)]; + } + } else { + strategies = [new DesktopAgentPreloadLoader(), new PostMessageLoader(options)]; + } + + const promises = strategies.map(s => + s.get(options).then(async selection => { + //cancel other strategies if we selected a DA + Logger.debug(`Strategy ${s.name} resolved - cleaning up other strategies`); + for (let s2 = 0; s2 < strategies.length; s2++) { + if (strategies[s2] !== s) { + Logger.debug(` cleaning up ${strategies[s2].name}`); + await strategies[s2].cancel(); + } + } + strategies.forEach(async s2 => { + if (s2 !== s) { + await s2.cancel(); + } + }); + return selection; + }) + ); + + Logger.debug('Waiting for discovery promises to settle...'); + return Promise.allSettled(promises).then(async results => { + //review results + const daResult = results.find(isFulfilled); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const replacer = (key: string, value: any) => { + if (key == 'value') { + return ''; + } else { + return value; + } + }; + Logger.debug(`Discovery results: ${JSON.stringify(results, replacer, 2)}`); + + if (daResult) { + const selection = daResult.value; + const desktopAgentDetails: DesktopAgentDetails = { + agentType: selection.details.agentType, + identityUrl: selection.details.identityUrl, + actualUrl: selection.details.actualUrl, + agentUrl: selection.details.agentUrl ?? undefined, + appId: selection.details.appId, + instanceId: selection.details.instanceId, + instanceUuid: selection.details.instanceUuid, + }; + storeDesktopAgentDetails(desktopAgentDetails); + Logger.log( + `Desktop Agent located via discovery, appId: ${desktopAgentDetails.appId}, instanceId: ${desktopAgentDetails.instanceId}` + ); + return selection.agent; + } else { + //if we received any error other than AgentError.AgentNotFound, throw it + const errors = results.filter(isRejected); + + //n.b. the Loaders throw string error messages, rather than Error objects + const error = errors.find(aRejection => aRejection.reason !== AgentError.AgentNotFound); + if (error) { + //Clear the promise so a fresh call could be made later + setTimeout(() => clearAgentPromise(), CLEAR_PROMISE_DELAY); + throw new Error(error.reason); + } else if (options.failover != undefined) { + Logger.debug(`Calling failover fn...`); + //Proceed with the failover + try { + //TODO: consider adding a timeout for the failover, to avoid getting stuck here + // However there is an argument to be made for hanging out in case the + // function eventually returns, e.g. after an external DA started up + + const failoverHandler = new FailoverHandler(options); + const selection = await failoverHandler.handleFailover(); + + //store details of the connection in SessionStorage + const desktopAgentDetails: DesktopAgentDetails = { + agentType: WebDesktopAgentType.Failover, + identityUrl: selection.details.identityUrl, + actualUrl: selection.details.actualUrl, + agentUrl: selection.details.agentUrl ?? undefined, + appId: selection.details.appId, + instanceId: selection.details.instanceId, + instanceUuid: selection.details.instanceUuid, + }; + storeDesktopAgentDetails(desktopAgentDetails); + Logger.log( + `Desktop Agent located via failover, appId: ${desktopAgentDetails.appId}, instanceId: ${desktopAgentDetails.instanceId}` + ); + + return selection.agent; + } catch (e) { + //n.b. FailoverHandler throws Error Objects so we can return this directly + Logger.error('Desktop agent not found. Error reported during failover: ', e); + throw new Error(e as string); + } + } else { + //We didn't manage to find an agent. + Logger.error('Desktop agent not found. No error reported during discovery.'); + //Clear the promise so a fresh call could be made later + setTimeout(() => clearAgentPromise(), CLEAR_PROMISE_DELAY); + throw new Error(AgentError.AgentNotFound); + } + } + }); +} + +/** + * Function used to retrieve an FDC3 Desktop Agent API instance, which + * supports the discovery of a Desktop Agent Preload (a container-injected + * API implementation) or a Desktop Agent Proxy (a Browser-based Desktop Agent + * running in another window or frame). Finally, if no Desktop Agent is found, + * a failover function may be supplied by an app allowing it to start or otherwise + * connect to a Desktop Agent (e.g. by loading a proprietary adaptor that + * returns a `DesktopAgent` implementation or by creating a window or iframe of + * its own that will provide a Desktop Agent Proxy. + * + * @param {GetAgentParams} params Optional parameters object, which + * may include a URL to use for the app's identity, other settings + * that affect the behavior of the getAgent() function and a `failover` + * function that should be run if a Desktop Agent is not detected. + * + * @returns A promise that resolves to a DesktopAgent implementation or + * rejects with an error message from the `AgentError` enumeration if unable to + * return a Desktop Agent implementation. + * + * @example + * const fdc3 = await getAgent(); + * + * // OR + * + * getAgent({ + * identityUrl: "https://example.com/path?param=appName#example", + * channelSelector: false, + * intentResolver: false + * }).then((fdc3) => { + * //do FDC3 stuff here + * }; + */ +export const getAgent: GetAgentType = (params?: GetAgentParams) => { + const DEFAULT_OPTIONS: GetAgentParams = { + dontSetWindowFdc3: true, + channelSelector: true, + intentResolver: true, + timeoutMs: DEFAULT_GETAGENT_TIMEOUT_MS, + //default log levels are set in the relevant logging utils + }; + + const options: GetAgentParams = { + ...DEFAULT_OPTIONS, + ...params, + }; + + async function handleSetWindowFdc3(da: DesktopAgent) { + if (!options.dontSetWindowFdc3 && !globalThis.window.fdc3) { + globalThis.window.fdc3 = da; + globalThis.window.dispatchEvent(new Event('fdc3Ready')); + } + return da; + } + + if (!theAgentPromise) { + theAgentPromise = initAgentPromise(options).then(handleSetWindowFdc3); + } + + return theAgentPromise; +}; diff --git a/packages/fdc3-get-agent/src/ui/AbstractUIComponent.ts b/packages/fdc3-get-agent/src/ui/AbstractUIComponent.ts new file mode 100644 index 000000000..d520b6210 --- /dev/null +++ b/packages/fdc3-get-agent/src/ui/AbstractUIComponent.ts @@ -0,0 +1,177 @@ +import { Connectable, FDC3_VERSION } from '@finos/fdc3-standard'; +import { Logger } from '../util/Logger'; +import { BrowserTypes } from '@finos/fdc3-schema'; +const { isFdc3UserInterfaceHello, isFdc3UserInterfaceRestyle } = BrowserTypes; +type Fdc3UserInterfaceHandshake = BrowserTypes.Fdc3UserInterfaceHandshake; +type InitialCSS = BrowserTypes.InitialCSS; +type UpdatedCSS = BrowserTypes.UpdatedCSS; + +export interface CSSPositioning { + [key: string]: string; +} + +export const INITIAL_CONTAINER_CSS = { + width: '0', + height: '0', + position: 'fixed', +}; + +export const ALLOWED_CSS_ELEMENTS = [ + 'width', + 'height', + 'position', + 'zIndex', + 'left', + 'right', + 'top', + 'bottom', + 'transition', + 'maxHeight', + 'maxWidth', + 'display', +]; + +export const DEFAULT_UI_ROOT_URL = 'https://fdc3.finos.org/toolbox/fdc3-reference-ui/'; + +/** Abstract implementation of an injected UI, used as the base for communication + * with injected Channel Selector and Intent Resolver UIs. + */ +export abstract class AbstractUIComponent implements Connectable { + private container: HTMLDivElement | undefined = undefined; + private iframe: HTMLIFrameElement | undefined = undefined; + private url: string; + private name: string; + protected port: MessagePort | null = null; + protected messagePortIsReady: Promise; + private markMessagePortReady: (() => void) | null = null; + + constructor(url: string, name: string) { + this.url = url; + this.name = name; + this.messagePortIsReady = new Promise(resolve => (this.markMessagePortReady = resolve)); + } + + /** + * Connect the UI component by creating the UI iframe, then wait on + * a Fdc3UserInterfaceHello message. + * + * This function is NOT properly async as we don't want to block the + * Desktop Agent connection on the UI frames as they may be blocked by + * security policies. I.e. awaiting this will not block. + */ + connect(): Promise { + Logger.debug(`AbstractUIComponent (${this.name}): Awaiting hello from `, this.name, ', url: ', this.url); + const portPromise = this.awaitHello(); + this.openFrame(); + portPromise.then(port => { + this.port = port; + this.setupMessagePort(port).then(() => { + this.messagePortReady(port); + }); + }); + return Promise.resolve(); + } + + async disconnect() { + this.port?.close(); + } + + /** + * Override and extend this method to provide functionality specific to the UI in question + */ + async setupMessagePort(port: MessagePort): Promise { + port.addEventListener('message', e => { + const data = e.data; + + if (isFdc3UserInterfaceRestyle(data)) { + Logger.debug(`AbstractUIComponent (${this.name}): Restyling: `, data.payload); + const css = data.payload.updatedCSS; + this.themeContainer(css); + } + }); + port.start(); + } + + async messagePortReady(port: MessagePort) { + // tells the iframe it can start posting + const message: Fdc3UserInterfaceHandshake = { + type: 'Fdc3UserInterfaceHandshake', + payload: { + fdc3Version: FDC3_VERSION, + }, + }; + Logger.debug(`AbstractUIComponent (${this.name}): Sending handshake: `, message); + port.postMessage(message); + this.markMessagePortReady!(); + } + + private awaitHello(): Promise { + return new Promise(resolve => { + const ml = (e: MessageEvent) => { + //only respond to messages from this UI's iframe + if (e.source == this.iframe?.contentWindow) { + if (isFdc3UserInterfaceHello(e.data)) { + const helloData = e.data; + this.themeContainer(helloData.payload.initialCSS); + const port = e.ports[0]; + globalThis.window.removeEventListener('message', ml); + resolve(port); + } else { + Logger.warn( + `AbstractUIComponent (${this.name}): ignored UI Message from UI iframe while awaiting hello: `, + e.data + ); + } + } else { + //as there are two UIs, we expect some cross-over between their messages + Logger.debug( + `AbstractUIComponent (${this.name}): ignored Message that didn't come from expected UI frame: `, + e.data, + 'my URL: ', + this.url + ); + } + }; + + globalThis.window.addEventListener('message', ml); + }); + } + + private openFrame(): void { + this.container = globalThis.document.createElement('div'); + this.iframe = globalThis.document.createElement('iframe'); + + this.themeContainer(INITIAL_CONTAINER_CSS); + this.themeFrame(this.iframe); + + this.iframe.setAttribute('src', this.url); + this.iframe.setAttribute('name', this.name); + + this.container.appendChild(this.iframe); + document.body.appendChild(this.container); + } + + private toKebabCase(str: string) { + return str.replace(/[A-Z]/g, match => '-' + match.toLowerCase()); + } + + themeContainer(css: UpdatedCSS | InitialCSS) { + Logger.debug(`AbstractUIComponent (${this.name}): Applying styles to container`, css); + for (let i = 0; i < ALLOWED_CSS_ELEMENTS.length; i++) { + const k = ALLOWED_CSS_ELEMENTS[i]; + const value: string | undefined = css[k as string]; + if (value != null) { + this.container!.style.setProperty(this.toKebabCase(k), value); + } else { + this.container!.style.removeProperty(this.toKebabCase(k)); + } + } + } + + themeFrame(ifrm: HTMLIFrameElement) { + Logger.debug(`AbstractUIComponent (${this.name}): Applying 100% size style to iframe`); + ifrm.style.width = '100%'; + ifrm.style.height = '100%'; + ifrm.style.border = '0'; + } +} diff --git a/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentChannelSelector.ts b/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentChannelSelector.ts new file mode 100644 index 000000000..9ceb4fa75 --- /dev/null +++ b/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentChannelSelector.ts @@ -0,0 +1,62 @@ +import { Channel } from '@finos/fdc3-standard'; +import { ChannelSelector } from '@finos/fdc3-standard'; +import { AbstractUIComponent, DEFAULT_UI_ROOT_URL } from './AbstractUIComponent'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { Logger } from '../util/Logger'; +const { isFdc3UserInterfaceChannelSelected } = BrowserTypes; +type Fdc3UserInterfaceChannels = BrowserTypes.Fdc3UserInterfaceChannels; + +/** + * Handles communication between an injected Channel Selector UI and the getAgent implementation. + */ +export class DefaultDesktopAgentChannelSelector extends AbstractUIComponent implements ChannelSelector { + private callback: ((channelId: string | null) => void) | null = null; + + constructor(url: string | null) { + //TODO: check default UI URL is correct on release + super(url ?? DEFAULT_UI_ROOT_URL + 'channel_selector.html', 'FDC3 Channel Selector'); + } + + async setupMessagePort(port: MessagePort): Promise { + this.port = port; + + port.addEventListener('message', e => { + if (isFdc3UserInterfaceChannelSelected(e.data)) { + Logger.debug(`DefaultDesktopAgentChannelSelector: Received channel selection message: `, e.data); + const choice = e.data; + if (this.callback) { + this.callback(choice.payload.selected); + } + } + }); + + //This starts the port so do it last + await super.setupMessagePort(port); + } + + async updateChannel(channelId: string | null, availableChannels: Channel[]): Promise { + const message: Fdc3UserInterfaceChannels = { + type: 'Fdc3UserInterfaceChannels', + payload: { + selected: channelId, + userChannels: availableChannels.map(ch => { + return { + id: ch.id, + type: 'user', + displayMetadata: ch.displayMetadata, + }; + }), + }, + }; + + //don't post until the messageport is ready + await this.messagePortIsReady; + + this.port?.postMessage(message); + Logger.debug(`DefaultDesktopAgentChannelSelector: Sent channels data to channel selector: `, message); + } + + setChannelChangeCallback(callback: (channelId: string | null) => void): void { + this.callback = callback; + } +} diff --git a/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentIntentResolver.ts b/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentIntentResolver.ts new file mode 100644 index 000000000..23cd6231b --- /dev/null +++ b/packages/fdc3-get-agent/src/ui/DefaultDesktopAgentIntentResolver.ts @@ -0,0 +1,61 @@ +import { AppIntent } from '@finos/fdc3-standard'; +import { IntentResolver, IntentResolutionChoice } from '@finos/fdc3-standard'; +import { AbstractUIComponent, DEFAULT_UI_ROOT_URL } from './AbstractUIComponent'; +import { Context } from '@finos/fdc3-context'; +import { Logger } from '../util/Logger'; +import { BrowserTypes } from '@finos/fdc3-schema'; +const { isFdc3UserInterfaceResolveAction } = BrowserTypes; +type Fdc3UserInterfaceResolve = BrowserTypes.Fdc3UserInterfaceResolve; + +/** + * Handles communication between an injected Intent Resolver UI and the getAgent implementation. + */ +export class DefaultDesktopAgentIntentResolver extends AbstractUIComponent implements IntentResolver { + private pendingResolve: ((x: IntentResolutionChoice | void) => void) | null = null; + + constructor(url: string | null) { + //TODO: check default UI URL is correct on release + super(url ?? DEFAULT_UI_ROOT_URL + 'intent_resolver.html', 'FDC3 Intent Resolver'); + } + + async setupMessagePort(port: MessagePort): Promise { + this.port = port; + + this.port.addEventListener('message', e => { + if (isFdc3UserInterfaceResolveAction(e.data)) { + Logger.debug('DefaultDesktopAgentIntentResolver: Received resolveAction message: ', e.data); + + const choice = e.data; + if (choice.payload.action == 'click' && this.pendingResolve) { + this.pendingResolve({ + appId: choice.payload.appIdentifier!, + intent: choice.payload.intent!, + }); + } else if (choice.payload.action == 'cancel' && this.pendingResolve) { + this.pendingResolve(); + } + + this.pendingResolve = null; + } + }); + + //This starts the port so do it last + await super.setupMessagePort(port); + } + + async chooseIntent(appIntents: AppIntent[], context: Context): Promise { + const out = new Promise(resolve => { + this.pendingResolve = resolve; + }); + const message: Fdc3UserInterfaceResolve = { + type: 'Fdc3UserInterfaceResolve', + payload: { + appIntents, + context, + }, + }; + this.port?.postMessage(message); + Logger.debug(`DefaultDesktopAgentIntentResolver: Requested resolution: `, message); + return out; + } +} diff --git a/packages/fdc3-get-agent/src/ui/NullChannelSelector.ts b/packages/fdc3-get-agent/src/ui/NullChannelSelector.ts new file mode 100644 index 000000000..bba0d1d5e --- /dev/null +++ b/packages/fdc3-get-agent/src/ui/NullChannelSelector.ts @@ -0,0 +1,10 @@ +import { Connectable } from '@finos/fdc3-standard'; +import { ChannelSelector } from '@finos/fdc3-standard'; + +/** Implementation used when an injected Channel selector is not in use. */ +export class NullChannelSelector implements ChannelSelector, Connectable { + async disconnect(): Promise { } + async connect(): Promise { } + async updateChannel(): Promise { } + setChannelChangeCallback(): void { } +} diff --git a/packages/fdc3-get-agent/src/ui/NullIntentResolver.ts b/packages/fdc3-get-agent/src/ui/NullIntentResolver.ts new file mode 100644 index 000000000..5bdec0a60 --- /dev/null +++ b/packages/fdc3-get-agent/src/ui/NullIntentResolver.ts @@ -0,0 +1,8 @@ +import { IntentResolver, IntentResolutionChoice } from '@finos/fdc3-standard'; + +/** Implementation used when an injected IntentResolver is not in use. */ +export class NullIntentResolver implements IntentResolver { + async disconnect(): Promise { } + async connect(): Promise { } + async chooseIntent(): Promise { } +} diff --git a/packages/fdc3-get-agent/src/util/Logger.ts b/packages/fdc3-get-agent/src/util/Logger.ts new file mode 100644 index 000000000..1b7158ec3 --- /dev/null +++ b/packages/fdc3-get-agent/src/util/Logger.ts @@ -0,0 +1,16 @@ +import { AbstractFDC3Logger } from '@finos/fdc3-agent-proxy'; +import { LogLevel } from '@finos/fdc3-standard'; + +/** + * Logging utility used by getAgent when connecting to Desktop Agents, + * which defaults to printing INFO, WARN and ERROR level messages. + */ +export class Logger extends AbstractFDC3Logger { + static override get prefix(): string { + return 'FDC3 getAgent: '; + } + + //set default log level - will not be picked up in test scope so ignored + /* istanbul ignore next */ + logLevel: LogLevel = LogLevel.INFO; +} diff --git a/packages/fdc3-get-agent/src/util/Uuid.ts b/packages/fdc3-get-agent/src/util/Uuid.ts new file mode 100644 index 000000000..34cb52e82 --- /dev/null +++ b/packages/fdc3-get-agent/src/util/Uuid.ts @@ -0,0 +1,5 @@ +import { v4 as uuidv4 } from 'uuid'; + +export function createUUID(): string { + return uuidv4(); +} diff --git a/packages/fdc3-get-agent/test/README.md b/packages/fdc3-get-agent/test/README.md new file mode 100644 index 000000000..048576376 --- /dev/null +++ b/packages/fdc3-get-agent/test/README.md @@ -0,0 +1,5 @@ +# FDC3 GetAgent Test Infrastructure + +The test infrastructure for fdc3-get-agent is complex as it has to mock a collection of windows, documents and iframes to simulate a Wed-based Desktop Agent. Additional tests in the /toolbox/fdc3-for-web/fdc3-web-impl package test against the reference implementation of web-based Desktop Agent, while the tests here work against a simulated one. + +To enable debug logs for the test infrastructure, set the `debugLogs` flag in packages\fdc3-get-agent\test\world\index.ts to true. diff --git a/packages/fdc3-get-agent/test/features/default-channel-selector.feature b/packages/fdc3-get-agent/test/features/default-channel-selector.feature new file mode 100644 index 000000000..992643481 --- /dev/null +++ b/packages/fdc3-get-agent/test/features/default-channel-selector.feature @@ -0,0 +1,18 @@ +Feature: Default Channel Selector + + Background: Desktop Agent API + Given a parent window document in "parentDoc", window in "parentWin", child window document in "childDoc" and window in "childWin" + And A Channel Selector in "channel-selector" with callback piping to "cb" + Given User Channels one, two and three in "channel-list" + + Scenario: Channel Selector Requests Channel Change + Given The channel selector sends a channel change message for channel "one" + And we wait for a period of "200" ms + Then "{cb}" is "one" + + Scenario: Updating channel information in the channel selector + Given I call "{channel-selector}" with "updateChannel" with parameters "one" and "{channel-list}" + And we wait for a period of "200" ms + Then "{lastChannelSelectorMessage}" is an object with the following contents + | type | payload.selected | payload.userChannels[0].id | payload.userChannels[1].id | payload.userChannels[2].id | + | Fdc3UserInterfaceChannels | one | one | two | three | diff --git a/packages/fdc3-get-agent/test/features/default-intent-resolver.feature b/packages/fdc3-get-agent/test/features/default-intent-resolver.feature new file mode 100644 index 000000000..f736a914b --- /dev/null +++ b/packages/fdc3-get-agent/test/features/default-intent-resolver.feature @@ -0,0 +1,27 @@ +Feature: Default Intent Resolver + + Background: Desktop Agent API + Given a parent window document in "parentDoc", window in "parentWin", child window document in "childDoc" and window in "childWin" + And An Intent Resolver in "intent-resolver" + And "instrumentContext" is a "fdc3.instrument" context + And "appIntents" is an AppIntents array with a ViewNews intent and two apps + + Scenario: App Requests Intent Resolution + Given I call "{intent-resolver}" with "chooseIntent" with parameters "{appIntents}" and "{instrumentContext}" for a promise + And I refer to "{result}" as "theIntentPromise" + And we wait for a period of "200" ms + Given The intent resolver sends an intent selection message + Then the promise "{theIntentPromise}" should resolve + And "{result}" is an object with the following contents + | intent | appId.appId | + | ViewNews | app1 | + And I call "{intent-resolver}" with "disconnect" + + Scenario: Intent Resolution Cancelled + Given I call "{intent-resolver}" with "chooseIntent" with parameters "{appIntents}" and "{instrumentContext}" for a promise + And I refer to "{result}" as "theIntentPromise" + And we wait for a period of "200" ms + Given The intent resolver cancels the intent selection message + Then the promise "{theIntentPromise}" should resolve + And "{result}" is undefined + And I call "{intent-resolver}" with "disconnect" diff --git a/packages/fdc3-get-agent/test/features/desktop-agent-disconnect.feature b/packages/fdc3-get-agent/test/features/desktop-agent-disconnect.feature new file mode 100644 index 000000000..09b377700 --- /dev/null +++ b/packages/fdc3-get-agent/test/features/desktop-agent-disconnect.feature @@ -0,0 +1,19 @@ +Feature: Death of the Desktop Agent + + Background: Desktop Agent API + # Given a browser document in "document" and window in "window" + Given a parent window document in "parentDoc", window in "parentWin", child window document in "childDoc" and window in "childWin" + #And Testing ends after "8000" ms + + Scenario: Loaded in the browser, but the user navigates away + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + And the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + When "{childWin}" pagehide occurs with persisted = "{false}" + And we wait for a period of "200" ms + Then The Desktop Agent receives a WCP6Goodbye message diff --git a/packages/fdc3-get-agent/test/features/desktop-agent-strategy.feature b/packages/fdc3-get-agent/test/features/desktop-agent-strategy.feature new file mode 100644 index 000000000..10df7f906 --- /dev/null +++ b/packages/fdc3-get-agent/test/features/desktop-agent-strategy.feature @@ -0,0 +1,414 @@ +Feature: Different Strategies for Accessing the Desktop Agent + + Background: Desktop Agent API + Given a parent window document in "parentDoc", window in "parentWin", child window document in "childDoc" and window in "childWin" + And SessionStorage is clear + + Scenario: Running inside a Browser and using post message with direct message ports and no identityUrl + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I refer to "{document.body.children[0]}" as "channel-selector" + And I refer to "{channel-selector.children[0]}" as "iframe" + And "{childWin.fdc3}" is undefined + And "{childWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP3Handshake | + And "{parentWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP1Hello | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Running inside a Browser and using post message, direct message ports, no identityUrl and default UI URLs + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response and uses default UI URLs + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I refer to "{document.body.children[0]}" as "channel-selector" + And I refer to "{channel-selector.children[0]}" as "iframe" + And "{childWin.fdc3}" is undefined + And "{childWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP3Handshake | + And "{parentWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP1Hello | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Connecting with a specified identityUrl + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | identityUrl | timeoutMs | intentResolver | channelSelector | + | true | https://dummyOrigin.test/alternativePath | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | appMetadata.instanceId | provider | + | 2.0 | cucumber-alternative-app | cucumber-alternative-instance | cucumber-provider | + And "{childWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP3Handshake | + And "{parentWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP1Hello | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Connecting with an unknown identityUrl fails + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | identityUrl | timeoutMs | intentResolver | channelSelector | + | true | "https://bad.identity.com/path" | 4000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "AccessDenied" + +Scenario: Connecting but identity validation times out + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response, but times out identity validation + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 2000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "ErrorOnConnect" + + Scenario: Running inside a Browser using the embedded iframe strategy + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns iframe response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | + | false | 8000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I refer to "{childDoc.iframes[0]}" as "embedded-iframe" + Then "{embedded-iframe}" is an object with the following contents + | tag | atts.name | style.width | style.height | + | iframe | FDC3 Communications | 0px | 0px | + And I refer to "{childDoc.iframes[1]}" as "intent-resolver-iframe" + And I refer to "{childDoc.iframes[2]}" as "channel-selector-iframe" + Then "{channel-selector-iframe}" is an object with the following contents + | tag | atts.name | atts.src | style.width | style.height | + | iframe | FDC3 Channel Selector | https://mock.fdc3.com/channelSelector | 100% | 100% | + Then "{intent-resolver-iframe}" is an object with the following contents + | tag | atts.name | atts.src | style.width | style.height | + | iframe | FDC3 Intent Resolver | https://mock.fdc3.com/resolver | 100% | 100% | + And "{childWin.fdc3}" is not null + And "{childWin.events}" is an array of objects with the following contents + | type | data.type | + | message | WCP2LoadUrl | + | message | WCP3Handshake | + | message | Fdc3UserInterfaceHello | + | message | Fdc3UserInterfaceHello | + | fdc3Ready | {null} | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Desktop Agent Preload (injected after the getAgent call with no event) + In this scenario, window.fdc3 is set by the electron container and returned by getAgent + + Given A Dummy Desktop Agent in "dummy-api" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + And we wait for a period of "500" ms + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + + Scenario: Desktop Agent Preload (arrived after getAgent call with fdc3Ready event) + In this scenario, window.fdc3 is set by the electron container and returned by getAgent + + Given A Dummy Desktop Agent in "dummy-api" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + And we wait for a period of "100" ms + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" and fdc3Ready is fired + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + + Scenario: Desktop Agent preload (present before getAgent call) + In this scenario, window.fdc3 is set by the electron container and returned by getAgent + + Given A Dummy Desktop Agent in "dummy-api" + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + + Scenario: Failover Strategy returning desktop agent + Given A Dummy Desktop Agent in "dummy-api" + And "dummyFailover" is a function which returns a promise of "{dummy-api}" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + + Scenario: Failover Strategy returning a proxy + Given "dummyFailover2" is a function which opens an iframe for communications on "{childDoc}" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover2} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Failover Strategy returning an invalid result + Given "invalidFailover" is a function which returns a promise of "some string" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {invalidFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "InvalidFailover" + + Scenario: Failover that is not a function + Given I call getAgent for a promise result with the following options + | failover | timeoutMs | + | "some string" | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "InvalidFailover" + + Scenario: Failover with identity validation timeout + Given "dummyFailover2" is a function which opens an iframe for communications on "{childDoc}" but times out identity validation + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover2} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve within 10 seconds + And "{result}" is an error with message "ErrorOnConnect" + + Scenario: Recover adaptor URL from SessionStorage + Here, we recover the details of the session from the session state, obviating the need to + make a request to the parent iframe. + + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns iframe response + And an existing app instance in "instanceID" + And SessionStorage contains instanceUuid "some-instance-uuid", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path", agentType "PROXY_URL" and agentUrl "http://localhost:8080/static/da/embed.html" + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + Then SessionStorage should contain instanceUuid "some-instance-uuid", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path", agentType "PROXY_URL" and agentUrl "http://localhost:8080/static/da/embed.html" + And I call "{desktopAgent}" with "disconnect" + +Scenario: Go straight to (preload) failover as directed by SessionStorage + Here, we recover the details of the session from the session state, obviating the need to + to do discovery and going straight to failover. + + Given A Dummy Desktop Agent in "dummy-api" + And "dummyFailover" is a function which returns a promise of "{dummy-api}" + And SessionStorage contains instanceUuid "uuid-0", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path", agentType "FAILOVER" and agentUrl "{undefined}" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + Then SessionStorage for identityUrl "https://dummyOrigin.test/path" should contain the following values + | appId | agentType | identityUrl | + | cucumber-app | FAILOVER | https://dummyOrigin.test/path | + + Scenario: Go straight to (proxy) failover as directed by SessionStorage + Here, we recover the details of the session from the session state, obviating the need to + to do discovery and going straight to failover. + + Given "dummyFailover2" is a function which opens an iframe for communications on "{childDoc}" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover2} | 1000 | + And SessionStorage contains instanceUuid "uuid-0", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path", agentType "FAILOVER" and agentUrl "{undefined}" + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I call "{result}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + Then SessionStorage for identityUrl "https://dummyOrigin.test/path" should contain the following values + | appId | agentType | identityUrl | + | cucumber-app | FAILOVER | https://dummyOrigin.test/path | + + + Scenario: Handle corrupted data in SessionStorage + Here we deal with data in SessionStorage that is not in the proper format. + + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And an existing app instance in "instanceID" + And SessionStorage contains corrupted data + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Handle truncated data in SessionStorage + Here we deal with data in SessionStorage that is only partially complete. + + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And an existing app instance in "instanceID" + And SessionStorage contains partial data with with identityUrl "https://dummyOrigin.test/path", appId "cucumber-app" and agentType "PROXY_PARENT" + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + And I call "{desktopAgent}" with "disconnect" + + Scenario: Latch to Desktop Agent Proxy parent via SessionStorage + Here, we recover the details of the session from session storage, and latch to the + same Desktop Agent type (preload) - the connection should succeed. + + Given A Dummy Desktop Agent in "dummy-api" + And Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And SessionStorage contains instanceUuid "{instanceID}", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path" and agentType "PROXY_PARENT" + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | cucumber-provider | + + Scenario: Latch to Desktop Agent Preload via SessionStorage + Here, we recover the details of the session from session storage, and latch to the + same Desktop Agent type (preload) - the connection should succeed. + + Given A Dummy Desktop Agent in "dummy-api" + And Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And SessionStorage contains instanceUuid "{instanceID}", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path" and agentType "PRELOAD" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + And we wait for a period of "500" ms + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + +Scenario: Latch to Desktop Agent Preload via SessionStorage which has gone away + Here, we recover the details of the session from session storage, and latch to the + same Desktop Agent type (preload) - the connection should fail. + Given SessionStorage contains instanceUuid "{instanceID}", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path" and agentType "PRELOAD" + And Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 3000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "AgentNotFound" + + Scenario: Ignore invalid agentType in SessionStorage + Here, we recover the details of the session from session storage, + but it has an invalid agentType field - the connection should still succeed. + Given A Dummy Desktop Agent in "dummy-api" + And SessionStorage contains instanceUuid "{instanceID}", appId "cucumber-app" with identityUrl "https://dummyOrigin.test/path" and agentType "SPOON" + And `window.fdc3` is injected into the runtime with the value in "{dummy-api}" + And I call fdc3Ready for a promise result + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call "{desktopAgent}" with "getInfo" + Then "{result}" is an object with the following contents + | fdc3Version | appMetadata.appId | provider | + | 2.0 | cucumber-app | preload-provider | + + Scenario: Nothing works and we timeout + When I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 4000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And "{result}" is an error with message "AgentNotFound" + + Scenario: Someone calls getAgent twice + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise1" + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise2" + Then the promise "{theAPIPromise1}" should resolve + And I refer to "{result}" as "desktopAgent1" + And the promise "{theAPIPromise2}" should resolve + And I refer to "{result}" as "desktopAgent2" + And "{desktopAgent1}" is "{desktopAgent2}" + And I call "{desktopAgent1}" with "disconnect" + diff --git a/packages/fdc3-get-agent/test/features/proxy-timeouts.feature b/packages/fdc3-get-agent/test/features/proxy-timeouts.feature new file mode 100644 index 000000000..df843b012 --- /dev/null +++ b/packages/fdc3-get-agent/test/features/proxy-timeouts.feature @@ -0,0 +1,57 @@ +Feature: Message exchange timeouts + + Background: Desktop Agent API + Given a parent window document in "parentDoc", window in "parentWin", child window document in "childDoc" and window in "childWin" + And SessionStorage is clear + + Scenario: Desktop Agent times out message exchanges when running inside a Browser with custom timeout + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response and times out message exchanges + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call broadcast with an fdc3.instrument context on "{desktopAgent}" and allow 3 seconds + Then "{result}" is an error with message "ApiTimeout" + And I call "{desktopAgent}" with "disconnect" + + Scenario: Desktop Agent times out app launch when running inside a Browser with custom timeout + Given Parent Window desktop "da" listens for postMessage events in "{parentWin}", returns direct message response, times out message exchanges and uses message exchange timeout "{1000}" ms and app launch timeout "{2000}" ms + And we wait for a period of "200" ms + And I call getAgent for a promise result with the following options + | dontSetWindowFdc3 | timeoutMs | intentResolver | channelSelector | + | true | 8000 | false | false | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call open with appId "someApp" on "{desktopAgent}" and allow 3 seconds + Then "{result}" is an error with message "ApiTimeout" + And I call "{desktopAgent}" with "disconnect" + + Scenario: Desktop Agent times out message exchanges when running in browser and connected via failover with custom timeout + Given "dummyFailover" is a function which opens an iframe for communications on "{childDoc}", times out message exchanges and uses message exchange timeout "{1000}" ms and app launch timeout "{2000}" ms + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call broadcast with an fdc3.instrument context on "{desktopAgent}" and allow 3 seconds + Then "{result}" is an error with message "ApiTimeout" + And I call "{desktopAgent}" with "disconnect" + + Scenario: Desktop Agent times out app launch when running in browser and connected via failover with custom timeout + Given "dummyFailover" is a function which opens an iframe for communications on "{childDoc}", times out message exchanges and uses message exchange timeout "{1000}" ms and app launch timeout "{2000}" ms + And I call getAgent for a promise result with the following options + | failover | timeoutMs | + | {dummyFailover} | 1000 | + And I refer to "{result}" as "theAPIPromise" + Then the promise "{theAPIPromise}" should resolve + And I refer to "{result}" as "desktopAgent" + And I call open with appId "someApp" on "{desktopAgent}" and allow 3 seconds + Then "{result}" is an error with message "ApiTimeout" + And I call "{desktopAgent}" with "disconnect" + + diff --git a/packages/fdc3-get-agent/test/features/utils.feature b/packages/fdc3-get-agent/test/features/utils.feature new file mode 100644 index 000000000..ccf40d867 --- /dev/null +++ b/packages/fdc3-get-agent/test/features/utils.feature @@ -0,0 +1,14 @@ +Feature: Utility functions + + Scenario: Logger utility + When All log functions are used with a message + When All log functions are used with an error + + Scenario: UUID generator + When A uuid is generated + +# Uncomment to debug the tests not exiting - will dump a list of open handles keeping node open +# Scenario: We dump any open handles +# Given I call "{parentDoc}" with "shutdown" +# Then I call "{childDoc}" with "shutdown" +# Then Testing ends after "8000" ms diff --git a/packages/fdc3-get-agent/test/step-definitions/channel-selector.steps.ts b/packages/fdc3-get-agent/test/step-definitions/channel-selector.steps.ts new file mode 100644 index 000000000..e419a78c5 --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/channel-selector.steps.ts @@ -0,0 +1,43 @@ +import { Given } from '@cucumber/cucumber'; +import { handleResolve } from '@finos/testing'; +import { DefaultDesktopAgentChannelSelector } from '../../src/ui/DefaultDesktopAgentChannelSelector'; +import { CHANNEL_SELECTOR_URL } from '../support/MockFDC3Server'; +import { USER_CHANNELS } from '../support/responses/UserChannels'; +import { CustomWorld } from '../world'; +import { Fdc3UserInterfaceChannelSelected } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Logger } from '../../src/util/Logger'; +import { loggingSettings } from './desktop-agent.steps'; + +Given( + 'A Channel Selector in {string} with callback piping to {string}', + async function (this: CustomWorld, field: string, cb: string) { + Logger.setLogLevel(loggingSettings.connection); + + const cs = new DefaultDesktopAgentChannelSelector(CHANNEL_SELECTOR_URL); + + cs.setChannelChangeCallback((channelId: string | null) => { + this.props[cb] = channelId; + }); + + this.props[field] = cs; + await cs.connect(); + } +); + +Given('User Channels one, two and three in {string}', function (this: CustomWorld, field: string) { + this.props[field] = USER_CHANNELS; +}); + +Given( + 'The channel selector sends a channel change message for channel {string}', + async function (this: CustomWorld, channel: string) { + const port = handleResolve('{childDoc.iframes[0].messageChannels[0].port2}', this); + const msg: Fdc3UserInterfaceChannelSelected = { + type: 'Fdc3UserInterfaceChannelSelected', + payload: { + selected: channel, + }, + }; + port.postMessage(msg); + } +); diff --git a/packages/fdc3-get-agent/test/step-definitions/desktop-agent-api.steps.ts b/packages/fdc3-get-agent/test/step-definitions/desktop-agent-api.steps.ts new file mode 100644 index 000000000..e44bec465 --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/desktop-agent-api.steps.ts @@ -0,0 +1,47 @@ +import { When } from '@cucumber/cucumber'; +import { handleResolve } from '@finos/testing'; +import { CustomWorld } from '../world'; +import { DesktopAgent } from '@finos/fdc3-standard'; +import { Instrument } from '@finos/fdc3-context'; + +When( + 'I call broadcast with an fdc3.instrument context on {string} and allow 3 seconds', + { timeout: 3 * 1000 }, + // for testing API timeouts the Mock server sets a 1 second timeout + // if that is ignored it defaults to 10 seconds so test should timeout and catch that + async function (this: CustomWorld, field: string) { + //Note that broadcast is a noop unless you are currently joined to a channel + try { + const da: DesktopAgent = handleResolve(field, this); + const instrument: Instrument = { + type: 'fdc3.instrument', + id: { ticker: 'MSFT' }, + name: 'microsoft', + }; + const result = await da.broadcast(instrument); + this.props['result'] = result; + this.log('Received non-error result: ' + JSON.stringify(result)); + } catch (error) { + this.props['result'] = error; + this.log('Received error with message: ' + ((error as Error).message ?? error)); + } + } +); + +When( + 'I call open with appId {string} on {string} and allow 3 seconds', + { timeout: 3 * 1000 }, + // for testing app launch timeouts the Mock server sets a 2 second timeout + // if that is ignored it defaults to 100 seconds so test should timeout and catch that + async function (this: CustomWorld, appId: string, field: string) { + try { + const da: DesktopAgent = handleResolve(field, this); + const result = await da.open({ appId: appId }); + this.props['result'] = result; + this.log('Received non-error result: ' + JSON.stringify(result)); + } catch (error) { + this.props['result'] = error; + this.log('Received error with message: ' + ((error as Error).message ?? error)); + } + } +); diff --git a/packages/fdc3-get-agent/test/step-definitions/desktop-agent.steps.ts b/packages/fdc3-get-agent/test/step-definitions/desktop-agent.steps.ts new file mode 100644 index 000000000..eeea07ffb --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/desktop-agent.steps.ts @@ -0,0 +1,472 @@ +import { After, DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { doesRowMatch, handleResolve, setupGenericSteps } from '@finos/testing'; +import { MockDocument } from '../support/MockDocument'; +import { MockWindow } from '../support/MockWindow'; +import { fdc3Ready, getAgent } from '../../src'; +import { + DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX, + DesktopAgentDetails, + GetAgentLogLevels, + GetAgentParams, + LogLevel, +} from '@finos/fdc3-standard'; +import { EMBED_URL, MockFDC3Server } from '../support/MockFDC3Server'; +import { MockStorage } from '../support/MockStorage'; +import { DesktopAgent, ImplementationMetadata } from '@finos/fdc3-standard'; +import { clearAgentPromise } from '../../src/strategies/getAgent'; +import expect from 'expect'; +import { dummyInstanceDetails } from '../support/TestServerContext'; +import { MockIFrame } from '../support/MockIFrame'; + +interface MockPageTransitionEvent extends Event { + persisted?: boolean; +} + +setupGenericSteps(); + +//Change logging settings here when debugging test failures +export const loggingSettings: GetAgentLogLevels = { + connection: LogLevel.INFO, + proxy: LogLevel.INFO, +}; + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns direct message response', + async function (this: CustomWorld, field: string, w: string) { + const mockWindow = handleResolve(w, this); + this.mockFDC3Server = new MockFDC3Server(mockWindow, false, this.mockContext); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns direct message response, but times out identity validation', + async function (this: CustomWorld, field: string, w: string) { + const mockWindow = handleResolve(w, this); + this.mockFDC3Server = new MockFDC3Server(mockWindow, false, this.mockContext, true, true); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns direct message response and uses default UI URLs', + async function (this: CustomWorld, field: string, w: string) { + const mockWindow = handleResolve(w, this); + this.mockFDC3Server = new MockFDC3Server(mockWindow, false, this.mockContext, true); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns direct message response and times out message exchanges', + async function (this: CustomWorld, field: string, w: string) { + const mockWindow = handleResolve(w, this); + this.mockFDC3Server = new MockFDC3Server(mockWindow, false, this.mockContext, true, false, true); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns direct message response, times out message exchanges and uses message exchange timeout {string} ms and app launch timeout {string} ms', + async function (this: CustomWorld, field: string, w: string, t1: string, t2: string) { + const mockWindow = handleResolve(w, this); + const messageExchangeTimeout: number = handleResolve(t1, this); + const appLaunchTimeout: number = handleResolve(t2, this); + this.mockFDC3Server = new MockFDC3Server( + mockWindow, + false, + this.mockContext, + true, + false, + true, + messageExchangeTimeout, + appLaunchTimeout + ); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + 'Parent Window desktop {string} listens for postMessage events in {string}, returns iframe response', + async function (this: CustomWorld, field: string, w: string) { + const mockWindow = handleResolve(w, this); + this.mockFDC3Server = new MockFDC3Server(mockWindow, true, this.mockContext); + this.props[field] = this.mockFDC3Server; + this.mockContext.open(dummyInstanceDetails[0].appId); + this.mockContext.open(dummyInstanceDetails[1].appId); + } +); + +Given( + '{string} is a function which opens an iframe for communications on {string}', + function (this: CustomWorld, fn: string, doc: string) { + this.props[fn] = () => { + this.mockContext.open(dummyInstanceDetails[0].appId); + const document = handleResolve(doc, this) as MockDocument; + const ifrm = document.createElement('iframe'); + + this.mockFDC3Server = new MockFDC3Server(ifrm as unknown as MockIFrame, false, this.mockContext); + ifrm.setAttribute('src', EMBED_URL); + document.body.appendChild(ifrm); + return ifrm; + }; + } +); + +Given( + '{string} is a function which opens an iframe for communications on {string} but times out identity validation', + function (this: CustomWorld, fn: string, doc: string) { + this.props[fn] = () => { + this.mockContext.open(dummyInstanceDetails[0].appId); + const document = handleResolve(doc, this) as MockDocument; + const ifrm = document.createElement('iframe'); + + this.mockFDC3Server = new MockFDC3Server(ifrm as unknown as MockIFrame, false, this.mockContext, true, true); + ifrm.setAttribute('src', EMBED_URL); + document.body.appendChild(ifrm); + return ifrm; + }; + } +); + +Given( + '{string} is a function which opens an iframe for communications on {string} and times out message exchanges', + function (this: CustomWorld, fn: string, doc: string) { + this.props[fn] = () => { + this.mockContext.open(dummyInstanceDetails[0].appId); + const document = handleResolve(doc, this) as MockDocument; + const ifrm = document.createElement('iframe'); + + this.mockFDC3Server = new MockFDC3Server( + ifrm as unknown as MockIFrame, + false, + this.mockContext, + false, + false, + true + ); + ifrm.setAttribute('src', EMBED_URL); + document.body.appendChild(ifrm); + return ifrm; + }; + } +); + +Given( + '{string} is a function which opens an iframe for communications on {string}, times out message exchanges and uses message exchange timeout {string} ms and app launch timeout {string} ms', + function (this: CustomWorld, fn: string, doc: string, t1: string, t2: string) { + const messageExchangeTimeout: number = handleResolve(t1, this); + const appLaunchTimeout: number = handleResolve(t2, this); + this.props[fn] = () => { + this.mockContext.open(dummyInstanceDetails[0].appId); + const document = handleResolve(doc, this) as MockDocument; + const ifrm = document.createElement('iframe'); + + this.mockFDC3Server = new MockFDC3Server( + ifrm as unknown as MockIFrame, + false, + this.mockContext, + false, + false, + true, + messageExchangeTimeout, + appLaunchTimeout + ); + ifrm.setAttribute('src', EMBED_URL); + document.body.appendChild(ifrm); + return ifrm; + }; + } +); + +Given('an existing app instance in {string}', async function (this: CustomWorld, field: string) { + const uuid = this.mockContext.open(dummyInstanceDetails[0].appId); + this.props[field] = uuid; +}); + +Given('A Dummy Desktop Agent in {string}', async function (this: CustomWorld, field: string) { + const notImplemented = () => { + throw new Error('Function not implemented.'); + }; + const da: DesktopAgent = { + async getInfo(): Promise { + return { + fdc3Version: '2.0', + optionalFeatures: { + DesktopAgentBridging: false, + OriginatingAppMetadata: false, + UserChannelMembershipAPIs: false, + }, + appMetadata: { + appId: 'cucumber-app', + instanceId: 'uuid-0', + }, + provider: 'preload-provider', + }; + }, + open: notImplemented, + findIntent: notImplemented, + findIntentsByContext: notImplemented, + findInstances: notImplemented, + broadcast: notImplemented, + raiseIntent: notImplemented, + raiseIntentForContext: notImplemented, + addIntentListener: notImplemented, + addContextListener: notImplemented, + addEventListener: notImplemented, + getUserChannels: notImplemented, + joinUserChannel: notImplemented, + getOrCreateChannel: notImplemented, + createPrivateChannel: notImplemented, + getCurrentChannel: notImplemented, + leaveCurrentChannel: notImplemented, + getAppMetadata: notImplemented, + getSystemChannels: notImplemented, + joinChannel: notImplemented, + }; + + this.props[field] = da; + this.props['result'] = null; +}); + +Given( + '`window.fdc3` is injected into the runtime with the value in {string}', + async function (this: CustomWorld, field: string) { + const object = handleResolve(field, this); + window.fdc3 = object; + } +); + +Given( + '`window.fdc3` is injected into the runtime with the value in {string} and fdc3Ready is fired', + async function (this: CustomWorld, field: string) { + const object = handleResolve(field, this); + window.fdc3 = object; + window.dispatchEvent(new Event('fdc3Ready')); + } +); + +When('I call getAgent for a promise result', function (this: CustomWorld) { + try { + const params: GetAgentParams = { + logLevels: loggingSettings, + }; + this.props['result'] = getAgent(params); + } catch (error) { + this.props['result'] = error; + } +}); + +When('I call fdc3Ready for a promise result', function (this: CustomWorld) { + try { + this.props['result'] = fdc3Ready(); + } catch (error) { + this.props['result'] = error; + } +}); + +After(function (this: CustomWorld) { + console.log(' Cleaning up test infrastructure'); + clearAgentPromise(); + MockDocument.shutdownAllDocuments(); +}); + +When('I call getAgent for a promise result with the following options', function (this: CustomWorld, dt: DataTable) { + try { + const first = dt.hashes()[0]; + const toArgs: GetAgentParams = Object.fromEntries( + Object.entries(first).map(([k, v]) => { + const val = handleResolve(v, this); + const val2 = isNaN(val) ? val : Number(val); + const val3 = val2 === 'true' ? true : val2 === 'false' ? false : val2; + return [k, val3]; + }) + ); + //add logging settings to help with debug + toArgs.logLevels = loggingSettings; + this.props['result'] = getAgent(toArgs); + } catch (error) { + this.props['result'] = error; + } +}); + +Given( + 'a parent window document in {string}, window in {string}, child window document in {string} and window in {string}', + async function (this: CustomWorld, pd: string, pw: string, cd: string, cw: string) { + //create the parent window + const mpw = new MockWindow('mockParentWindow', this, 'parentWin'); + this.props[pw] = mpw; + + // mock parent window document + this.props[pd] = new MockDocument('parentDoc', mpw); + + // creates the mock app window + const mcw = new MockWindow('mockWindow', this, 'mocky'); + this.props[cw] = mcw; + + // mock app document + this.props[cd] = new MockDocument('childDoc', mcw); + + //run tests from the perspective of the child window + globalThis.window = this.props[cw]; + globalThis.document = this.props[cd]; + + // create parent relationship + mcw.parent = mpw; + + //create child relationship (for attributing postMessage calls) + mpw.child = mcw; + + // session storage (will be common between windows, which is ok as DA doesn't use this) + globalThis.sessionStorage = new MockStorage(); + } +); + +Given( + 'SessionStorage contains instanceUuid {string}, appId {string} with identityUrl {string} and agentType {string}', + async function (this: CustomWorld, uuid: string, appId: string, identityUrl: string, agentType: string) { + const theUuid = handleResolve(uuid, this); + const theAppId = handleResolve(appId, this); + const theIdentityUrl = handleResolve(identityUrl, this); + const theAgentType = handleResolve(agentType, this); + const details: Record = {}; + details[theIdentityUrl] = { + agentType: theAgentType, + instanceUuid: theUuid, + appId: theAppId, + instanceId: 'uuid-0', + identityUrl: theIdentityUrl, + actualUrl: theIdentityUrl, + }; + + globalThis.sessionStorage.setItem(DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky', JSON.stringify(details)); + } +); + +Given( + 'SessionStorage contains instanceUuid {string}, appId {string} with identityUrl {string}, agentType {string} and agentUrl {string}', + async function ( + this: CustomWorld, + uuid: string, + appId: string, + identityUrl: string, + agentType: string, + agentUrl: string + ) { + const theUuid = handleResolve(uuid, this); + const theAppId = handleResolve(appId, this); + const theIdentityUrl = handleResolve(identityUrl, this); + const theAgentType = handleResolve(agentType, this); + const theAgentUrl = handleResolve(agentUrl, this); + const details: Record = {}; + details[theIdentityUrl] = { + agentType: theAgentType, + instanceUuid: theUuid, + appId: theAppId, + instanceId: 'uuid-0', + identityUrl: theIdentityUrl, + actualUrl: theIdentityUrl, + agentUrl: theAgentUrl, + }; + + globalThis.sessionStorage.setItem(DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky', JSON.stringify(details)); + } +); + +Given( + 'SessionStorage contains partial data with with identityUrl {string}, appId {string} and agentType {string}', + async function (this: CustomWorld, identityUrl: string, agentType: string, appId: string) { + const theIdentityUrl = handleResolve(identityUrl, this); + const theAgentType = handleResolve(agentType, this); + const theAppId = handleResolve(appId, this); + + const partialDetails: Record> = {}; + partialDetails[theIdentityUrl] = { + agentType: theAgentType, + appId: theAppId, + identityUrl: identityUrl, + }; + + globalThis.sessionStorage.setItem( + DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky', + JSON.stringify(partialDetails) + ); + } +); + +Given('SessionStorage contains corrupted data', async function (this: CustomWorld) { + const corruptedData = ['All your base are belong to us']; + + globalThis.sessionStorage.setItem(DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky', JSON.stringify(corruptedData)); +}); + +Given('SessionStorage is clear', async function () { + globalThis.sessionStorage.clear(); +}); + +Then( + 'SessionStorage should contain instanceUuid {string}, appId {string} with identityUrl {string}, agentType {string} and agentUrl {string}', + async function ( + this: CustomWorld, + uuid: string, + appId: string, + identityUrl: string, + agentType: string, + agentUrl: string + ) { + const theUuid = handleResolve(uuid, this); + const theAppId = handleResolve(appId, this); + const theIdentityUrl = handleResolve(identityUrl, this); + const theAgentType = handleResolve(agentType, this); + const theAgentUrl = handleResolve(agentUrl, this); + + const value = globalThis.sessionStorage.getItem(DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky'); + expect(value).toBeTruthy(); + const theObject = JSON.parse(value!); + const details = theObject[theIdentityUrl]; + expect(details).toBeTruthy(); + expect(details.agentType).toEqual(theAgentType); + expect(details.agentUrl).toEqual(theAgentUrl); + expect(details.appId).toEqual(theAppId); + expect(details.instanceUuid).toEqual(theUuid); + } +); + +Then( + 'SessionStorage for identityUrl {string} should contain the following values', + function (this: CustomWorld, identityUrl: string, dt: DataTable) { + const theIdentityUrl = handleResolve(identityUrl, this); + const value = globalThis.sessionStorage.getItem(DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX + '-mocky'); + expect(value).toBeTruthy(); + const theObject = JSON.parse(value!); + const details = theObject[theIdentityUrl]; + const table = dt.hashes(); + expect(doesRowMatch(this, table[0], details)).toBeTruthy(); + } +); + +When( + '{string} pagehide occurs with persisted = {string}', + async function (this: CustomWorld, field: string, persisted: string) { + const window: MockWindow = handleResolve(field, this); + const isPersisted = handleResolve(persisted, this); + const transitionEvent: MockPageTransitionEvent = new Event('pagehide'); + transitionEvent.persisted = isPersisted; + window.dispatchEvent(transitionEvent); + } +); + +When('The Desktop Agent receives a WCP6Goodbye message', async function (this: CustomWorld) { + expect(this.mockFDC3Server?.hasReceivedGoodbye).toBeTruthy(); +}); diff --git a/packages/fdc3-get-agent/test/step-definitions/intent-resolver.steps.ts b/packages/fdc3-get-agent/test/step-definitions/intent-resolver.steps.ts new file mode 100644 index 000000000..c84f5c095 --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/intent-resolver.steps.ts @@ -0,0 +1,133 @@ +import { Given, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { handleResolve } from '@finos/testing'; +import { DefaultDesktopAgentIntentResolver } from '../../src/ui/DefaultDesktopAgentIntentResolver'; +import { INTENT_RESOLVER_URL } from '../support/MockFDC3Server'; +import { FDC3_USER_INTERFACE_RESOLVE_ACTION_TYPE } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { Context } from '@finos/fdc3-context'; +import { loggingSettings } from './desktop-agent.steps'; +import { Logger } from '@finos/fdc3-agent-proxy/src/util/Logger'; + +Logger.setLogLevel(loggingSettings.connection); + +const contextMap: Record = { + 'fdc3.instrument': { + type: 'fdc3.instrument', + name: 'Apple', + id: { + ticker: 'AAPL', + }, + }, + 'fdc3.country': { + type: 'fdc3.country', + name: 'Sweden', + id: { + COUNTRY_ISOALPHA2: 'SE', + COUNTRY_ISOALPHA3: 'SWE', + }, + }, + 'fdc3.unsupported': { + type: 'fdc3.unsupported', + bogus: true, + }, +}; + +Given('{string} is a {string} context', function (this: CustomWorld, field: string, type: string) { + this.props[field] = contextMap[type]; +}); + +Given('An Intent Resolver in {string}', async function (this: CustomWorld, field: string) { + const cs = new DefaultDesktopAgentIntentResolver(INTENT_RESOLVER_URL); + this.props[field] = cs; + await cs.connect(); +}); + +Given( + '{string} is an AppIntents array with a ViewNews intent and two apps', + function (this: CustomWorld, field: string) { + this.props[field] = [ + { + intent: { + name: 'ViewNews', + }, + apps: [ + { + appId: 'app1', + }, + { + appId: 'app2', + }, + ], + }, + ]; + } +); + +When( + 'I call {string} with {string} with parameters {string} and {string} for a promise', + function (this: CustomWorld, field: string, fnName: string, param1: string, param2: string) { + try { + const object = handleResolve(field, this); + const fn = object[fnName]; + const arg0 = handleResolve(param1, this); + const arg1 = handleResolve(param2, this); + const result = fn.call(object, arg0, arg1); + this.props['result'] = result; + } catch (error) { + this.props['result'] = error; + } + } +); + +Given('The intent resolver sends an intent selection message', async function (this: CustomWorld) { + const port = handleResolve('{childDoc.iframes[0].messageChannels[0].port2}', this); + + port.postMessage({ + type: FDC3_USER_INTERFACE_RESOLVE_ACTION_TYPE, + payload: { + action: 'click', + appIdentifier: { + appId: 'app1', + }, + intent: 'ViewNews', + }, + }); +}); + +Given('The intent resolver cancels the intent selection message', async function (this: CustomWorld) { + const port = handleResolve('{childDoc.iframes[0].messageChannels[0].port2}', this); + + port.postMessage({ + type: FDC3_USER_INTERFACE_RESOLVE_ACTION_TYPE, + payload: { + action: 'cancel', + }, + }); +}); + +// Given('{string} receives a {string} message for the intent resolver and pipes comms to {string}', async function (this: CustomWorld, frame: string, type: string, output: string) { +// const channelSelectorIframe = handleResolve(frame, this) +// const mc = new MessageChannel(); +// const internalPort = mc.port1; +// const externalPort = mc.port2; + +// if (type == "SelectorMessageInitialize") { +// globalThis.window.dispatchEvent({ +// type: 'message', +// data: { +// type: 'SelectorMessageInitialize' +// }, +// origin: globalThis.window.location.origin, +// ports: [externalPort], +// source: channelSelectorIframe +// } as any) +// } + +// const out: any[] = [] +// this.props[output] = out + +// internalPort.start() +// internalPort.onmessage = (e) => { +// out.push({ type: e.type, data: e.data }) +// } +// }); diff --git a/packages/fdc3-get-agent/test/step-definitions/port-creation.steps.ts b/packages/fdc3-get-agent/test/step-definitions/port-creation.steps.ts new file mode 100644 index 000000000..f58c723d7 --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/port-creation.steps.ts @@ -0,0 +1,68 @@ +import { Given, Then } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { handleResolve } from '@finos/testing'; +// used to debug tests not ending - only available as a commonJs module +// eslint-disable-next-line @typescript-eslint/no-require-imports +const wtf = require('wtfnode'); + +Given( + '{string} receives a {string} message for the {string} and creates port {string}', + async function (this: CustomWorld, frame: string, type: string, _item: string, port: string) { + const channelSelectorIframe = handleResolve(frame, this); + const mc = new MessageChannel(); + const internalPort = mc.port1; + const externalPort = mc.port2; + + if (type == 'SelectorMessageInitialize') { + globalThis.window.dispatchEvent({ + type: 'message', + data: { + type: 'SelectorMessageInitialize', + }, + origin: globalThis.window.location.origin, + ports: [externalPort], + source: channelSelectorIframe, + } as unknown as Event); + } + + internalPort.start(); + this.props[port] = internalPort; + } +); + +Given('{string} pipes messages to {string}', async function (this: CustomWorld, port: string, output: string) { + const out: { type: string; data: unknown }[] = []; + this.props[output] = out; + + const internalPort = handleResolve(port, this); + internalPort.onmessage = (e: MessageEvent) => { + out.push({ type: e.type, data: e.data }); + }; +}); + +/** + * Avoid checking this in as a line in .features - just used for debugging + */ +Given('Testing ends after {string} ms', function (string) { + setTimeout(() => { + wtf.dump(); + + process.exit(); + }, parseInt(string)); +}); + +Then('{string} receives a {string} message', function (this: CustomWorld, port: string, type: string) { + const internalPort = handleResolve(port, this); + + if (type == 'ResolverMessageChoice') { + (internalPort as MessagePort).postMessage({ + type, + payload: { + intent: 'viewNews', + target: { + appId: 'test-app-1', + }, + }, + }); + } +}); diff --git a/packages/fdc3-get-agent/test/step-definitions/util.steps.ts b/packages/fdc3-get-agent/test/step-definitions/util.steps.ts new file mode 100644 index 000000000..b330186af --- /dev/null +++ b/packages/fdc3-get-agent/test/step-definitions/util.steps.ts @@ -0,0 +1,24 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { Logger } from '../../src/util/Logger'; +import { createUUID } from '../../src/util/Uuid'; + +const TEST_ERROR = 'Test error - This is expected on the console'; + +When('All log functions are used with a message', async function (this: CustomWorld) { + Logger.debug('Debug msg'); + Logger.log('Log msg'); + Logger.warn('Warning msg'); + Logger.error('Error msg'); +}); + +When('All log functions are used with an error', async function (this: CustomWorld) { + Logger.debug('debug-level error: ', new Error(TEST_ERROR)); + Logger.log('log-level error: ', new Error(TEST_ERROR)); + Logger.warn('warn-level error: ', new Error(TEST_ERROR)); + Logger.error('error-level error: ', new Error(TEST_ERROR)); +}); + +When('A uuid is generated', async function (this: CustomWorld) { + return createUUID(); +}); diff --git a/packages/fdc3-get-agent/test/support/EventHandler.ts b/packages/fdc3-get-agent/test/support/EventHandler.ts new file mode 100644 index 000000000..adbfdd7f2 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/EventHandler.ts @@ -0,0 +1,4 @@ +export type EventHandler = { + type: string; + callback: (e: Event) => void; +}; diff --git a/packages/fdc3-get-agent/test/support/FrameTypes.ts b/packages/fdc3-get-agent/test/support/FrameTypes.ts new file mode 100644 index 000000000..6adcc1e47 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/FrameTypes.ts @@ -0,0 +1,153 @@ +import { CustomWorld } from '../world'; +import { MockWindow } from './MockWindow'; +import { CHANNEL_SELECTOR_URL, INTENT_RESOLVER_URL } from './MockFDC3Server'; +import { isWebConnectionProtocol1Hello } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { + Fdc3UserInterfaceHello, + Fdc3UserInterfaceRestyle, + isFdc3UserInterfaceHandshake, + WebConnectionProtocol3Handshake, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +/** + * This handles the frame communications when we're using the embedded iframe approach + */ +export function handleEmbeddedIframeComms(_value: string, parent: MockWindow, source: MockWindow, cw: CustomWorld) { + const helloHandler = (e: Event) => { + const event = e as MessageEvent; + const eventSource = event.source as unknown as MockWindow; + const data = event.data; + + if (isWebConnectionProtocol1Hello(data)) { + console.debug( + 'Received hello message from: ', + eventSource.name, + eventSource == parent ? '(parent window): ' : '(NOT parent win): ', + event.data + ); + const connection = cw.mockContext.getFirstInstance(); + + // send the other end of the channel to the app + const message: WebConnectionProtocol3Handshake = { + type: 'WCP3Handshake', + meta: { + connectionAttemptUuid: data.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + fdc3Version: '2.2', + channelSelectorUrl: CHANNEL_SELECTOR_URL, + intentResolverUrl: INTENT_RESOLVER_URL, + }, + }; + eventSource.postMessage(message, '*', [connection!.externalPort]); + + window.removeEventListener('message', helloHandler); + } else { + console.warn(`Unexpected message received by MockIframe - ignored`, e); + } + }; + + //listen for hello message events from parent to respond to + source.addEventListener('message', helloHandler); +} + +export function handleChannelSelectorComms( + _value: string, + parent: MockWindow, + source: MockWindow, + cw: CustomWorld +): MessageChannel { + const connection = new MessageChannel(); + try { + const msg: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + implementationDetails: 'mock channel selector', + initialCSS: { + width: '100px', + }, + }, + }; + + const event: Event = { + type: 'message', + data: msg, + origin: CHANNEL_SELECTOR_URL, + source: source, + ports: [connection.port1], + } as unknown as Event; + parent.dispatchEvent(event); + + connection.port2.onmessage = e => { + if (isFdc3UserInterfaceHandshake(e.data)) { + setTimeout(() => { + const msg: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: '100px', + }, + }, + }; + connection.port2.postMessage(msg); + }, 100); + } + cw.props['lastChannelSelectorMessage'] = e.data; + }; + } catch (e) { + console.error(e); + } + + return connection; +} + +export function handleIntentResolverComms( + _value: string, + parent: MockWindow, + source: MockWindow, + cw: CustomWorld +): MessageChannel { + const connection = new MessageChannel(); + try { + const msg: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + implementationDetails: 'mock intent resolver', + initialCSS: { + width: '100px', + }, + }, + }; + const event: Event = { + type: 'message', + data: msg, + origin: INTENT_RESOLVER_URL, + source, + ports: [connection.port1], + } as unknown as Event; + parent.dispatchEvent(event); + + connection.port2.onmessage = e => { + if (isFdc3UserInterfaceHandshake(e.data)) { + setTimeout(() => { + const msg: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: '100px', + }, + }, + }; + connection.port2.postMessage(msg); + }, 100); + } + + cw.props['lastIntentResolverMessage'] = e; + }; + } catch (e) { + console.error(e); + } + + return connection; +} diff --git a/packages/fdc3-get-agent/test/support/MockCSSStyleDeclaration.ts b/packages/fdc3-get-agent/test/support/MockCSSStyleDeclaration.ts new file mode 100644 index 000000000..1b82eef10 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockCSSStyleDeclaration.ts @@ -0,0 +1,9 @@ +export class MockCSSStyleDeclaration { + setProperty(name: string, value: string) { + (this as any)[name] = value; + } + + removeProperty(name: string) { + delete (this as any)[name]; + } +} diff --git a/packages/fdc3-get-agent/test/support/MockDocument.ts b/packages/fdc3-get-agent/test/support/MockDocument.ts new file mode 100644 index 000000000..57ef1e42e --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockDocument.ts @@ -0,0 +1,53 @@ +import { MockWindow } from './MockWindow'; +import { MockIFrame } from './MockIFrame'; +import { MockElement } from './MockElement'; + +export class MockDocument { + name: string; + window: MockWindow; + iframes: MockIFrame[] = []; + static allDocuments: MockDocument[] = []; + + constructor(name: string, window: MockWindow) { + this.name = name; + this.window = window; + if (this.window.cw.debugLogs) { + console.log(`MockDocument (name: ${name} / window.name: ${this.window.name}): Created`); + } + MockDocument.allDocuments.push(this); + } + + createElement(tag: string): HTMLElement { + if (tag == 'iframe') { + if (this.window.cw.debugLogs) { + console.log(`MockDocument (name: ${this.name} / window.name: ${this.window.name}): creating iframe`); + } + const mw = new MockIFrame('iframe', this.window.cw, this.window, 'pending-iframe'); + //n.b. variables are set on the parent window to link each iframe in order to allow use as source in + // postMessages from them - these are set in the MockIframe.setAttribute function + + this.iframes.push(mw); + + return mw as unknown as HTMLElement; + } else { + return new MockElement(tag) as unknown as HTMLElement; + } + } + + getElementById(/*_id: string*/): HTMLElement | null { + return new MockElement('div') as unknown as HTMLElement; + } + + body = new MockElement('body'); + + shutdown() { + this.window.shutdown(); + this.iframes.forEach(i => i.shutdown()); + } + + static shutdownAllDocuments() { + MockDocument.allDocuments.forEach((doc: MockDocument) => { + doc.shutdown(); + }); + } +} diff --git a/packages/fdc3-get-agent/test/support/MockElement.ts b/packages/fdc3-get-agent/test/support/MockElement.ts new file mode 100644 index 000000000..586526a77 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockElement.ts @@ -0,0 +1,37 @@ +import { MockCSSStyleDeclaration } from './MockCSSStyleDeclaration'; +import { MockIFrame } from './MockIFrame'; + +export class MockElement { + public tag: string; + public atts: { [name: string]: unknown } = {}; + public children: HTMLElement[] = []; + + constructor(tag: string) { + this.tag = tag; + } + + style = new MockCSSStyleDeclaration(); + + setAttribute(name: string, value: string) { + this.atts[name] = value; + } + + removeAttribute(name: string) { + delete this.atts[name]; + } + + appendChild(child: HTMLElement) { + this.children.push(child); + + //if its an iframe make it load here + if ((child as unknown as MockIFrame).load) { + (child as unknown as MockIFrame).load(); + } + } + + removeChild(child: HTMLElement) { + this.children.splice(this.children.indexOf(child), 1); + } + + remove() {} +} diff --git a/packages/fdc3-get-agent/test/support/MockFDC3Server.ts b/packages/fdc3-get-agent/test/support/MockFDC3Server.ts new file mode 100644 index 000000000..0f457aabe --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockFDC3Server.ts @@ -0,0 +1,154 @@ +import { FDC3Server, InstanceID, State } from '@finos/fdc3-web-impl'; +import { TestServerContext } from './TestServerContext'; +import { MockWindow } from './MockWindow'; +import { AutomaticResponse } from './responses/AutomaticResponses'; +import { Broadcast } from './responses/Broadcast'; +import { FindIntent } from './responses/FindIntent'; +import { RaiseIntent } from './responses/RaiseIntent'; +import { Handshake } from './responses/Handshake'; +import { UserChannels } from './responses/UserChannels'; +import { CurrentChannel } from './responses/CurrentChannel'; +import { GetInfo } from './responses/GetInfo'; +import { + AppRequestMessage, + WebConnectionProtocol2LoadURL, + WebConnectionProtocol3Handshake, +} from '@finos/fdc3-schema/generated/api/BrowserTypes'; + +export const EMBED_URL = 'http://localhost:8080/static/da/embed.html'; +export const CHANNEL_SELECTOR_URL = 'https://mock.fdc3.com/channelSelector'; +export const INTENT_RESOLVER_URL = 'https://mock.fdc3.com/resolver'; + +export class MockFDC3Server implements FDC3Server { + private useIframe: boolean; + private useDefaultUIUrls: boolean; + private timeOutIdValidation: boolean; + private window: MockWindow; + private tsc: TestServerContext; + private receivedGoodbye = false; + private messageExchangeTimeout: number | null = null; + private appLaunchTimeout: number | null = null; + + readonly automaticResponses: AutomaticResponse[]; + + constructor( + window: MockWindow, + useIframe: boolean, + ctx: TestServerContext, + useDefaultUIUrls: boolean = false, + timeOutIdValidation: boolean = false, + timeoutMessageExchanges: boolean = false, + messageExchangeTimeout?: number, + appLaunchTimeout?: number + ) { + this.useIframe = useIframe; + this.useDefaultUIUrls = useDefaultUIUrls; + this.timeOutIdValidation = timeOutIdValidation; + this.window = window; + this.tsc = ctx; + if (messageExchangeTimeout) { + this.messageExchangeTimeout = messageExchangeTimeout; + } + if (appLaunchTimeout) { + this.appLaunchTimeout = appLaunchTimeout; + } + + if (timeoutMessageExchanges) { + this.automaticResponses = [ + new GetInfo(), + new Handshake(this.timeOutIdValidation), + new CurrentChannel(), + new UserChannels(), + ]; + } else { + this.automaticResponses = [ + new GetInfo(), + new Handshake(this.timeOutIdValidation), + new CurrentChannel(), + new FindIntent(), + new RaiseIntent(), + new UserChannels(), + new Broadcast(), + ]; + } + + this.init(); + } + + cleanup(instanceId: InstanceID): void { + //message handler are faked with automated responses, so no need to clean up their state + this.tsc.setAppState(instanceId, State.Terminated); + } + + async receive(message: AppRequestMessage, from: string): Promise { + //If timeoutMessageExchanges was set then we will not respond to some messages here + this.automaticResponses.forEach(r => { + if (r.filter(message.type)) { + r.action(message, this.tsc, from); + } + }); + } + + shutdown() { + this.tsc.shutdown(); + } + + hasReceivedGoodbye(): boolean { + return this.receivedGoodbye; + } + + init() { + this.window.addEventListener('message', e => { + const event = e as MessageEvent; + const data = event.data; + const source = event.source as Window; + const origin = event.origin; + + if (this.tsc.cw.debugLogs) { + console.log('MockFDC3Server received: ', event.data); + } + if (data.type == 'WCP1Hello') { + if (this.useIframe) { + const message: WebConnectionProtocol2LoadURL = { + type: 'WCP2LoadUrl', + meta: { + connectionAttemptUuid: data.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + iframeUrl: EMBED_URL + '?connectionAttemptUuid=' + data.meta.connectionAttemptUuid, + }, + }; + source.postMessage(message, origin); + } else { + const details = this.tsc.getMatchingInstance(data.payload.identityUrl); + if (details) { + const message: WebConnectionProtocol3Handshake = { + type: 'WCP3Handshake', + meta: { + connectionAttemptUuid: data.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + fdc3Version: '2.2', + intentResolverUrl: this.useDefaultUIUrls ? true : INTENT_RESOLVER_URL, + channelSelectorUrl: this.useDefaultUIUrls ? true : CHANNEL_SELECTOR_URL, + messageExchangeTimeout: 1000, + appLaunchTimeout: 2000, + }, + }; + if (this.messageExchangeTimeout) { + message.payload.messageExchangeTimeout = this.messageExchangeTimeout; + } + if (this.appLaunchTimeout) { + message.payload.appLaunchTimeout = this.appLaunchTimeout; + } + source.postMessage(message, origin, [details.externalPort]); + } //getMatchingInstance will log if it didn't find anything + } + } else if (data.type == 'WCP6Goodbye') { + this.receivedGoodbye = true; + } + }); + } +} diff --git a/packages/fdc3-get-agent/test/support/MockIFrame.ts b/packages/fdc3-get-agent/test/support/MockIFrame.ts new file mode 100644 index 000000000..3aeb378d0 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockIFrame.ts @@ -0,0 +1,88 @@ +import { CustomWorld } from '../world'; +import { handleChannelSelectorComms, handleEmbeddedIframeComms, handleIntentResolverComms } from './FrameTypes'; +import { EMBED_URL, CHANNEL_SELECTOR_URL, INTENT_RESOLVER_URL } from './MockFDC3Server'; +import { MockWindow } from './MockWindow'; + +export class MockIFrame extends MockWindow { + contentWindow: MockWindow; + messageChannels: MessageChannel[] = []; + parent: MockWindow; + initFn: (() => void) | null = null; + + constructor(tag: string, cw: CustomWorld, parent: MockWindow, name: string) { + super(tag, cw, name); + this.parent = parent; + this.contentWindow = this; + if (this.cw.debugLogs) { + console.log(`MockIFrame (name: ${name} / parent.name: ${parent.name}): Created`); + } + } + + /** Used to simulate the iframe loading. */ + load(): void { + if (this.cw.debugLogs) { + console.log(`MockIFrame (name: ${this.name}): Dispatching load event`); + } + + //if we've got an init fn *to simulate comms) call it before we dispatch the load event + if (this.initFn) { + this.initFn(); + } + + this.dispatchEvent(new Event('load')); + } + + setAttribute(name: string, value: string): void { + this.atts[name] = value; + const parent = this.parent as MockWindow; + + if (name === 'src') { + //set the frame up properly along wih a function to initialize comms when it loads + if (value.startsWith(EMBED_URL)) { + this.name = 'embedded-iframe'; + this.parent.commsIframe = this; + this.initFn = () => { + handleEmbeddedIframeComms(value, parent, this.contentWindow, this.cw); + }; + if (this.cw.debugLogs) { + console.debug(`MockIframe (name: ${this.name}): Created comms iframe with url: ${value}`); + } + } else if (value.startsWith(CHANNEL_SELECTOR_URL)) { + this.name = 'channel-selector'; + this.parent.channelSelectorIframe = this; + this.initFn = () => { + this.messageChannels.push(handleChannelSelectorComms(value, parent, this.contentWindow, this.cw)); + }; + if (this.cw.debugLogs) { + console.debug(`MockIframe (name: ${this.name}): Created channel selector iframe with url: ${value}`); + } + } else if (value.startsWith(INTENT_RESOLVER_URL)) { + this.name = 'intent-resolver'; + this.parent.intentResolverIframe = this; + this.initFn = () => { + this.messageChannels.push(handleIntentResolverComms(value, parent, this.contentWindow, this.cw)); + }; + if (this.cw.debugLogs) { + console.debug(`MockIframe (name: ${this.name}): Created intent resolver iframe with url: ${value}`); + } + } else { + if (this.cw.debugLogs) { + console.warn(`MockIframe (name: ${this.name}): Set an unrecognized URL: ${value}`); + } + } + } else if (name === 'name') { + if (this.cw.debugLogs) { + console.debug(`MockIframe (name: ${this.name}): setAttribute() changing iframe name to: ${value}`); + } + this.name = value; + } + } + + shutdown() { + super.shutdown(); + this.messageChannels.forEach(mc => { + mc.port1.close(); + mc.port2.close(); + }); + } +} diff --git a/packages/fdc3-get-agent/test/support/MockStorage.ts b/packages/fdc3-get-agent/test/support/MockStorage.ts new file mode 100644 index 000000000..c9acd27f2 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockStorage.ts @@ -0,0 +1,27 @@ +export class MockStorage implements Storage { + private store: { [key: string]: string } = {}; + + get length(): number { + return Object.keys(this.store).length; + } + + clear(): void { + this.store = {}; + } + + getItem(key: string): string | null { + return this.store[key] || null; + } + + key(index: number): string | null { + return Object.keys(this.store)[index] || null; + } + + removeItem(key: string): void { + delete this.store[key]; + } + + setItem(key: string, value: string): void { + this.store[key] = value; + } +} diff --git a/packages/fdc3-get-agent/test/support/MockWindow.ts b/packages/fdc3-get-agent/test/support/MockWindow.ts new file mode 100644 index 000000000..12e30eca3 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/MockWindow.ts @@ -0,0 +1,114 @@ +import { DesktopAgent } from '@finos/fdc3-standard'; +import { CustomWorld } from '../world'; +import { EventHandler } from './EventHandler'; +import { MockElement } from './MockElement'; +import { + AgentEventMessage, + AgentResponseMessage, + AppRequestMessage, + Fdc3UserInterfaceMessage, + isFdc3UserInterfaceHello, + WebConnectionProtocolMessage, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type STANDARD_MESSAGES = + | AppRequestMessage + | AgentResponseMessage + | AgentEventMessage + | WebConnectionProtocolMessage + | Fdc3UserInterfaceMessage; + +export class MockWindow extends MockElement { + fdc3: DesktopAgent | undefined; + cw: CustomWorld; + name: string; + + constructor(tag: string, cw: CustomWorld, name: string) { + super(tag); + this.cw = cw; + this.name = name; + if (cw.debugLogs) { + console.debug(`MockWindow (name: ${this.name} / tag: ${this.tag}): Created`); + } + } + + eventHandlers: EventHandler[] = []; + events: { type: string; data: MessageEvent }[] = []; + + //references used to attribute postMessages to sources + parent: MockWindow | null = null; + child: MockWindow | null = null; + commsIframe: MockWindow | null = null; + channelSelectorIframe: MockWindow | null = null; + intentResolverIframe: MockWindow | null = null; + + location = { + origin: 'https://dummyOrigin.test', + href: 'https://dummyOrigin.test/path', + }; + + addEventListener(type: string, callback: (e: Event) => void): void { + this.eventHandlers.push({ type, callback }); + if (this.cw.debugLogs) { + console.log(`MockWindow (name: ${this.name} / tag: ${this.tag}): added event handler: ${type}`); + } + } + + removeEventListener(type: string, el: EventListener): void { + const removeIndex = this.eventHandlers.findIndex(e => e.type === type && e.callback === el); + if (removeIndex !== -1) { + this.eventHandlers.splice(removeIndex, 1); + if (this.cw.debugLogs) { + console.debug(`MockWindow (name: ${this.name} / tag: ${this.tag}): removed event handler: ${type}`); + } + } + } + + dispatchEvent(event: Event): void { + this.events.push({ type: event.type, data: (event as unknown as MessageEvent).data }); + this.eventHandlers.forEach(e => { + if (e.type === event.type) { + e.callback(event); + } + }); + } + + postMessage(msg: STANDARD_MESSAGES, targetOrigin: string, transfer: MessagePort[] | undefined): void { + //usually only one of these will be set - however parent might be set initially, + // but later overridden by commsIframe wafter a WCP2LoadUrl + let source = this.commsIframe ?? this.child ?? this.parent ?? this; + + //adjust source for mock UI iframes - these variables are set in MockDocument.setAttribute + if (isFdc3UserInterfaceHello(msg)) { + if (msg.payload.implementationDetails == 'mock channel selector') { + source = this.channelSelectorIframe!; + } else if (msg.payload.implementationDetails == 'mock intent resolver') { + source = this.intentResolverIframe!; + } + } + + const event = { + type: 'message', + data: msg, + origin: targetOrigin, + ports: transfer, + //TODO: set source for UI iframes, comms iframe, parent DA or child app depending on message type + source, + } as unknown as MessageEvent; + + if (this.cw.debugLogs) { + console.debug( + `MockWindow (name: ${this.name} / tag: ${this.tag}): postMessage called with source: ${(event.source as WindowProxy)?.name ?? 'UNKNOWN'}` + ); + } + this.dispatchEvent(event); + } + + shutdown() { + this.eventHandlers = []; + this.fdc3 = undefined; + if (this.cw.mockFDC3Server) { + this.cw.mockFDC3Server.shutdown(); + } + } +} diff --git a/packages/fdc3-get-agent/test/support/TestServerContext.ts b/packages/fdc3-get-agent/test/support/TestServerContext.ts new file mode 100644 index 000000000..06c047153 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/TestServerContext.ts @@ -0,0 +1,187 @@ +import { ServerContext, InstanceID, FDC3Server } from '@finos/fdc3-web-impl'; +import { CustomWorld } from '../world'; +import { OpenError, AppIdentifier, AppIntent } from '@finos/fdc3-standard'; +import { AppRegistration, State } from '@finos/fdc3-web-impl'; + +type ConnectionDetails = AppRegistration & { + msg?: object; + connectionId: string; + externalPort: MessagePort; + internalPort: MessagePort; + url: string; +}; + +type MessageRecord = { + to?: AppIdentifier; + uuid?: InstanceID; + msg: object; +}; + +export const dummyInstanceDetails = [ + { appId: 'Test App Id', url: 'https://dummyOrigin.test/path' }, + { appId: 'Test App Id 2', url: 'https://dummyOrigin.test/alternativePath' }, +]; + +export class TestServerContext implements ServerContext { + public postedMessages: MessageRecord[] = []; + public readonly cw: CustomWorld; + private instances: ConnectionDetails[] = []; + private server: FDC3Server | null = null; + + private nextInstanceId: number = 0; + private nextUUID: number = 0; + + constructor(cw: CustomWorld) { + this.cw = cw; + } + + setFDC3Server(server: FDC3Server): void { + this.server = server; + } + + async narrowIntents(_raiser: AppIdentifier, appIntents: AppIntent[] /*, _context: Context*/): Promise { + return appIntents; + } + + getInstanceDetails(uuid: string) { + return this.instances.find(ca => ca.instanceId === uuid); + } + + setInstanceDetails(uuid: InstanceID, appId: ConnectionDetails) { + this.instances = this.instances.filter(ca => ca.connectionId !== uuid); + this.instances.push({ + ...appId, + connectionId: uuid, + }); + } + + getMatchingInstance(url: string): ConnectionDetails | undefined { + const details = this.instances.find(ca => ca.url === url); + if (!details) { + const knownInstances = this.instances.map(inst => { + return { appId: inst.appId, url: inst.url }; + }); + console.error( + 'No connection instance found - will return a mismatched instance, url: ', + url, + '\nknown instances: ', + knownInstances + ); + return this.instances[0]; + } + return details; + } + + async shutdown(): Promise { + await Promise.all(this.instances.map(i => i.internalPort.close())); + await Promise.all(this.instances.map(i => i.externalPort.close())); + } + + /** Used to mock connections to the server from apps. Must be called before the app attempts to connect for that connection to succeed. */ + async open(appId: string): Promise { + const url = dummyInstanceDetails.find(value => value.appId === appId)?.url; + if (!url) { + console.error('TestServerContext Tried to open an unknown appId'); + throw new Error(OpenError.AppNotFound); + } else { + const ni = this.nextInstanceId++; + if (appId.includes('missing')) { + throw new Error(OpenError.AppNotFound); + } else { + const mc = new MessageChannel(); + const internalPort = mc.port1; + const externalPort = mc.port2; + + internalPort.start(); + + const connectionDetails = { + appId, + instanceId: 'uuid-' + ni, + connected: false, + connectionId: 'uuid-' + ni, + externalPort, + internalPort, + url: url, + state: State.Pending, + }; + + this.instances.push(connectionDetails); + internalPort.onmessage = msg => { + this.cw.mockFDC3Server?.receive(msg.data, connectionDetails.instanceId); + }; + + return connectionDetails.connectionId; + } + } + } + + async getConnectedApps(): Promise { + return (await this.getAllApps()).filter(ca => ca.state == State.Connected); + } + + async isAppConnected(app: InstanceID): Promise { + const found = this.instances.find(a => a.instanceId == app && a.state == State.Connected); + return found != null; + } + + async setAppState(app: InstanceID, newState: State): Promise { + const found = this.instances.find(a => a.instanceId == app); + if (found) { + const currentState = found.state; + if (currentState !== State.Terminated && newState === State.Terminated) { + this.server?.cleanup(app); + } + found.state = newState; + } + } + + async getAllApps(): Promise { + return this.instances.map(x => { + return { + appId: x.appId, + instanceId: x.instanceId, + state: x.state, + }; + }); + } + + provider(): string { + return 'cucumber-provider'; + } + providerVersion(): string { + return '1.2.3.TEST'; + } + fdc3Version(): string { + return '2.0'; + } + + createUUID(): string { + return 'uuid' + this.nextUUID++; + } + + /** + * USED FOR TESTING + */ + getInstanceUUID(appId: AppIdentifier): InstanceID | undefined { + return this.instances.find( + ca => ca.appId == appId.appId && ca.instanceId == appId.instanceId && ca.state == State.Connected + )?.instanceId; + } + + /** + * USED FOR TESTING + */ + getFirstInstance() { + return this.instances[0]; + } + + post(msg: object, to: InstanceID): Promise { + const details = this.getInstanceDetails(to); + details?.internalPort.postMessage(msg); + return Promise.resolve(); + } + + log(message: string): void { + this.cw.log(message); + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/AutomaticResponses.ts b/packages/fdc3-get-agent/test/support/responses/AutomaticResponses.ts new file mode 100644 index 000000000..779133c83 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/AutomaticResponses.ts @@ -0,0 +1,7 @@ +import { InstanceID } from '@finos/fdc3-web-impl'; +import { TestServerContext } from '../TestServerContext'; + +export interface AutomaticResponse { + filter: (t: string) => boolean; + action: (input: object, m: TestServerContext, from: InstanceID) => Promise; +} diff --git a/packages/fdc3-get-agent/test/support/responses/Broadcast.ts b/packages/fdc3-get-agent/test/support/responses/Broadcast.ts new file mode 100644 index 000000000..fee8559d9 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/Broadcast.ts @@ -0,0 +1,33 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { BroadcastRequest, BroadcastResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { createUUID } from '../../../src/util/Uuid'; + +export class Broadcast implements AutomaticResponse { + filter(t: string) { + return t == 'broadcastRequest'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const broadcastRequest = input as BroadcastRequest; + const request = this.createBroadcastResponseMessage(broadcastRequest); + setTimeout(() => { + m.post(request, from); + }, 100); + return Promise.resolve(); + } + + private createBroadcastResponseMessage(m: BroadcastRequest): BroadcastResponse { + const response: BroadcastResponse = { + meta: { + requestUuid: m.meta.requestUuid, + responseUuid: createUUID(), + timestamp: new Date(), + }, + type: 'broadcastResponse', + payload: {}, + }; + return response; + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/CurrentChannel.ts b/packages/fdc3-get-agent/test/support/responses/CurrentChannel.ts new file mode 100644 index 000000000..31408db8a --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/CurrentChannel.ts @@ -0,0 +1,38 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { + GetCurrentChannelRequest, + GetCurrentChannelResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class CurrentChannel implements AutomaticResponse { + filter(t: string) { + return t == 'getCurrentChannelRequest'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const out = this.createResponse(input as GetCurrentChannelRequest, m); + setTimeout(() => { + m.post(out, from); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: GetCurrentChannelRequest, m: TestServerContext): GetCurrentChannelResponse { + const response: GetCurrentChannelResponse = { + meta: { + ...i.meta, + responseUuid: m.createUUID(), + }, + type: 'getCurrentChannelResponse', + payload: { + channel: { + id: 'one', + type: 'user', + }, + }, + }; + return response; + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/FindIntent.ts b/packages/fdc3-get-agent/test/support/responses/FindIntent.ts new file mode 100644 index 000000000..46b70fe1e --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/FindIntent.ts @@ -0,0 +1,47 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { FindIntentRequest, FindIntentResponse } from '@finos/fdc3-schema/generated/api/BrowserTypes'; +import { createUUID } from '../../../src/util/Uuid'; + +export class FindIntent implements AutomaticResponse { + filter(t: string) { + return t == 'findIntentRequest'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const intentRequest = input as FindIntentRequest; + const request = this.createFindIntentResponseMessage(intentRequest); + setTimeout(() => { + m.post(request, from); + }, 100); + return Promise.resolve(); + } + + private createFindIntentResponseMessage(m: FindIntentRequest): FindIntentResponse { + const response: FindIntentResponse = { + meta: { + requestUuid: m.meta.requestUuid, + responseUuid: createUUID(), + timestamp: new Date(), + }, + type: 'findIntentResponse', + payload: { + appIntent: { + intent: { name: m.payload.intent }, + apps: [ + { + appId: 'test-app-1', + name: 'Test App 1', + }, + { + appId: 'test-app-2', + name: 'Test App 2', + }, + ], + }, + }, + }; + return response; + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/GetInfo.ts b/packages/fdc3-get-agent/test/support/responses/GetInfo.ts new file mode 100644 index 000000000..3c96cee59 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/GetInfo.ts @@ -0,0 +1,42 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { GetInfoRequest, GetInfoResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class GetInfo implements AutomaticResponse { + filter(t: string) { + return t == 'getInfoRequest'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const out = this.createResponse(input as GetInfoRequest, m); + setTimeout(() => { + m.post(out, from); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: GetInfoRequest, m: TestServerContext): GetInfoResponse { + const response: GetInfoResponse = { + meta: { + ...i.meta, + responseUuid: m.createUUID(), + }, + type: 'getInfoResponse', + payload: { + implementationMetadata: { + appMetadata: i.meta.source!, //{appId: "cucumber-app", instanceId: "cucumber-instance"}, + provider: 'cucumber-provider', + providerVersion: 'test', + fdc3Version: '2.0', + optionalFeatures: { + DesktopAgentBridging: false, + OriginatingAppMetadata: false, + UserChannelMembershipAPIs: false, + }, + }, + }, + }; + return response; + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/Handshake.ts b/packages/fdc3-get-agent/test/support/responses/Handshake.ts new file mode 100644 index 000000000..3f9c88214 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/Handshake.ts @@ -0,0 +1,107 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { + WebConnectionProtocol4ValidateAppIdentity, + WebConnectionProtocol5ValidateAppIdentityFailedResponse, + WebConnectionProtocol5ValidateAppIdentitySuccessResponse, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export const BAD_INSTANCE_ID = 'BAD_INSTANCE'; +export const EXPECTED_IDENTITY_URL = 'https://dummyOrigin.test/path'; +export const ALTERNATIVE_IDENTITY_URL = 'https://dummyOrigin.test/alternativePath'; + +export class Handshake implements AutomaticResponse { + timeOut: boolean; + + constructor(timeOut: boolean = false) { + this.timeOut = timeOut; + } + + filter(t: string) { + return t == 'WCP4ValidateAppIdentity'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + if (!this.timeOut) { + const out = this.createResponse(input as WebConnectionProtocol4ValidateAppIdentity); + setTimeout(() => { + m.post(out, from); + }, 100); + } else { + console.debug('Forcing timeout of identity validation'); + } + return Promise.resolve(); + } + + private createResponse( + i: WebConnectionProtocol4ValidateAppIdentity + ): + | WebConnectionProtocol5ValidateAppIdentitySuccessResponse + | WebConnectionProtocol5ValidateAppIdentityFailedResponse { + const identityURL = i.payload.identityUrl; + if (i.payload.instanceUuid == BAD_INSTANCE_ID) { + const msg: WebConnectionProtocol5ValidateAppIdentityFailedResponse = { + meta: { + connectionAttemptUuid: i.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + type: 'WCP5ValidateAppIdentityFailedResponse', + payload: { + message: 'Invalid instance', + }, + }; + return msg; + } else if (identityURL == EXPECTED_IDENTITY_URL || identityURL == ALTERNATIVE_IDENTITY_URL) { + let appId = 'cucumber-app'; + let instanceId = 'cucumber-instance'; + let instanceUuid = 'some-instance-uuid'; + + if (identityURL == ALTERNATIVE_IDENTITY_URL) { + appId = 'cucumber-alternative-app'; + instanceId = 'cucumber-alternative-instance'; + instanceUuid = 'some-alternative-instance-uuid'; + } + + const msg: WebConnectionProtocol5ValidateAppIdentitySuccessResponse = { + meta: { + connectionAttemptUuid: i.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + type: 'WCP5ValidateAppIdentityResponse', + payload: { + implementationMetadata: { + appMetadata: { + appId: appId, + instanceId: instanceId, + }, + fdc3Version: '2.0', + optionalFeatures: { + DesktopAgentBridging: false, + OriginatingAppMetadata: true, + UserChannelMembershipAPIs: true, + }, + provider: 'cucumber-provider', + providerVersion: 'test', + }, + appId: appId, + instanceId: instanceId, + instanceUuid: instanceUuid, + }, + }; + return msg; + } else { + const msg: WebConnectionProtocol5ValidateAppIdentityFailedResponse = { + meta: { + connectionAttemptUuid: i.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + type: 'WCP5ValidateAppIdentityFailedResponse', + payload: { + message: 'Unknown identity URL', + }, + }; + return msg; + } + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/RaiseIntent.ts b/packages/fdc3-get-agent/test/support/responses/RaiseIntent.ts new file mode 100644 index 000000000..8138ba0af --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/RaiseIntent.ts @@ -0,0 +1,38 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { RaiseIntentRequest, RaiseIntentResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export class RaiseIntent implements AutomaticResponse { + filter(t: string) { + return t == 'raiseIntentRequest'; + } + + createRaiseIntentAgentResponseMessage(intentRequest: RaiseIntentRequest, m: TestServerContext): RaiseIntentResponse { + const out: RaiseIntentResponse = { + meta: { + ...intentRequest.meta, + responseUuid: m.createUUID(), + }, + payload: { + intentResolution: { + intent: intentRequest.payload.intent, + source: intentRequest.payload.app!!, + }, + }, + type: 'raiseIntentResponse', + }; + + return out; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const intentRequest = input as RaiseIntentRequest; + // this sends out the intent resolution + const out1 = this.createRaiseIntentAgentResponseMessage(intentRequest, m); + setTimeout(() => { + m.post(out1, from); + }, 100); + return Promise.resolve(); + } +} diff --git a/packages/fdc3-get-agent/test/support/responses/UserChannels.ts b/packages/fdc3-get-agent/test/support/responses/UserChannels.ts new file mode 100644 index 000000000..b0ba19a06 --- /dev/null +++ b/packages/fdc3-get-agent/test/support/responses/UserChannels.ts @@ -0,0 +1,48 @@ +import { TestServerContext } from '../TestServerContext'; +import { InstanceID } from '@finos/fdc3-web-impl'; +import { AutomaticResponse } from './AutomaticResponses'; +import { GetUserChannelsRequest, GetUserChannelsResponse } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export const USER_CHANNELS = [ + { + id: 'one', + type: 'user', + }, + { + id: 'two', + type: 'user', + }, + { + id: 'three', + type: 'user', + }, +] as any; + +export class UserChannels implements AutomaticResponse { + filter(t: string) { + return t == 'getUserChannelsRequest'; + } + + action(input: object, m: TestServerContext, from: InstanceID) { + const out = this.createResponse(input as GetUserChannelsRequest, m); + + setTimeout(() => { + m.post(out, from); + }, 100); + return Promise.resolve(); + } + + private createResponse(i: GetUserChannelsRequest, m: TestServerContext): GetUserChannelsResponse { + const response: GetUserChannelsResponse = { + meta: { + ...i.meta, + responseUuid: m.createUUID(), + }, + type: 'getUserChannelsResponse', + payload: { + userChannels: USER_CHANNELS, + }, + }; + return response; + } +} diff --git a/packages/fdc3-get-agent/test/world/index.ts b/packages/fdc3-get-agent/test/world/index.ts new file mode 100644 index 000000000..65c4ef1ab --- /dev/null +++ b/packages/fdc3-get-agent/test/world/index.ts @@ -0,0 +1,14 @@ +import { setWorldConstructor } from '@cucumber/cucumber'; +import { PropsWorld } from '@finos/testing'; +import { MockFDC3Server } from '../support/MockFDC3Server'; +import { TestServerContext } from '../support/TestServerContext'; + +export class CustomWorld extends PropsWorld { + mockFDC3Server: MockFDC3Server | null = null; + + mockContext: TestServerContext = new TestServerContext(this); + + debugLogs: boolean = false; +} + +setWorldConstructor(CustomWorld); diff --git a/packages/fdc3-get-agent/tsconfig.json b/packages/fdc3-get-agent/tsconfig.json new file mode 100644 index 000000000..050a5a5e9 --- /dev/null +++ b/packages/fdc3-get-agent/tsconfig.json @@ -0,0 +1,33 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src", + "test" + ], + "outDir": "dist", + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../fdc3-agent-proxy" + }, + { + "path": "../fdc3-standard" + }, + { + "path": "../testing" + }, + { + "path": "../fdc3-schema" + }, + { + "path": "../fdc3-context" + }, + { + "path": "../../toolbox/fdc3-for-web/fdc3-web-impl" + } + ] +} \ No newline at end of file diff --git a/packages/fdc3-schema/README-Bridging.md b/packages/fdc3-schema/README-Bridging.md new file mode 100644 index 000000000..5626b716a --- /dev/null +++ b/packages/fdc3-schema/README-Bridging.md @@ -0,0 +1,53 @@ +# Bridging Message types generation README + +This folder contains Typescript interfaces, in BridgingTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). Source files may also be generated for us in other languages supported by Quicktype. + +Please note that these definitions are provided to help developers working in TypeScript to produce valid bridging messages objects - but should not be considered the 'source of truth' for message definitions (instead look to the schemas and documentation). + +It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, if there is any disagreement between the definitions, the JSON Schema should be assumed to be correct, rather than the TypeScript. For example, JSON Schema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature is incompatible with optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of the subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by Quicktype - resulting in a type that will compile but doesn't restrict the type of optional property values as defined in the schema. + +Further, Quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSON Schema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSON Schema. + +Hence, the Types provided here can be used to provide valid message objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSON Schema. + +Finally, Quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the primary interface definition. These often do not have unique names (generated from title fields in the schemas). If a name conflict is encountered, Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the primary type, e.g.: + +```TypeScript +export interface Instrument { + id: StickyId; + market?: FluffyMarket; + type: string; + name?: string; + [property: string]: any; +} + +export interface StickyId { + BBG?: string; + CUSIP?: string; + FDS_ID?: string; + FIGI?: string; + ISIN?: string; + PERMID?: string; + RIC?: string; + SEDOL?: string; + ticker?: string; + [property: string]: any; +} + +export interface FluffyMarket { + BBG?: string; + COUNTRY_ISOALPHA2?: string; + MIC?: string; + name?: string; + [property: string]: any; +} +``` + +and should not be considered a planned part of the type structure (which should not be replicated in any derivative work). When applied, the naming of these sub-units is not used, rather they are replaced with their contents. Generating better names for these sub-units is usually a case of adding or adjusting `title` fields on the relevant elements of the schema documents. + +Finally, please note that the latest version of Quicktype (at the time of writing `23.0.49`) has a number of bugs that must be worked around: + +- Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpreted as JSON rather than JSON Schema. + - A utility is provided in this repository (_../../quicktypeUtil.js_) to work around this bug by listing directories and constructing a call to quicktype where each file is provided as an individual source. +- Setting the `--nice-property-names` TypeScript output option will crash the generator and can't be used. +- The --debug setting must be the first argument passed or it will be ignored. diff --git a/packages/fdc3-schema/README-Context.md b/packages/fdc3-schema/README-Context.md new file mode 100644 index 000000000..9fa44276e --- /dev/null +++ b/packages/fdc3-schema/README-Context.md @@ -0,0 +1,52 @@ +# Context types generation README + +This folder contains Typescript interfaces, in ContextTypes.ts generated from the context JSONSchema (https://json-schema.org/) files via quicktype (https://quicktype.io/). + +Please note that these definitions are provided to help developers working in TypeScript to produce valid context objects - but should not be considered the 'source of truth' for context definitions (instead look to the schemas and documentation). Source files may also be generated for us in other languages supported by quicktype. + +It is not always possible to perfectly replicate a type/interface defined in JSONSchema via TypeScript. Hence, in the event of any disagreement between the definitions, the JSONSchema should be assumed to be correct, rather than the Typescript. For example, JSONSchema may define optional fields on an object + a restriction on the type of additional properties (via `"additionalProperties": { "type": "string"}`), which will result in an index signature `[property: string]: string;` in generated TypeScript. That signature, is incompatible with with an optional properties (including string properties) as they have type `string | undefined`. A similar problem may occur in JSON Schema if the schema is used to create a subtype via composition as `additionalProperties` is not aware of teh subschema's definitions. Both issues can be worked around by using `unevaluatedProperties` in the schema, which will defer to the declared type of the optional property in the subschema, but is also currently ignored by quicktype - resulting in a type that will compile, but doesn't restrict the type of optional property values as defined in the schema. + +Further, quicktype doesn't always perfectly replicate polymorphic fields specified with `oneOf` in JSONSchema as it will usually merge the different objects into a single type (where fields not in one of the constituent schemas become optional) rather than creating a union type. In such situations, the type produced is usable (has all the necessary fields) but may allow the construction of invalid instances which are missing required properties or include properties from the multiple schemas combined, which are not possible/valid according to JSONSchema. + +Hence, the Types provided here can be used to provide valid Context objects and to read/write their JSON encodings, but may not detect or prevent a limited set of invalid objects that would be identified by JSONSchema. + +Please also note that quicktype will generate types or interfaces representing subunits of the schema, which are then referenced in the main interface definition. These often do not have unique names (e.g. fields of the `id` object in the Context schema, defined for a specific context type such as fdc3.instrument). Quicktype will generate a random name for such an interface, to use to reference it, and as it is randomly generated it may appear oddly named (e.g. `PurpleId`, `FluffyMarket`, `TentacledIdentifier` etc.). Please ignore such names as these types/interfaces will not normally be used outside of the composition of the main type, e.g.: + +```TypeScript +export interface Instrument { + id: StickyId; + market?: FluffyMarket; + type: string; + name?: string; + [property: string]: any; +} + +export interface StickyId { + BBG?: string; + CUSIP?: string; + FDS_ID?: string; + FIGI?: string; + ISIN?: string; + PERMID?: string; + RIC?: string; + SEDOL?: string; + ticker?: string; + [property: string]: any; +} + +export interface FluffyMarket { + BBG?: string; + COUNTRY_ISOALPHA2?: string; + MIC?: string; + name?: string; + [property: string]: any; +} +``` + +and should not be considered a planned part of the type structure (which should not be replicated in any derivative work). When applied, the naming of these sub-units is not used, rather they are replaced with their contents. It is hoped that we will be to generate better names of these sub-units in future. + +Finally, please note that the latest version of quicktype (at the time of writing `23.0.19`) has a number of bugs that must be worked around: + +- Using a directory or .schema.json files as a source will cause the input type argument `-s schema` to be ignored, causing the files to be interpreted as JSON rather than JSON Schema. + - A utility is provided in this repository (_../../quicktypeUtil.js_) to work around this bug by listing directories and constructing a call to quicktype where each file is provided as an individual source. +- Setting the `--nice-property-names` TypeScript output option will crash the generator and can't be used. diff --git a/packages/fdc3-schema/code-generation/generate-type-predicates.ts b/packages/fdc3-schema/code-generation/generate-type-predicates.ts new file mode 100644 index 000000000..88f3beb49 --- /dev/null +++ b/packages/fdc3-schema/code-generation/generate-type-predicates.ts @@ -0,0 +1,271 @@ +import { + InterfaceDeclaration, + KindToNodeMappings, + MethodDeclaration, + Project, + SyntaxKind, + TypeAliasDeclaration, +} from 'ts-morph'; +import print from 'message-await'; + +// open a new project with just BrowserTypes as the only source file +const project = new Project(); +const sourceFile = project.addSourceFileAtPath('./generated/api/BrowserTypes.ts'); + +const APP_REQUEST_MESSAGE = 'AppRequestMessage'; +const AGENT_RESPONSE_MESSAGE = 'AgentResponseMessage'; +const AGENT_EVENT_MESSAGE = 'AgentEventMessage'; + +/** + * We generate the union types and remove the existing interfaces first so that we are not left with a generated type predicate for the removed base interface + */ +writeMessageUnionTypes(); +writeTypePredicates(); + +sourceFile.formatText(); +project.saveSync(); + +/** + * Replaces the existing interfaces AppRequestMessage, AgentResponseMessage and AgentEventMessage with unions of INterfaces instead of a base type + */ +function writeMessageUnionTypes() { + const typeAliases = sourceFile.getChildrenOfKind(SyntaxKind.TypeAliasDeclaration); + + writeMessageUnion(APP_REQUEST_MESSAGE, 'RequestMessageType', typeAliases); + writeMessageUnion(AGENT_RESPONSE_MESSAGE, 'ResponseMessageType', typeAliases); + writeMessageUnion(AGENT_EVENT_MESSAGE, 'EventMessageType', typeAliases); +} + +function writeMessageUnion(unionName: string, typeUnionName: string, typeAliases: TypeAliasDeclaration[]) { + let awaitMessage = print(`Writing ${unionName} (finding types)`, { spinner: true }); + + // get the types listed in the types union type + // i.e. look for: export type RequestMessageType = "addContextListenerRequest" | "whatever" + const requestMessageTypeUnion = findUnionType(typeAliases, typeUnionName); + if (requestMessageTypeUnion != null) { + //remove existing type alias + findExisting(unionName, SyntaxKind.TypeAliasDeclaration).forEach(node => node.remove()); + + awaitMessage.updateMessage(`Writing ${unionName} (writing union)`, true); + + // Write a union type of all interfaces that have a type that extends RequestMessageType + // i.e. export type AppRequestMessage = AddContextListenerRequest | AddEventListenerRequest | AddIntentListenerRequest; + writeUnionType(unionName, requestMessageTypeUnion); + } + + awaitMessage.complete(true, `Writing ${unionName}`); +} + +/** + * Writes type predicates for all interfaces found that have a matching convert function + */ +function writeTypePredicates() { + let awaitMessage = print(`Writing Type Predicates (finding convert functions)`, { spinner: true }); + + // get a list of all conversion functions in the Convert class that return a string + const convert = sourceFile.getClass('Convert'); + const convertFunctions = (convert?.getChildrenOfKind(SyntaxKind.MethodDeclaration) ?? []).filter( + func => func.getReturnType().getText() === 'string' + ); + + awaitMessage.updateMessage(`Writing Type Predicates (finding message interfaces)`, true); + + //get a list of all interfaces in the file + let messageInterfaces = sourceFile.getChildrenOfKind(SyntaxKind.InterfaceDeclaration); + + // generate a list of Interfaces that have an associated conversion function + const matchedInterfaces = convertFunctions + .map(func => { + const valueParameter = func.getParameter('value'); + + const matchingInterface = messageInterfaces.find(interfaceNode => { + /// Find an interface who's name matches the type passed into the value parameter of the convert function + return valueParameter?.getType().getText(valueParameter) === interfaceNode.getName(); + }); + + if (matchingInterface != null) { + return { func, matchingInterface }; + } + + return undefined; + }) + .filter(isDefined); + + const allFunctionDeclarations = sourceFile.getChildrenOfKind(SyntaxKind.FunctionDeclaration); + + // write a type predicate for each matched interface + matchedInterfaces.forEach((matched, index) => { + awaitMessage.updateMessage(`Writing Type Predicates (${index}/${matchedInterfaces.length})`, true); + + writeFastPredicate(matched.matchingInterface, allFunctionDeclarations); + writeValidPredicate(matched.matchingInterface, matched.func, allFunctionDeclarations); + writeTypeConstant(matched.matchingInterface); + }); + + awaitMessage.complete(true, `Writing Type Predicates`); +} + +/** + * Looks for a string union type in the form: + * export type NAME = "stringOne" | "stringTwo" | "stringThree"; + * and returns the string values + * if the union type is not found returns undefined + * @param name + * @returns + */ +function findUnionType(typeAliases: TypeAliasDeclaration[], name: string): string[] | undefined { + const typeAlias = typeAliases.find(alias => { + const identifiers = alias.getChildrenOfKind(SyntaxKind.Identifier); + + return identifiers[0].getText() === name; + }); + + return typeAlias + ?.getChildrenOfKind(SyntaxKind.UnionType)?.[0] + .getDescendantsOfKind(SyntaxKind.StringLiteral) + .map(literal => literal.getLiteralText()); +} + +/** + * Finds an existing declaration with the given type and name + * @param name + * @param kind + * @returns + */ +function findExisting(name: string, kind: T, allDeclarationsOfType?: KindToNodeMappings[T][]) { + allDeclarationsOfType = allDeclarationsOfType ?? sourceFile.getChildrenOfKind(kind); + + return sourceFile.getChildrenOfKind(kind).filter(child => { + const identifier = child.getDescendantsOfKind(SyntaxKind.Identifier)[0]; + + return identifier?.getText() === name; + }); +} + +/** + * Writes a type predicate for the given interface using the Convert method declaration + * @param matchingInterface + * @param func + */ +function writeValidPredicate( + matchingInterface: InterfaceDeclaration, + func: MethodDeclaration, + allFunctionDeclarations: KindToNodeMappings[SyntaxKind.FunctionDeclaration][] +): void { + const predicateName = `isValid${matchingInterface.getName()}`; + + // remove existing instances + findExisting(predicateName, SyntaxKind.FunctionDeclaration, allFunctionDeclarations).forEach(node => node.remove()); + + sourceFile.addStatements(` +/** + * Returns true if value is a valid ${matchingInterface.getName()}. This checks the type against the json schema for the message and will be slower + */ +export function ${predicateName}(value: any): value is ${matchingInterface.getName()} { + try{ + Convert.${func.getName()}(value); + return true; + } catch(_e: any){ + return false; + } +}`); +} + +/** + * Writes a type predicate for the given interface checking just the value of the type property + * @param matchingInterface + * @param func + */ +function writeFastPredicate( + matchingInterface: InterfaceDeclaration, + allFunctionDeclarations: KindToNodeMappings[SyntaxKind.FunctionDeclaration][] +): void { + const predicateName = `is${matchingInterface.getName()}`; + + // remove existing instances + findExisting(predicateName, SyntaxKind.FunctionDeclaration, allFunctionDeclarations).forEach(node => node.remove()); + + const typePropertyValue = extractTypePropertyValue(matchingInterface); + + if (typePropertyValue == null) { + return; + } + + sourceFile.addStatements(` +/** + * Returns true if the value has a type property with value '${typePropertyValue}'. This is a fast check that does not check the format of the message + */ +export function ${predicateName}(value: any): value is ${matchingInterface.getName()} { + return value != null && value.type === '${typePropertyValue}'; +}`); +} + +function writeTypeConstant(matchingInterface: InterfaceDeclaration): void { + const constantName = `${matchingInterface + .getName() + .replaceAll(/([A-Z])/g, '_$1') + .toUpperCase() + .substring(1)}_TYPE`; + + //remove existing + findExisting(constantName, SyntaxKind.VariableStatement).forEach(node => node.remove()); + + sourceFile.addStatements(` + export const ${matchingInterface + .getName() + .replaceAll(/([A-Z])/g, '_$1') + .toUpperCase() + .substring(1)}_TYPE = "${matchingInterface.getName()}";`); +} + +/** + * Writes a union type of all the interfaces that have a type property that extends the type values passed in. + * For example: + * export type RequestMessage = AddContextListenerRequest | AddEventListenerRequest ... + * @param unionName + * @param interfaces + * @param typeValues + */ +function writeUnionType(unionName: string, typeValues: string[]): void { + // generate interfaces list again as we may have just removed some + const unionInterfaces = sourceFile.getChildrenOfKind(SyntaxKind.InterfaceDeclaration); + + // look for interfaces that have a type property that extends one of the values in typeValues + const matchingInterfaces = unionInterfaces.filter(currentInterface => { + const typePropertyValue = extractTypePropertyValue(currentInterface); + + return typeValues.some(typeValue => typeValue === typePropertyValue); + }); + + //remove existing Type + findExisting(unionName, SyntaxKind.InterfaceDeclaration).forEach(node => node.remove()); + + sourceFile.addStatements(` + export type ${unionName} = ${matchingInterfaces.map(match => match.getName()).join(' | ')}; `); +} + +/** + * Extract the type string constant from an interface such as + * interface ExampleMessage{ + * type: "stringConstant"; + * } + * @param parentInterface + * @returns + */ +function extractTypePropertyValue(parentInterface: InterfaceDeclaration): string | undefined { + const typeProperty = parentInterface.getChildrenOfKind(SyntaxKind.PropertySignature).filter(propertySignature => { + return ( + propertySignature.getChildrenOfKind(SyntaxKind.Identifier).find(identifier => identifier.getText() === 'type') != + null + ); + })[0]; + + return typeProperty?.getDescendantsOfKind(SyntaxKind.StringLiteral).map(literal => literal.getLiteralText())[0]; +} + +/** + * Type predicate to test that value is defined + */ +function isDefined(value: T | null | undefined): value is T { + return value != null; +} diff --git a/packages/fdc3-schema/eslint.config.mjs b/packages/fdc3-schema/eslint.config.mjs new file mode 100644 index 000000000..2547c0fed --- /dev/null +++ b/packages/fdc3-schema/eslint.config.mjs @@ -0,0 +1,67 @@ +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import jsxA11Y from 'eslint-plugin-jsx-a11y'; +import globals from 'globals'; +import tsParser from '@typescript-eslint/parser'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import js from '@eslint/js'; +import { FlatCompat } from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + ...compat.extends( + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier' + ), + { + files: ['**/*.ts', '**/*.tsx'], + + plugins: { + '@typescript-eslint': typescriptEslint, + 'jsx-a11y': jsxA11Y, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.jest, + }, + + parser: tsParser, + ecmaVersion: 5, + sourceType: 'script', + + parserOptions: { + project: ['./tsconfig.json'], + }, + }, + + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'warn', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-object-type': [ + 'error', + { + allowInterfaces: 'always', + }, + ], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + }, + }, +]; diff --git a/packages/fdc3-schema/generated/api/BrowserTypes.ts b/packages/fdc3-schema/generated/api/BrowserTypes.ts new file mode 100644 index 000000000..0cafd8d6c --- /dev/null +++ b/packages/fdc3-schema/generated/api/BrowserTypes.ts @@ -0,0 +1,7912 @@ +// To parse this data: +// +// import { Convert, AddContextListenerRequest, AddContextListenerResponse, AddEventListenerRequest, AddEventListenerResponse, AddIntentListenerRequest, AddIntentListenerResponse, AgentEventMessage, AgentResponseMessage, AppRequestMessage, BroadcastEvent, BroadcastRequest, BroadcastResponse, ChannelChangedEvent, ContextListenerUnsubscribeRequest, ContextListenerUnsubscribeResponse, CreatePrivateChannelRequest, CreatePrivateChannelResponse, EventListenerUnsubscribeRequest, EventListenerUnsubscribeResponse, Fdc3UserInterfaceChannels, Fdc3UserInterfaceChannelSelected, Fdc3UserInterfaceDrag, Fdc3UserInterfaceHandshake, Fdc3UserInterfaceHello, Fdc3UserInterfaceMessage, Fdc3UserInterfaceResolve, Fdc3UserInterfaceResolveAction, Fdc3UserInterfaceRestyle, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, GetCurrentChannelRequest, GetCurrentChannelResponse, GetCurrentContextRequest, GetCurrentContextResponse, GetInfoRequest, GetInfoResponse, GetOrCreateChannelRequest, GetOrCreateChannelResponse, GetUserChannelsRequest, GetUserChannelsResponse, HeartbeatAcknowledgementRequest, HeartbeatEvent, IntentEvent, IntentListenerUnsubscribeRequest, IntentListenerUnsubscribeResponse, IntentResultRequest, IntentResultResponse, JoinUserChannelRequest, JoinUserChannelResponse, LeaveCurrentChannelRequest, LeaveCurrentChannelResponse, OpenRequest, OpenResponse, PrivateChannelAddEventListenerRequest, PrivateChannelAddEventListenerResponse, PrivateChannelDisconnectRequest, PrivateChannelDisconnectResponse, PrivateChannelOnAddContextListenerEvent, PrivateChannelOnDisconnectEvent, PrivateChannelOnUnsubscribeEvent, PrivateChannelUnsubscribeEventListenerRequest, PrivateChannelUnsubscribeEventListenerResponse, RaiseIntentForContextRequest, RaiseIntentForContextResponse, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, WebConnectionProtocol1Hello, WebConnectionProtocol2LoadURL, WebConnectionProtocol3Handshake, WebConnectionProtocol4ValidateAppIdentity, WebConnectionProtocol5ValidateAppIdentityFailedResponse, WebConnectionProtocol5ValidateAppIdentitySuccessResponse, WebConnectionProtocol6Goodbye, WebConnectionProtocolMessage } from "./file"; +// +// const addContextListenerRequest = Convert.toAddContextListenerRequest(json); +// const addContextListenerResponse = Convert.toAddContextListenerResponse(json); +// const addEventListenerRequest = Convert.toAddEventListenerRequest(json); +// const addEventListenerResponse = Convert.toAddEventListenerResponse(json); +// const addIntentListenerRequest = Convert.toAddIntentListenerRequest(json); +// const addIntentListenerResponse = Convert.toAddIntentListenerResponse(json); +// const agentEventMessage = Convert.toAgentEventMessage(json); +// const agentResponseMessage = Convert.toAgentResponseMessage(json); +// const appRequestMessage = Convert.toAppRequestMessage(json); +// const broadcastEvent = Convert.toBroadcastEvent(json); +// const broadcastRequest = Convert.toBroadcastRequest(json); +// const broadcastResponse = Convert.toBroadcastResponse(json); +// const channelChangedEvent = Convert.toChannelChangedEvent(json); +// const contextListenerUnsubscribeRequest = Convert.toContextListenerUnsubscribeRequest(json); +// const contextListenerUnsubscribeResponse = Convert.toContextListenerUnsubscribeResponse(json); +// const createPrivateChannelRequest = Convert.toCreatePrivateChannelRequest(json); +// const createPrivateChannelResponse = Convert.toCreatePrivateChannelResponse(json); +// const eventListenerUnsubscribeRequest = Convert.toEventListenerUnsubscribeRequest(json); +// const eventListenerUnsubscribeResponse = Convert.toEventListenerUnsubscribeResponse(json); +// const fdc3UserInterfaceChannels = Convert.toFdc3UserInterfaceChannels(json); +// const fdc3UserInterfaceChannelSelected = Convert.toFdc3UserInterfaceChannelSelected(json); +// const fdc3UserInterfaceDrag = Convert.toFdc3UserInterfaceDrag(json); +// const fdc3UserInterfaceHandshake = Convert.toFdc3UserInterfaceHandshake(json); +// const fdc3UserInterfaceHello = Convert.toFdc3UserInterfaceHello(json); +// const fdc3UserInterfaceMessage = Convert.toFdc3UserInterfaceMessage(json); +// const fdc3UserInterfaceResolve = Convert.toFdc3UserInterfaceResolve(json); +// const fdc3UserInterfaceResolveAction = Convert.toFdc3UserInterfaceResolveAction(json); +// const fdc3UserInterfaceRestyle = Convert.toFdc3UserInterfaceRestyle(json); +// const findInstancesRequest = Convert.toFindInstancesRequest(json); +// const findInstancesResponse = Convert.toFindInstancesResponse(json); +// const findIntentRequest = Convert.toFindIntentRequest(json); +// const findIntentResponse = Convert.toFindIntentResponse(json); +// const findIntentsByContextRequest = Convert.toFindIntentsByContextRequest(json); +// const findIntentsByContextResponse = Convert.toFindIntentsByContextResponse(json); +// const getAppMetadataRequest = Convert.toGetAppMetadataRequest(json); +// const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); +// const getCurrentChannelRequest = Convert.toGetCurrentChannelRequest(json); +// const getCurrentChannelResponse = Convert.toGetCurrentChannelResponse(json); +// const getCurrentContextRequest = Convert.toGetCurrentContextRequest(json); +// const getCurrentContextResponse = Convert.toGetCurrentContextResponse(json); +// const getInfoRequest = Convert.toGetInfoRequest(json); +// const getInfoResponse = Convert.toGetInfoResponse(json); +// const getOrCreateChannelRequest = Convert.toGetOrCreateChannelRequest(json); +// const getOrCreateChannelResponse = Convert.toGetOrCreateChannelResponse(json); +// const getUserChannelsRequest = Convert.toGetUserChannelsRequest(json); +// const getUserChannelsResponse = Convert.toGetUserChannelsResponse(json); +// const heartbeatAcknowledgementRequest = Convert.toHeartbeatAcknowledgementRequest(json); +// const heartbeatEvent = Convert.toHeartbeatEvent(json); +// const intentEvent = Convert.toIntentEvent(json); +// const intentListenerUnsubscribeRequest = Convert.toIntentListenerUnsubscribeRequest(json); +// const intentListenerUnsubscribeResponse = Convert.toIntentListenerUnsubscribeResponse(json); +// const intentResultRequest = Convert.toIntentResultRequest(json); +// const intentResultResponse = Convert.toIntentResultResponse(json); +// const joinUserChannelRequest = Convert.toJoinUserChannelRequest(json); +// const joinUserChannelResponse = Convert.toJoinUserChannelResponse(json); +// const leaveCurrentChannelRequest = Convert.toLeaveCurrentChannelRequest(json); +// const leaveCurrentChannelResponse = Convert.toLeaveCurrentChannelResponse(json); +// const openRequest = Convert.toOpenRequest(json); +// const openResponse = Convert.toOpenResponse(json); +// const privateChannelAddEventListenerRequest = Convert.toPrivateChannelAddEventListenerRequest(json); +// const privateChannelAddEventListenerResponse = Convert.toPrivateChannelAddEventListenerResponse(json); +// const privateChannelDisconnectRequest = Convert.toPrivateChannelDisconnectRequest(json); +// const privateChannelDisconnectResponse = Convert.toPrivateChannelDisconnectResponse(json); +// const privateChannelOnAddContextListenerEvent = Convert.toPrivateChannelOnAddContextListenerEvent(json); +// const privateChannelOnDisconnectEvent = Convert.toPrivateChannelOnDisconnectEvent(json); +// const privateChannelOnUnsubscribeEvent = Convert.toPrivateChannelOnUnsubscribeEvent(json); +// const privateChannelUnsubscribeEventListenerRequest = Convert.toPrivateChannelUnsubscribeEventListenerRequest(json); +// const privateChannelUnsubscribeEventListenerResponse = Convert.toPrivateChannelUnsubscribeEventListenerResponse(json); +// const raiseIntentForContextRequest = Convert.toRaiseIntentForContextRequest(json); +// const raiseIntentForContextResponse = Convert.toRaiseIntentForContextResponse(json); +// const raiseIntentRequest = Convert.toRaiseIntentRequest(json); +// const raiseIntentResponse = Convert.toRaiseIntentResponse(json); +// const raiseIntentResultResponse = Convert.toRaiseIntentResultResponse(json); +// const webConnectionProtocol1Hello = Convert.toWebConnectionProtocol1Hello(json); +// const webConnectionProtocol2LoadURL = Convert.toWebConnectionProtocol2LoadURL(json); +// const webConnectionProtocol3Handshake = Convert.toWebConnectionProtocol3Handshake(json); +// const webConnectionProtocol4ValidateAppIdentity = Convert.toWebConnectionProtocol4ValidateAppIdentity(json); +// const webConnectionProtocol5ValidateAppIdentityFailedResponse = Convert.toWebConnectionProtocol5ValidateAppIdentityFailedResponse(json); +// const webConnectionProtocol5ValidateAppIdentitySuccessResponse = Convert.toWebConnectionProtocol5ValidateAppIdentitySuccessResponse(json); +// const webConnectionProtocol6Goodbye = Convert.toWebConnectionProtocol6Goodbye(json); +// const webConnectionProtocolMessage = Convert.toWebConnectionProtocolMessage(json); +// +// These functions will throw an error if the JSON doesn't +// match the expected interface, even if the JSON is valid. + +/** + * A request to add a context listener to a specified Channel OR to the current user + * channel. Where the listener is added to the current user channel (channelId == null), and + * this app has already been added to a user channel, client code should make a subsequent + * request to get the current context of that channel for this listener and then call its + * handler with it. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface AddContextListenerRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: AddContextListenerRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'addContextListenerRequest'; +} + +/** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ +export interface AddContextListenerRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that a request or response was received + * from. Please note that this may be set by an app or Desktop Agent proxy for debugging + * purposes but a Desktop Agent should make its own determination of the source of a message + * to avoid spoofing. + */ + source?: AppIdentifier; + timestamp: Date; +} + +/** + * Field that represents the source application that a request or response was received + * from. Please note that this may be set by an app or Desktop Agent proxy for debugging + * purposes but a Desktop Agent should make its own determination of the source of a message + * to avoid spoofing. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that the request being responded to was + * received from, for debugging purposes. + * + * Details of the application instance that broadcast the context. + * + * The App resolution option chosen. + * + * Details of the application instance that raised the intent. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface AddContextListenerRequestPayload { + /** + * The id of the channel to add the listener to or `null` indicating that it should listen + * to the current user channel (at the time of broadcast). + */ + channelId: null | string; + /** + * The type of context to listen for OR `null` indicating that it should listen to all + * context types. + */ + contextType: null | string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a addContextListener request. Where the listener was added to the current + * user channel (channelId == null), and this app has already been added to a user channel, + * client code should make a subsequent request to get the current context of that channel + * for this listener and then call its handler with it. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface AddContextListenerResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: AddContextListenerResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'addContextListenerResponse'; +} + +/** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ +export interface AddContextListenerResponseMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application that the request being responded to was + * received from, for debugging purposes. + */ + source?: AppIdentifier; + timestamp: Date; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface AddContextListenerResponsePayload { + error?: PurpleError; + listenerUUID?: string; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type PurpleError = 'AccessDenied' | 'CreationFailed' | 'MalformedContext' | 'NoChannelFound' | 'ApiTimeout'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to add an event listener for a specified event type to the Desktop Agent. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface AddEventListenerRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: AddEventListenerRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'addEventListenerRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface AddEventListenerRequestPayload { + /** + * The type of the event to be listened to or `null` to listen to all event types. + */ + type: 'USER_CHANNEL_CHANGED' | null; +} + +/** + * The type of a (non-context and non-intent) event that may be received via the FDC3 API's + * addEventListener function. + */ + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to an addEventListener request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface AddEventListenerResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: AddEventListenerResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'addEventListenerResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface AddEventListenerResponsePayload { + error?: ResponsePayloadError; + listenerUUID?: string; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type ResponsePayloadError = + | 'AccessDenied' + | 'CreationFailed' + | 'MalformedContext' + | 'NoChannelFound' + | 'ApiTimeout' + | 'AppNotFound' + | 'AppTimeout' + | 'DesktopAgentNotFound' + | 'ErrorOnLaunch' + | 'ResolverUnavailable' + | 'IntentDeliveryFailed' + | 'NoAppsFound' + | 'ResolverTimeout' + | 'TargetAppUnavailable' + | 'TargetInstanceUnavailable' + | 'UserCancelledResolution' + | 'IntentHandlerRejected' + | 'NoResultReturned' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to add an Intent listener for a specified intent type. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface AddIntentListenerRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: AddIntentListenerRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'addIntentListenerRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface AddIntentListenerRequestPayload { + /** + * The name of the intent to listen for. + */ + intent: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a addIntentListener request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface AddIntentListenerResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: PayloadObject; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'addIntentListenerResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface PayloadObject { + error?: FluffyError; + listenerUUID?: string; + [property: string]: any; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type FluffyError = + | 'MalformedContext' + | 'ApiTimeout' + | 'DesktopAgentNotFound' + | 'ResolverUnavailable' + | 'IntentDeliveryFailed' + | 'NoAppsFound' + | 'ResolverTimeout' + | 'TargetAppUnavailable' + | 'TargetInstanceUnavailable' + | 'UserCancelledResolution'; + +/** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ +export interface AgentEventMessageMeta { + eventUuid: string; + timestamp: Date; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ +export type EventMessageType = + | 'addEventListenerEvent' + | 'broadcastEvent' + | 'channelChangedEvent' + | 'heartbeatEvent' + | 'intentEvent' + | 'privateChannelOnAddContextListenerEvent' + | 'privateChannelOnDisconnectEvent' + | 'privateChannelOnUnsubscribeEvent'; + +/** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ +export interface AgentResponseMessageMeta { + requestUuid: string; + responseUuid: string; + /** + * Field that represents the source application that the request being responded to was + * received from, for debugging purposes. + */ + source?: AppIdentifier; + timestamp: Date; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface AgentResponseMessageResponsePayload { + error?: ResponsePayloadError; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ +export type ResponseMessageType = + | 'addContextListenerResponse' + | 'addEventListenerResponse' + | 'addIntentListenerResponse' + | 'broadcastResponse' + | 'contextListenerUnsubscribeResponse' + | 'createPrivateChannelResponse' + | 'eventListenerUnsubscribeResponse' + | 'findInstancesResponse' + | 'findIntentResponse' + | 'findIntentsByContextResponse' + | 'getAppMetadataResponse' + | 'getCurrentChannelResponse' + | 'getCurrentContextResponse' + | 'getInfoResponse' + | 'getOrCreateChannelResponse' + | 'getUserChannelsResponse' + | 'intentListenerUnsubscribeResponse' + | 'intentResultResponse' + | 'joinUserChannelResponse' + | 'leaveCurrentChannelResponse' + | 'openResponse' + | 'privateChannelAddEventListenerResponse' + | 'privateChannelDisconnectResponse' + | 'privateChannelUnsubscribeEventListenerResponse' + | 'raiseIntentForContextResponse' + | 'raiseIntentResponse' + | 'raiseIntentResultResponse'; + +/** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ +export interface AppRequestMessageMeta { + requestUuid: string; + /** + * Field that represents the source application that a request or response was received + * from. Please note that this may be set by an app or Desktop Agent proxy for debugging + * purposes but a Desktop Agent should make its own determination of the source of a message + * to avoid spoofing. + */ + source?: AppIdentifier; + timestamp: Date; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ +export type RequestMessageType = + | 'addContextListenerRequest' + | 'addEventListenerRequest' + | 'addIntentListenerRequest' + | 'broadcastRequest' + | 'contextListenerUnsubscribeRequest' + | 'createPrivateChannelRequest' + | 'eventListenerUnsubscribeRequest' + | 'findInstancesRequest' + | 'findIntentRequest' + | 'findIntentsByContextRequest' + | 'getAppMetadataRequest' + | 'getCurrentChannelRequest' + | 'getCurrentContextRequest' + | 'getInfoRequest' + | 'getOrCreateChannelRequest' + | 'getUserChannelsRequest' + | 'heartbeatAcknowledgementRequest' + | 'intentListenerUnsubscribeRequest' + | 'intentResultRequest' + | 'joinUserChannelRequest' + | 'leaveCurrentChannelRequest' + | 'openRequest' + | 'privateChannelAddEventListenerRequest' + | 'privateChannelDisconnectRequest' + | 'privateChannelUnsubscribeEventListenerRequest' + | 'raiseIntentForContextRequest' + | 'raiseIntentRequest'; + +/** + * An event message from the Desktop Agent to an app indicating that context has been + * broadcast on a channel it is listening to, or specifically to this app instance if it was + * launched via `fdc3.open` and context was passed. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface BroadcastEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: BroadcastEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'broadcastEvent'; +} + +/** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ +export interface BroadcastEventMeta { + eventUuid: string; + timestamp: Date; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface BroadcastEventPayload { + /** + * The Id of the channel that the broadcast was sent on. May be `null` if the context is + * being broadcast due to a call `fdc3.open` that passed context. + */ + channelId: null | string; + /** + * The context object that was broadcast. + */ + context: Context; + /** + * Details of the application instance that broadcast the context. + */ + originatingApp?: AppIdentifier; +} + +/** + * The context object that was broadcast. + * + * The context object that is to be broadcast. + * + * The context object passed with the raised intent. + * + * If a Context object is passed in, this object will be provided to the opened application + * via a contextListener. The Context argument is functionally equivalent to opening the + * target app with no context and broadcasting the context directly to it. + * + * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by + * FDC3 operations. As such, it is not really meant to be used on its own, but is imported + * by more specific type definitions (standardized or custom) to provide the structure and + * properties shared by all FDC3 context data types. + * + * The key element of FDC3 context types is their mandatory `type` property, which is used + * to identify what type of data the object represents, and what shape it has. + * + * The FDC3 context type, and all derived types, define the minimum set of fields a context + * data object of a particular type can be expected to have, but this can always be extended + * with custom fields as appropriate. + */ +export interface Context { + /** + * Context data objects may include a set of equivalent key-value pairs that can be used to + * help applications identify and look up the context type they receive in their own domain. + * The idea behind this design is that applications can provide as many equivalent + * identifiers to a target application as possible, e.g. an instrument may be represented by + * an ISIN, CUSIP or Bloomberg identifier. + * + * Identifiers do not make sense for all types of data, so the `id` property is therefore + * optional, but some derived types may choose to require at least one identifier. + * Identifier values SHOULD always be of type string. + */ + id?: { [key: string]: any }; + /** + * Context data objects may include a name property that can be used for more information, + * or display purposes. Some derived types may require the name object as mandatory, + * depending on use case. + */ + name?: string; + /** + * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 + * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present + * to route shared context data appropriately. + * + * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data + * types they support in an FDC3 [App + * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery + * and routing. + * + * Standardized FDC3 context types have well-known `type` properties prefixed with the + * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and + * used by a particular organization, the convention is to prefix them with an + * organization-specific namespace, e.g. `blackrock.fund`. + * + * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more + * information about context data types. + */ + type: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to broadcast context on a channel. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface BroadcastRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: BroadcastRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'broadcastRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastRequestPayload { + /** + * The Id of the Channel that the broadcast was sent on. + */ + channelId: string; + /** + * The context object that is to be broadcast. + */ + context: Context; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a request to broadcast context on a channel. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface BroadcastResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'broadcastResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface BroadcastResponseResponsePayload { + error?: ResponsePayloadError; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * An event message from the Desktop Agent to an app indicating that its current user + * channel has changed. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface ChannelChangedEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: ChannelChangedEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'channelChangedEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface ChannelChangedEventPayload { + /** + * The Id of the channel that the app was added to or `null` if it was removed from a + * channel. + */ + newChannelId: null | string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to unsubscribe a context listener. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface ContextListenerUnsubscribeRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: ContextListenerUnsubscribeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'contextListenerUnsubscribeRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface ContextListenerUnsubscribeRequestPayload { + listenerUUID: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a contextListenerUnsubscribe request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface ContextListenerUnsubscribeResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'contextListenerUnsubscribeResponse'; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to return a Channel with an auto-generated identity that is intended for private + * communication between applications. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface CreatePrivateChannelRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: CreatePrivateChannelRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'createPrivateChannelRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface CreatePrivateChannelRequestPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a createPrivateChannel request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface CreatePrivateChannelResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: CreatePrivateChannelResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'createPrivateChannelResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface CreatePrivateChannelResponsePayload { + error?: PurpleError; + privateChannel?: Channel; +} + +/** + * Represents a context channel that applications can use to send and receive + * context data. + * + * Please note that There are differences in behavior when you interact with a + * User channel via the `DesktopAgent` interface and the `Channel` interface. + * Specifically, when 'joining' a User channel or adding a context listener + * when already joined to a channel via the `DesktopAgent` interface, existing + * context (matching the type of the context listener) on the channel is + * received by the context listener immediately. Whereas, when a context + * listener is added via the Channel interface, context is not received + * automatically, but may be retrieved manually via the `getCurrentContext()` + * function. + */ +export interface Channel { + /** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + */ + displayMetadata?: DisplayMetadata; + /** + * Constant that uniquely identifies this channel. + */ + id: string; + /** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ + type: Type; +} + +/** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + * + * A system channel will be global enough to have a presence across many apps. This gives us + * some hints + * to render them in a standard way. It is assumed it may have other properties too, but if + * it has these, + * this is their meaning. + */ +export interface DisplayMetadata { + /** + * The color that should be associated within this channel when displaying this channel in a + * UI, e.g: `0xFF0000`. + */ + color?: string; + /** + * A URL of an image that can be used to display this channel. + */ + glyph?: string; + /** + * A user-readable name for this channel, e.g: `"Red"`. + */ + name?: string; +} + +/** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ +export type Type = 'app' | 'private' | 'user'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to unsubscribe an event listener. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface EventListenerUnsubscribeRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: EventListenerUnsubscribeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'eventListenerUnsubscribeRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface EventListenerUnsubscribeRequestPayload { + listenerUUID: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to an eventListenerUnsubscribe request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface EventListenerUnsubscribeResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'eventListenerUnsubscribeResponse'; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Setup message sent by the DA proxy code in getAgent() to a channel selector UI in an + * iframe with the channel definitions and current channel selection. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceChannels { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceChannelsPayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceChannels'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceChannelsPayload { + /** + * The id of the channel that should be currently selected, or `null` if none should be + * selected. + */ + selected: null | string; + /** + * User Channel definitions.```````s + */ + userChannels: Channel[]; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Message from a channel selector UI to the DA proxy sent when the channel selection + * changes. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceChannelSelected { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceChannelSelectedPayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceChannelSelected'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceChannelSelectedPayload { + /** + * The id of the channel that should be currently selected, or `null` if none should be + * selected. + */ + selected: null | string; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Message from a UI iframe to the DA proxy (setup by `getAgent()`) indicating that the user + * is dragging the UI to a new location and providing the offset to apply to the location. + * The DA proxy implementation should limit the location to the current bounds of the + * window's viewport. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceDrag { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceDragPayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceDrag'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceDragPayload { + /** + * The offset to move the frame by. + */ + mouseOffsets: MouseOffsets; +} + +/** + * The offset to move the frame by. + */ +export interface MouseOffsets { + x: number; + y: number; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Handshake message sent back to a user interface from the DA proxy code (setup by + * `getAgent()`) over the `MessagePort` provided in the preceding Fdc3UserInterfaceHello + * message, confirming that it is listening to the `MessagePort` for further communication. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceHandshake { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceHandshakePayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceHandshake'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceHandshakePayload { + /** + * The version of FDC3 API that the Desktop Agent will provide support for. + */ + fdc3Version: string; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Hello message sent by a UI to the Desktop Agent proxy setup by `getAgent()` to indicate + * it is ready to communicate, containing initial CSS to set on the iframe, and including an + * appended `MessagePort` to be used for further communication. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceHello { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceHelloPayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceHello'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceHelloPayload { + /** + * Details about the UI implementation, such as vendor and version, for logging purposes. + */ + implementationDetails: string; + /** + * A constrained set of styling properties that should be set on the user interface before + * it is displayed. Note `position` cannot be specified and should always be set to `fixed`. + */ + initialCSS: InitialCSS; +} + +/** + * A constrained set of styling properties that should be set on the user interface before + * it is displayed. Note `position` cannot be specified and should always be set to `fixed`. + */ +export interface InitialCSS { + /** + * The initial bottom property to apply to the iframe. + */ + bottom?: string; + /** + * The initial height of the iframe. + */ + height?: string; + /** + * The initial left property to apply to the iframe. + */ + left?: string; + /** + * The maximum height to apply to the iframe. + */ + maxHeight?: string; + /** + * The maximum with to apply to the iframe. + */ + maxWidth?: string; + /** + * The initial right property to apply to the iframe. + */ + right?: string; + /** + * The initial top property to apply to the iframe. + */ + top?: string; + /** + * The transition property to apply to the iframe. + */ + transition?: string; + /** + * The initial width of the iframe. + */ + width?: string; + /** + * The initial zindex to apply to the iframe. + */ + zIndex?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceMessage { + /** + * The message payload. + */ + payload?: { [key: string]: any }; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: Fdc3UserInterfaceMessageType; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ +export type Fdc3UserInterfaceMessageType = + | 'Fdc3UserInterfaceHello' + | 'Fdc3UserInterfaceHandshake' + | 'Fdc3UserInterfaceRestyle' + | 'Fdc3UserInterfaceDrag' + | 'Fdc3UserInterfaceResolve' + | 'Fdc3UserInterfaceResolveAction' + | 'Fdc3UserInterfaceChannels' + | 'Fdc3UserInterfaceChannelSelected'; + +/** + * Setup message sent by the DA proxy code in getAgent() to an intent resolver UI with the + * resolver data to setup the UI. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceResolve { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceResolvePayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceResolve'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceResolvePayload { + /** + * An array of AppIntent objects defining the resolution options. + */ + appIntents: AppIntent[]; + context: Context; +} + +/** + * An interface that relates an intent to apps. + * + * Used if a raiseIntent request requires additional resolution (e.g. by showing an intent + * resolver) before it can be handled. + */ +export interface AppIntent { + /** + * Details of applications that can resolve the intent. + */ + apps: AppMetadata[]; + /** + * Details of the intent whose relationship to resolving applications is being described. + */ + intent: IntentMetadata; +} + +/** + * Extends an `AppIdentifier`, describing an application or instance of an application, with + * additional descriptive metadata that is usually provided by an FDC3 App Directory that + * the Desktop Agent connects to. + * + * The additional information from an app directory can aid in rendering UI elements, such + * as a launcher menu or resolver UI. This includes a title, description, tooltip and icon + * and screenshot URLs. + * + * Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the + * `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc. + * + * The calling application instance's own metadata, according to the Desktop Agent (MUST + * include at least the `appId` and `instanceId`). + */ +export interface AppMetadata { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * A longer, multi-paragraph description for the application that could include markup. + */ + description?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * A list of icon URLs for the application that can be used to render UI elements. + */ + icons?: Icon[]; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + /** + * An optional set of, implementation specific, metadata fields that can be used to + * disambiguate instances, such as a window title or screen position. Must only be set if + * `instanceId` is set. + */ + instanceMetadata?: { [key: string]: any }; + /** + * The 'friendly' app name. + * This field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now + * require an `AppIdentifier` wth `appId` set. + * Note that for display purposes the `title` field should be used, if set, in preference to + * this field. + */ + name?: string; + /** + * The type of output returned for any intent specified during resolution. May express a + * particular context type (e.g. "fdc3.instrument"), channel (e.g. "channel") or a channel + * that will receive a specified type (e.g. "channel"). + */ + resultType?: null | string; + /** + * Images representing the app in common usage scenarios that can be used to render UI + * elements. + */ + screenshots?: Image[]; + /** + * A more user-friendly application title that can be used to render UI elements. + */ + title?: string; + /** + * A tooltip for the application that can be used to render UI elements. + */ + tooltip?: string; + /** + * The Version of the application. + */ + version?: string; +} + +/** + * Describes an Icon image that may be used to represent the application. + */ +export interface Icon { + /** + * The icon dimension, formatted as `x`. + */ + size?: string; + /** + * The icon url. + */ + src: string; + /** + * Icon media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; +} + +/** + * Describes an image file, typically a screenshot, that often represents the application in + * a common usage scenario. + */ +export interface Image { + /** + * Caption for the image. + */ + label?: string; + /** + * The image dimension, formatted as `x`. + */ + size?: string; + /** + * The image url. + */ + src: string; + /** + * Image media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; +} + +/** + * Details of the intent whose relationship to resolving applications is being described. + * + * Metadata describing an Intent. + */ +export interface IntentMetadata { + /** + * Display name for the intent. + */ + displayName?: string; + /** + * The unique name of the intent that can be invoked by the raiseIntent call. + */ + name: string; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Message from an intent resolver UI to DA proxy code in getAgent() reporting a user + * action. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceResolveAction { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceResolveActionPayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceResolveAction'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceResolveActionPayload { + action: Action; + /** + * The App resolution option chosen. + */ + appIdentifier?: AppIdentifier; + /** + * The intent resolved. + */ + intent?: string; +} + +export type Action = 'hover' | 'click' | 'cancel'; + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * Message from a UI frame to the DA proxy code (setup by `getAgent()`) with updated styling + * information to apply to it. Can be used to implement a pop-open or close interaction or + * other transition needed by a UI implementation. + * + * A message used to communicate with user interface frames injected by `getAgent()` for + * displaying UI elements such as the intent resolver or channel selector. Used for messages + * sent in either direction. + */ +export interface Fdc3UserInterfaceRestyle { + /** + * The message payload. + */ + payload: Fdc3UserInterfaceRestylePayload; + /** + * Identifies the type of the message to or from the user interface frame. + */ + type: 'Fdc3UserInterfaceRestyle'; +} + +/** + * The message payload. + */ +export interface Fdc3UserInterfaceRestylePayload { + /** + * A constrained set of styling properties that should be applied to the frame. Note + * `position` cannot be set, and should always be `fixed`. + */ + updatedCSS: UpdatedCSS; +} + +/** + * A constrained set of styling properties that should be applied to the frame. Note + * `position` cannot be set, and should always be `fixed`. + */ +export interface UpdatedCSS { + /** + * The initial bottom property to apply to the iframe. + */ + bottom?: string; + /** + * The updated height of the iframe. + */ + height?: string; + /** + * The initial left property to apply to the iframe. + */ + left?: string; + /** + * The updated maximum height to apply to the iframe. + */ + maxHeight?: string; + /** + * The updated maximum with to apply to the iframe. + */ + maxWidth?: string; + /** + * The initial right property to apply to the iframe. + */ + right?: string; + /** + * The initial top property to apply to the iframe. + */ + top?: string; + /** + * The updated transition property to apply to the iframe. + */ + transition?: string; + /** + * The updated width of the iframe. + */ + width?: string; + /** + * The updated zIndex to apply to the iframe. + */ + zIndex?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message to or from the user interface frame. + */ + +/** + * A request for details of instances of a particular app. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface FindInstancesRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindInstancesRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findInstancesRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindInstancesRequestPayload { + app: AppIdentifier; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a findInstances request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface FindInstancesResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: FindInstancesResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findInstancesResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + * + * The message payload contains a flag indicating whether the API call was successful, plus + * any return values for the FDC3 API function called, or indicating that the request + * resulted in an error and including a standardized error message. + */ +export interface FindInstancesResponsePayload { + error?: FindInstancesErrors; + appIdentifiers?: AppMetadata[]; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + * + * Unique identifier for a `listener` object returned by a Desktop Agent to an app in + * response to addContextListener, addIntentListener or one of the PrivateChannel event + * listeners and used to identify it in messages (e.g. when unsubscribing). + * + * Unique identifier for an event message sent from a Desktop Agent to an app. + * + * Unique identifier for a for an attempt to connect to a Desktop Agent. A Unique UUID + * should be used in the first (WCP1Hello) message and should be quoted in all subsequent + * messages to link them to the same connection attempt. + * + * Should be set if the raiseIntent request returned an error. + */ +export type FindInstancesErrors = + | 'MalformedContext' + | 'ApiTimeout' + | 'DesktopAgentNotFound' + | 'ResolverUnavailable' + | 'IntentDeliveryFailed' + | 'NoAppsFound' + | 'ResolverTimeout' + | 'TargetAppUnavailable' + | 'TargetInstanceUnavailable' + | 'UserCancelledResolution' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request for details of apps available to resolve a particular intent and context pair. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface FindIntentRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentRequestPayload { + context?: Context; + intent: string; + resultType?: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a findIntent request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface FindIntentResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: FindIntentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface FindIntentResponsePayload { + error?: FindInstancesErrors; + appIntent?: AppIntent; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request for details of intents and apps available to resolve them for a particular + * context. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface FindIntentsByContextRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentsByContextRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentsByContextRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentsByContextRequestPayload { + context: Context; + resultType?: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a findIntentsByContext request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface FindIntentsByContextResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: FindIntentsByContextResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentsByContextResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface FindIntentsByContextResponsePayload { + error?: FindInstancesErrors; + appIntents?: AppIntent[]; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request for metadata about an app. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetAppMetadataRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetAppMetadataRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getAppMetadataRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetAppMetadataRequestPayload { + app: AppIdentifier; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getAppMetadata request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetAppMetadataResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetAppMetadataResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getAppMetadataResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetAppMetadataResponsePayload { + error?: FindInstancesErrors; + appMetadata?: AppMetadata; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to return the Channel object for the current User channel membership. Returns + * `null` if the app is not joined to a channel. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetCurrentChannelRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetCurrentChannelRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getCurrentChannelRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetCurrentChannelRequestPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getCurrentChannel request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetCurrentChannelResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetCurrentChannelResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getCurrentChannelResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetCurrentChannelResponsePayload { + error?: ResponsePayloadError; + channel?: Channel | null; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to return the current context (either of a specified type or most recent + * broadcast) of a specified Channel. Returns `null` if no context (of the requested type if + * one was specified) is available in the channel. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetCurrentContextRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetCurrentContextRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getCurrentContextRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetCurrentContextRequestPayload { + /** + * The id of the channel to return the current context of. + */ + channelId: string; + /** + * The type of context to return for OR `null` indicating that the most recently broadcast + * context on the channel should be returned. + */ + contextType: null | string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getCurrentContext request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetCurrentContextResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetCurrentContextResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getCurrentContextResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetCurrentContextResponsePayload { + error?: PurpleError; + /** + * The most recently broadcast context object (of the specified type, if one was specified), + * or `null` if none was available in the channel. + */ + context?: null | Context; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to retrieve information about the FDC3 Desktop Agent implementation and the + * metadata of the calling application according to the Desktop Agent. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetInfoRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetInfoRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getInfoRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetInfoRequestPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getInfo request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetInfoResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetInfoResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getInfoResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetInfoResponsePayload { + error?: ResponsePayloadError; + implementationMetadata?: ImplementationMetadata; +} + +/** + * Implementation metadata for the Desktop Agent, which includes an appMetadata element + * containing a copy of the app's own metadata. + * + * Includes Metadata for the current application. + * + * Metadata relating to the FDC3 Desktop Agent implementation and its provider. + */ +export interface ImplementationMetadata { + /** + * The calling application instance's own metadata, according to the Desktop Agent (MUST + * include at least the `appId` and `instanceId`). + */ + appMetadata: AppMetadata; + /** + * The version number of the FDC3 specification that the implementation provides. + * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. + */ + fdc3Version: string; + /** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ + optionalFeatures: OptionalFeatures; + /** + * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, + * OpenFin etc.). + */ + provider: string; + /** + * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). + */ + providerVersion?: string; +} + +/** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ +export interface OptionalFeatures { + /** + * Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent. + */ + DesktopAgentBridging: boolean; + /** + * Used to indicate whether the exposure of 'originating app metadata' for + * context and intent messages is supported by the Desktop Agent. + */ + OriginatingAppMetadata: boolean; + /** + * Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent. + */ + UserChannelMembershipAPIs: boolean; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to return a Channel with an auto-generated identity that is intended for private + * communication between applications. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetOrCreateChannelRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetOrCreateChannelRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getOrCreateChannelRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetOrCreateChannelRequestPayload { + /** + * The id of the channel to return + */ + channelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getOrCreateChannel request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetOrCreateChannelResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetOrCreateChannelResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getOrCreateChannelResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetOrCreateChannelResponsePayload { + error?: PurpleError; + channel?: Channel; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to retrieve a list of the User Channels available for the app to join. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface GetUserChannelsRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetUserChannelsRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getUserChannelsRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetUserChannelsRequestPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a getUserChannels request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface GetUserChannelsResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: GetUserChannelsResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getUserChannelsResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface GetUserChannelsResponsePayload { + error?: PurpleError; + userChannels?: Channel[]; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request that serves as an acknowledgement of a heartbeat event from the Desktop Agent + * and indicates that an application window or frame is still alive. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface HeartbeatAcknowledgementRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: HeartbeatAcknowledgementRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'heartbeatAcknowledgementRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface HeartbeatAcknowledgementRequestPayload { + /** + * The eventUuid value of the HeartbeatEvent that the acknowledgement being sent relates to. + */ + heartbeatEventUuid: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A heartbeat message from the Desktop Agent to an app indicating that the Desktop Agent is + * alive and that the application should send a heartbeatResponseRequest to the agent in + * response. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface HeartbeatEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: HeartbeatEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'heartbeatEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface HeartbeatEventPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * An event message from the Desktop Agent to an app indicating that it has been selected to + * resolve a raised intent and context. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface IntentEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: IntentEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'intentEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface IntentEventPayload { + /** + * The context object passed with the raised intent. + */ + context: Context; + /** + * The intent that was raised. + */ + intent: string; + /** + * Details of the application instance that raised the intent. + */ + originatingApp?: AppIdentifier; + /** + * The requestUuid value of the raiseIntentRequest that the intentEvent being sent relates + * to. + */ + raiseIntentRequestUuid: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to unsubscribe a context listener. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface IntentListenerUnsubscribeRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: IntentListenerUnsubscribeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'intentListenerUnsubscribeRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface IntentListenerUnsubscribeRequestPayload { + listenerUUID: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a intentListenerUnsubscribe request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface IntentListenerUnsubscribeResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'intentListenerUnsubscribeResponse'; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to deliver a result for an intent (which may include a `void` result that just + * indicates that the handler has run, returning no result). The result is tied to the + * intentEvent it relates to by quoting the `eventUuid` of the intentEvent in its payload. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface IntentResultRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: IntentResultRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'intentResultRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface IntentResultRequestPayload { + /** + * The eventUuid value of the intentEvent that the result being sent relates to. + */ + intentEventUuid: string; + intentResult: IntentResult; + /** + * The requestUuid value of the raiseIntentRequest that the result being sent relates to. + */ + raiseIntentRequestUuid: string; +} + +export interface IntentResult { + context?: Context; + channel?: Channel; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a request to deliver an intent result. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface IntentResultResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'intentResultResponse'; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to join the app to the specified User channel. On successfully joining a channel, + * client code should make subsequent requests to get the current context of that channel + * for all registered context listeners and then call their handlers with it. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface JoinUserChannelRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: JoinUserChannelRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'joinUserChannelRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface JoinUserChannelRequestPayload { + /** + * The id of the channel to join. + */ + channelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a joinUserChannel request. On receipt of this response, client code should + * make subsequent requests to get the current context of that channel for all registered + * context listeners and then call their handlers with it. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface JoinUserChannelResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: JoinUserChannelResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'joinUserChannelResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface JoinUserChannelResponsePayload { + error?: PurpleError; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request to remove the app from any User channel membership. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface LeaveCurrentChannelRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: LeaveCurrentChannelRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'leaveCurrentChannelRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface LeaveCurrentChannelRequestPayload {} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a leaveCurrentChannel request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface LeaveCurrentChannelResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: LeaveCurrentChannelResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'leaveCurrentChannelResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface LeaveCurrentChannelResponsePayload { + error?: PurpleError; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to open an application. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface OpenRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: OpenRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'openRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface OpenRequestPayload { + app: AppIdentifier; + /** + * If a Context object is passed in, this object will be provided to the opened application + * via a contextListener. The Context argument is functionally equivalent to opening the + * target app with no context and broadcasting the context directly to it. + */ + context?: Context; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a open request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface OpenResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: OpenResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'openResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface OpenResponsePayload { + error?: OpenErrorResponsePayload; + appIdentifier?: AppIdentifier; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type OpenErrorResponsePayload = + | 'MalformedContext' + | 'ApiTimeout' + | 'AppNotFound' + | 'AppTimeout' + | 'DesktopAgentNotFound' + | 'ErrorOnLaunch' + | 'ResolverUnavailable' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to add an event listener to a specific PrivateChannel. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface PrivateChannelAddEventListenerRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelAddEventListenerRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'privateChannelAddEventListenerRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelAddEventListenerRequestPayload { + /** + * The type of PrivateChannel event that the listener should be applied to, or null for all + * event types. + */ + listenerType: PrivateChannelEventType | null; + /** + * The Id of the PrivateChannel that the listener should be added to. + */ + privateChannelId: string; +} + +/** + * Type defining valid type strings for Private Channel events. + */ +export type PrivateChannelEventType = 'addContextListener' | 'unsubscribe' | 'disconnect'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a privateChannelAddEventListener request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface PrivateChannelAddEventListenerResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: PrivateChannelAddEventListenerResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelAddEventListenerResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface PrivateChannelAddEventListenerResponsePayload { + error?: PurpleError; + listenerUUID?: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Request that indicates that a participant will no longer interact with a specified + * `PrivateChannel`. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface PrivateChannelDisconnectRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelDisconnectRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'privateChannelDisconnectRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelDisconnectRequestPayload { + /** + * The Id of the Channel that should be disconnected from + */ + channelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a privateChannelDisconnect request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface PrivateChannelDisconnectResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: PrivateChannelDisconnectResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelDisconnectResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface PrivateChannelDisconnectResponsePayload { + error?: PurpleError; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * An event message from the Desktop Agent to an app indicating that another app has added a + * context listener to a specific PrivateChannel. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface PrivateChannelOnAddContextListenerEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: PrivateChannelOnAddContextListenerEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelOnAddContextListenerEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface PrivateChannelOnAddContextListenerEventPayload { + /** + * The type of the context listener added to the channel by another app, or null if it will + * listen to all types. + */ + contextType: null | string; + /** + * The Id of the PrivateChannel that the listener was added to. + */ + privateChannelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * An event message from the Desktop Agent to an app indicating that another app has + * disconnected from a specific PrivateChannel and will no longer interact with it. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface PrivateChannelOnDisconnectEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: PrivateChannelOnDisconnectEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelOnDisconnectEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface PrivateChannelOnDisconnectEventPayload { + /** + * The Id of the PrivateChannel that the app has disconnected from. + */ + privateChannelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * An event message from the Desktop Agent to an app indicating that another app has + * unsubscribed a context listener from a specific PrivateChannel. + * + * A message from a Desktop Agent to an FDC3-enabled app representing an event. + */ +export interface PrivateChannelOnUnsubscribeEvent { + /** + * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. + */ + meta: BroadcastEventMeta; + /** + * The message payload contains details of the event that the app is being notified about. + */ + payload: PrivateChannelOnUnsubscribeEventPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelOnUnsubscribeEvent'; +} + +/** + * The message payload contains details of the event that the app is being notified about. + */ +export interface PrivateChannelOnUnsubscribeEventPayload { + /** + * The type of the context listener unsubscribed from the channel by another app, or null if + * it was listening to all types. + */ + contextType: null | string; + /** + * The Id of the PrivateChannel that the listener was unsubscribed from. + */ + privateChannelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to unsubscribe a context listener. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface PrivateChannelUnsubscribeEventListenerRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelUnsubscribeEventListenerRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'privateChannelUnsubscribeEventListenerRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelUnsubscribeEventListenerRequestPayload { + listenerUUID: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a privateChannelUnsubscribeEventListener request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface PrivateChannelUnsubscribeEventListenerResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: BroadcastResponseResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'privateChannelUnsubscribeEventListenerResponse'; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to raise an unspecified intent for a specified context. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface RaiseIntentForContextRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentForContextRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'raiseIntentForContextRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentForContextRequestPayload { + app?: AppIdentifier; + context: Context; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a raiseIntentForContext request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface RaiseIntentForContextResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + * + * There are 3 possible responses to a raiseIntentForContext request, each of which sets a + * single property in the payload: Success (`intentResolution`), Needs further resolution + * (`appIntents`) or Error (`error`). + */ + payload: RaiseIntentForContextResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentForContextResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + * + * There are 3 possible responses to a raiseIntentForContext request, each of which sets a + * single property in the payload: Success (`intentResolution`), Needs further resolution + * (`appIntents`) or Error (`error`). + * + * Response to a raiseIntentForContext request that needs additional resolution (i.e. show + * an intent resolver UI). + * + * Used if a raiseIntent request resulted in an error. + */ +export interface RaiseIntentForContextResponsePayload { + /** + * Should be set if the raiseIntent request returned an error. + */ + error?: FindInstancesErrors; + /** + * Used if the raiseIntent request was successfully resolved. + */ + intentResolution?: IntentResolution; + /** + * Used if a raiseIntentForContext request requires additional resolution (e.g. by showing + * an intent resolver) before it can be handled. + */ + appIntents?: AppIntent[]; +} + +/** + * Used if the raiseIntent request was successfully resolved. + * + * IntentResolution provides a standard format for data returned upon resolving an intent. + * + * ```javascript + * //resolve a "Chain" type intent + * let resolution = await agent.raiseIntent("intentName", context); + * + * //resolve a "Client-Service" type intent with a data response or a Channel + * let resolution = await agent.raiseIntent("intentName", context); + * try { + * const result = await resolution.getResult(); + * if (result && result.broadcast) { + * console.log(`${resolution.source} returned a channel with id ${result.id}`); + * } else if (result){ + * console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`); + * } else { + * console.error(`${resolution.source} didn't return data` + * } + * } catch(error) { + * console.error(`${resolution.source} returned an error: ${error}`); + * } + * + * // Use metadata about the resolving app instance to target a further intent + * await agent.raiseIntent("intentName", context, resolution.source); + * ``` + */ +export interface IntentResolution { + /** + * The intent that was raised. May be used to determine which intent the user + * chose in response to `fdc3.raiseIntentForContext()`. + */ + intent: string; + /** + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ + source: AppIdentifier; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A request to raise an intent for a context. + * + * A request message from an FDC3-enabled app to a Desktop Agent. + */ +export interface RaiseIntentRequest { + /** + * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. + */ + meta: AddContextListenerRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'raiseIntentRequest'; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentRequestPayload { + app?: AppIdentifier; + context: Context; + intent: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + +/** + * A response to a raiseIntent request. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface RaiseIntentResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + * + * There are 3 possible responses to a raiseIntent request, each of which sets a single + * property in the payload: Success (`intentResolution`), Needs further resolution + * (`appIntent`) or Error (`error`). + */ + payload: RaiseIntentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + * + * There are 3 possible responses to a raiseIntent request, each of which sets a single + * property in the payload: Success (`intentResolution`), Needs further resolution + * (`appIntent`) or Error (`error`). + * + * Response to a raiseIntent request that needs additional resolution (i.e. show an intent + * resolver UI). + * + * Used if a raiseIntent request resulted in an error. + */ +export interface RaiseIntentResponsePayload { + /** + * Should be set if the raiseIntent request returned an error. + */ + error?: FindInstancesErrors; + /** + * Used if the raiseIntent request was successfully resolved. + */ + intentResolution?: IntentResolution; + /** + * Used if a raiseIntent request requires additional resolution (e.g. by showing an intent + * resolver) before it can be handled. + */ + appIntent?: AppIntent; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * A secondary response to a request to raise an intent used to deliver the intent result. + * This message should quote the original requestUuid of the raiseIntentRequest message in + * its `meta.requestUuid` field. + * + * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the + * payload contains an `error` property, the request was unsuccessful. + */ +export interface RaiseIntentResultResponse { + /** + * Metadata for messages sent by a Desktop Agent to an app in response to an API call. + */ + meta: AddContextListenerResponseMeta; + /** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ + payload: RaiseIntentResultResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResultResponse'; +} + +/** + * A payload for a response to an API call that will contain any return values or an `error` + * property containing a standardized error message indicating that the request was + * unsuccessful. + */ +export interface RaiseIntentResultResponsePayload { + error?: ResponsePayloadError; + intentResult?: IntentResult; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + +/** + * Hello message sent by an application to a parent window or frame when attempting to + * establish connectivity to a Desktop Agent. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol1Hello { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol1HelloPayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP1Hello'; +} + +/** + * Metadata for a Web Connection Protocol message. + */ +export interface WebConnectionProtocol1HelloMeta { + connectionAttemptUuid: string; + timestamp: Date; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol1HelloPayload { + /** + * The current URL of the page attempting to connect. This may differ from the identityUrl, + * but the origins MUST match. + */ + actualUrl: string; + /** + * A flag that may be used to indicate that a channel selector user interface is or is not + * required. Set to `false` if the app includes its own interface for selecting channels or + * does not work with user channels. + */ + channelSelector?: boolean; + /** + * The version of FDC3 API that the app supports. + */ + fdc3Version: string; + /** + * URL to use for the identity of the application. Desktop Agents MUST validate that the + * origin of the message matches the URL, but MAY implement custom comparison logic. + */ + identityUrl: string; + /** + * A flag that may be used to indicate that an intent resolver is or is not required. Set to + * `false` if no intents, or only targeted intents, are raised. + */ + intentResolver?: boolean; + [property: string]: any; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Response from a Desktop Agent to an application requesting access to it indicating that + * it should load a specified URL into a hidden iframe in order to establish connectivity to + * a Desktop Agent. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol2LoadURL { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol2LoadURLPayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP2LoadUrl'; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol2LoadURLPayload { + /** + * A URL which can be used to establish communication with the Desktop Agent, via loading + * the URL into an iframe and restarting the Web Connection protocol with the iframe as the + * target. + */ + iframeUrl: string; + [property: string]: any; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Handshake message sent by the Desktop Agent to the app (with a MessagePort appended) that + * should be used for subsequent communication steps. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol3Handshake { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol3HandshakePayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP3Handshake'; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol3HandshakePayload { + /** + * Indicates a custom timeout (in milliseconds) that should be used for API message + * exchanges that may involve launching an application, instead of the default 100,000 + * millisecond timeout. + */ + appLaunchTimeout?: number; + /** + * Indicates whether a channel selector user interface is required and the URL to use to do + * so. Set to `true` to use the default or `false` to disable the channel selector (as the + * Desktop Agent will handle it another way). + */ + channelSelectorUrl: boolean | string; + /** + * The version of FDC3 API that the Desktop Agent will provide support for. + */ + fdc3Version: string; + /** + * Indicates whether an intent resolver user interface is required and the URL to use to do + * so. Set to `true` to use the default or `false` to disable the intent resolver (as the + * Desktop Agent will handle it another way). + */ + intentResolverUrl: boolean | string; + /** + * Indicates a custom timeout (in milliseconds) that should be used for the majority of API + * message exchanges instead of the default 10,000 millisecond timeout. + */ + messageExchangeTimeout?: number; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Identity Validation request from an app attempting to connect to a Desktop Agent. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol4ValidateAppIdentity { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol4ValidateAppIdentityPayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP4ValidateAppIdentity'; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol4ValidateAppIdentityPayload { + /** + * The current URL of the page attempting to connect. This may differ from the identityUrl, + * but the origins MUST match. + */ + actualUrl: string; + /** + * URL to use for the identity of the application. Desktop Agents MUST validate that the + * origin of the message matches the URL, but MAY implement custom comparison logic. + */ + identityUrl: string; + /** + * If an application has previously connected to the Desktop Agent, it may specify its prior + * instance id and associated instance UUID to request the same same instance Id be assigned. + */ + instanceId?: string; + /** + * Instance UUID associated with the requested instanceId. + */ + instanceUuid?: string; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Message sent by the Desktop Agent to an app if their identity validation fails. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol5ValidateAppIdentityFailedResponse { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP5ValidateAppIdentityFailedResponse'; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload { + message?: string; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Message sent by the Desktop Agent to an app after successful identity validation. + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol5ValidateAppIdentitySuccessResponse { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol1HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP5ValidateAppIdentityResponse'; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload { + /** + * The appId that the app's identity was validated against. + */ + appId: string; + /** + * Implementation metadata for the Desktop Agent, which includes an appMetadata element + * containing a copy of the app's own metadata. + */ + implementationMetadata: ImplementationMetadata; + /** + * The instance Id granted to the application by the Desktop Agent. + */ + instanceId: string; + /** + * Instance UUID associated with the instanceId granted, which may be used to retrieve the + * same instanceId if the app is reloaded or navigates. + */ + instanceUuid: string; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Goodbye message to be sent to the Desktop Agent when disconnecting (e.g. when closing the + * window or navigating). Desktop Agents should close the MessagePort after receiving this + * message, but retain instance details in case the application reconnects (e.g. after a + * navigation event). + * + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocol6Goodbye { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: WebConnectionProtocol6GoodbyeMeta; + /** + * Identifies the type of the connection step message. + */ + type: 'WCP6Goodbye'; +} + +/** + * Metadata for a Web Connection Protocol message. + */ +export interface WebConnectionProtocol6GoodbyeMeta { + timestamp: Date; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * A message used during the connection flow for an application to a Desktop Agent in a + * browser window. Used for messages sent in either direction. + */ +export interface WebConnectionProtocolMessage { + /** + * Metadata for a Web Connection Protocol message. + */ + meta: ConnectionStepMetadata; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload?: { [key: string]: any }; + /** + * Identifies the type of the connection step message. + */ + type: ConnectionStepMessageType; +} + +/** + * Metadata for a Web Connection Protocol message. + */ +export interface ConnectionStepMetadata { + timestamp: Date; + connectionAttemptUuid?: string; +} + +/** + * Identifies the type of the connection step message. + */ +export type ConnectionStepMessageType = + | 'WCP1Hello' + | 'WCP2LoadUrl' + | 'WCP3Handshake' + | 'WCP4ValidateAppIdentity' + | 'WCP5ValidateAppIdentityFailedResponse' + | 'WCP5ValidateAppIdentityResponse' + | 'WCP6Goodbye'; + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toAddContextListenerRequest(json: string): AddContextListenerRequest { + return cast(JSON.parse(json), r('AddContextListenerRequest')); + } + + public static addContextListenerRequestToJson(value: AddContextListenerRequest): string { + return JSON.stringify(uncast(value, r('AddContextListenerRequest')), null, 2); + } + + public static toAddContextListenerResponse(json: string): AddContextListenerResponse { + return cast(JSON.parse(json), r('AddContextListenerResponse')); + } + + public static addContextListenerResponseToJson(value: AddContextListenerResponse): string { + return JSON.stringify(uncast(value, r('AddContextListenerResponse')), null, 2); + } + + public static toAddEventListenerRequest(json: string): AddEventListenerRequest { + return cast(JSON.parse(json), r('AddEventListenerRequest')); + } + + public static addEventListenerRequestToJson(value: AddEventListenerRequest): string { + return JSON.stringify(uncast(value, r('AddEventListenerRequest')), null, 2); + } + + public static toAddEventListenerResponse(json: string): AddEventListenerResponse { + return cast(JSON.parse(json), r('AddEventListenerResponse')); + } + + public static addEventListenerResponseToJson(value: AddEventListenerResponse): string { + return JSON.stringify(uncast(value, r('AddEventListenerResponse')), null, 2); + } + + public static toAddIntentListenerRequest(json: string): AddIntentListenerRequest { + return cast(JSON.parse(json), r('AddIntentListenerRequest')); + } + + public static addIntentListenerRequestToJson(value: AddIntentListenerRequest): string { + return JSON.stringify(uncast(value, r('AddIntentListenerRequest')), null, 2); + } + + public static toAddIntentListenerResponse(json: string): AddIntentListenerResponse { + return cast(JSON.parse(json), r('AddIntentListenerResponse')); + } + + public static addIntentListenerResponseToJson(value: AddIntentListenerResponse): string { + return JSON.stringify(uncast(value, r('AddIntentListenerResponse')), null, 2); + } + + public static toAgentEventMessage(json: string): AgentEventMessage { + return cast(JSON.parse(json), r('AgentEventMessage')); + } + + public static agentEventMessageToJson(value: AgentEventMessage): string { + return JSON.stringify(uncast(value, r('AgentEventMessage')), null, 2); + } + + public static toAgentResponseMessage(json: string): AgentResponseMessage { + return cast(JSON.parse(json), r('AgentResponseMessage')); + } + + public static agentResponseMessageToJson(value: AgentResponseMessage): string { + return JSON.stringify(uncast(value, r('AgentResponseMessage')), null, 2); + } + + public static toAppRequestMessage(json: string): AppRequestMessage { + return cast(JSON.parse(json), r('AppRequestMessage')); + } + + public static appRequestMessageToJson(value: AppRequestMessage): string { + return JSON.stringify(uncast(value, r('AppRequestMessage')), null, 2); + } + + public static toBroadcastEvent(json: string): BroadcastEvent { + return cast(JSON.parse(json), r('BroadcastEvent')); + } + + public static broadcastEventToJson(value: BroadcastEvent): string { + return JSON.stringify(uncast(value, r('BroadcastEvent')), null, 2); + } + + public static toBroadcastRequest(json: string): BroadcastRequest { + return cast(JSON.parse(json), r('BroadcastRequest')); + } + + public static broadcastRequestToJson(value: BroadcastRequest): string { + return JSON.stringify(uncast(value, r('BroadcastRequest')), null, 2); + } + + public static toBroadcastResponse(json: string): BroadcastResponse { + return cast(JSON.parse(json), r('BroadcastResponse')); + } + + public static broadcastResponseToJson(value: BroadcastResponse): string { + return JSON.stringify(uncast(value, r('BroadcastResponse')), null, 2); + } + + public static toChannelChangedEvent(json: string): ChannelChangedEvent { + return cast(JSON.parse(json), r('ChannelChangedEvent')); + } + + public static channelChangedEventToJson(value: ChannelChangedEvent): string { + return JSON.stringify(uncast(value, r('ChannelChangedEvent')), null, 2); + } + + public static toContextListenerUnsubscribeRequest(json: string): ContextListenerUnsubscribeRequest { + return cast(JSON.parse(json), r('ContextListenerUnsubscribeRequest')); + } + + public static contextListenerUnsubscribeRequestToJson(value: ContextListenerUnsubscribeRequest): string { + return JSON.stringify(uncast(value, r('ContextListenerUnsubscribeRequest')), null, 2); + } + + public static toContextListenerUnsubscribeResponse(json: string): ContextListenerUnsubscribeResponse { + return cast(JSON.parse(json), r('ContextListenerUnsubscribeResponse')); + } + + public static contextListenerUnsubscribeResponseToJson(value: ContextListenerUnsubscribeResponse): string { + return JSON.stringify(uncast(value, r('ContextListenerUnsubscribeResponse')), null, 2); + } + + public static toCreatePrivateChannelRequest(json: string): CreatePrivateChannelRequest { + return cast(JSON.parse(json), r('CreatePrivateChannelRequest')); + } + + public static createPrivateChannelRequestToJson(value: CreatePrivateChannelRequest): string { + return JSON.stringify(uncast(value, r('CreatePrivateChannelRequest')), null, 2); + } + + public static toCreatePrivateChannelResponse(json: string): CreatePrivateChannelResponse { + return cast(JSON.parse(json), r('CreatePrivateChannelResponse')); + } + + public static createPrivateChannelResponseToJson(value: CreatePrivateChannelResponse): string { + return JSON.stringify(uncast(value, r('CreatePrivateChannelResponse')), null, 2); + } + + public static toEventListenerUnsubscribeRequest(json: string): EventListenerUnsubscribeRequest { + return cast(JSON.parse(json), r('EventListenerUnsubscribeRequest')); + } + + public static eventListenerUnsubscribeRequestToJson(value: EventListenerUnsubscribeRequest): string { + return JSON.stringify(uncast(value, r('EventListenerUnsubscribeRequest')), null, 2); + } + + public static toEventListenerUnsubscribeResponse(json: string): EventListenerUnsubscribeResponse { + return cast(JSON.parse(json), r('EventListenerUnsubscribeResponse')); + } + + public static eventListenerUnsubscribeResponseToJson(value: EventListenerUnsubscribeResponse): string { + return JSON.stringify(uncast(value, r('EventListenerUnsubscribeResponse')), null, 2); + } + + public static toFdc3UserInterfaceChannels(json: string): Fdc3UserInterfaceChannels { + return cast(JSON.parse(json), r('Fdc3UserInterfaceChannels')); + } + + public static fdc3UserInterfaceChannelsToJson(value: Fdc3UserInterfaceChannels): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceChannels')), null, 2); + } + + public static toFdc3UserInterfaceChannelSelected(json: string): Fdc3UserInterfaceChannelSelected { + return cast(JSON.parse(json), r('Fdc3UserInterfaceChannelSelected')); + } + + public static fdc3UserInterfaceChannelSelectedToJson(value: Fdc3UserInterfaceChannelSelected): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceChannelSelected')), null, 2); + } + + public static toFdc3UserInterfaceDrag(json: string): Fdc3UserInterfaceDrag { + return cast(JSON.parse(json), r('Fdc3UserInterfaceDrag')); + } + + public static fdc3UserInterfaceDragToJson(value: Fdc3UserInterfaceDrag): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceDrag')), null, 2); + } + + public static toFdc3UserInterfaceHandshake(json: string): Fdc3UserInterfaceHandshake { + return cast(JSON.parse(json), r('Fdc3UserInterfaceHandshake')); + } + + public static fdc3UserInterfaceHandshakeToJson(value: Fdc3UserInterfaceHandshake): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceHandshake')), null, 2); + } + + public static toFdc3UserInterfaceHello(json: string): Fdc3UserInterfaceHello { + return cast(JSON.parse(json), r('Fdc3UserInterfaceHello')); + } + + public static fdc3UserInterfaceHelloToJson(value: Fdc3UserInterfaceHello): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceHello')), null, 2); + } + + public static toFdc3UserInterfaceMessage(json: string): Fdc3UserInterfaceMessage { + return cast(JSON.parse(json), r('Fdc3UserInterfaceMessage')); + } + + public static fdc3UserInterfaceMessageToJson(value: Fdc3UserInterfaceMessage): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceMessage')), null, 2); + } + + public static toFdc3UserInterfaceResolve(json: string): Fdc3UserInterfaceResolve { + return cast(JSON.parse(json), r('Fdc3UserInterfaceResolve')); + } + + public static fdc3UserInterfaceResolveToJson(value: Fdc3UserInterfaceResolve): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceResolve')), null, 2); + } + + public static toFdc3UserInterfaceResolveAction(json: string): Fdc3UserInterfaceResolveAction { + return cast(JSON.parse(json), r('Fdc3UserInterfaceResolveAction')); + } + + public static fdc3UserInterfaceResolveActionToJson(value: Fdc3UserInterfaceResolveAction): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceResolveAction')), null, 2); + } + + public static toFdc3UserInterfaceRestyle(json: string): Fdc3UserInterfaceRestyle { + return cast(JSON.parse(json), r('Fdc3UserInterfaceRestyle')); + } + + public static fdc3UserInterfaceRestyleToJson(value: Fdc3UserInterfaceRestyle): string { + return JSON.stringify(uncast(value, r('Fdc3UserInterfaceRestyle')), null, 2); + } + + public static toFindInstancesRequest(json: string): FindInstancesRequest { + return cast(JSON.parse(json), r('FindInstancesRequest')); + } + + public static findInstancesRequestToJson(value: FindInstancesRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesRequest')), null, 2); + } + + public static toFindInstancesResponse(json: string): FindInstancesResponse { + return cast(JSON.parse(json), r('FindInstancesResponse')); + } + + public static findInstancesResponseToJson(value: FindInstancesResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesResponse')), null, 2); + } + + public static toFindIntentRequest(json: string): FindIntentRequest { + return cast(JSON.parse(json), r('FindIntentRequest')); + } + + public static findIntentRequestToJson(value: FindIntentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentRequest')), null, 2); + } + + public static toFindIntentResponse(json: string): FindIntentResponse { + return cast(JSON.parse(json), r('FindIntentResponse')); + } + + public static findIntentResponseToJson(value: FindIntentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentResponse')), null, 2); + } + + public static toFindIntentsByContextRequest(json: string): FindIntentsByContextRequest { + return cast(JSON.parse(json), r('FindIntentsByContextRequest')); + } + + public static findIntentsByContextRequestToJson(value: FindIntentsByContextRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextRequest')), null, 2); + } + + public static toFindIntentsByContextResponse(json: string): FindIntentsByContextResponse { + return cast(JSON.parse(json), r('FindIntentsByContextResponse')); + } + + public static findIntentsByContextResponseToJson(value: FindIntentsByContextResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextResponse')), null, 2); + } + + public static toGetAppMetadataRequest(json: string): GetAppMetadataRequest { + return cast(JSON.parse(json), r('GetAppMetadataRequest')); + } + + public static getAppMetadataRequestToJson(value: GetAppMetadataRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataRequest')), null, 2); + } + + public static toGetAppMetadataResponse(json: string): GetAppMetadataResponse { + return cast(JSON.parse(json), r('GetAppMetadataResponse')); + } + + public static getAppMetadataResponseToJson(value: GetAppMetadataResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataResponse')), null, 2); + } + + public static toGetCurrentChannelRequest(json: string): GetCurrentChannelRequest { + return cast(JSON.parse(json), r('GetCurrentChannelRequest')); + } + + public static getCurrentChannelRequestToJson(value: GetCurrentChannelRequest): string { + return JSON.stringify(uncast(value, r('GetCurrentChannelRequest')), null, 2); + } + + public static toGetCurrentChannelResponse(json: string): GetCurrentChannelResponse { + return cast(JSON.parse(json), r('GetCurrentChannelResponse')); + } + + public static getCurrentChannelResponseToJson(value: GetCurrentChannelResponse): string { + return JSON.stringify(uncast(value, r('GetCurrentChannelResponse')), null, 2); + } + + public static toGetCurrentContextRequest(json: string): GetCurrentContextRequest { + return cast(JSON.parse(json), r('GetCurrentContextRequest')); + } + + public static getCurrentContextRequestToJson(value: GetCurrentContextRequest): string { + return JSON.stringify(uncast(value, r('GetCurrentContextRequest')), null, 2); + } + + public static toGetCurrentContextResponse(json: string): GetCurrentContextResponse { + return cast(JSON.parse(json), r('GetCurrentContextResponse')); + } + + public static getCurrentContextResponseToJson(value: GetCurrentContextResponse): string { + return JSON.stringify(uncast(value, r('GetCurrentContextResponse')), null, 2); + } + + public static toGetInfoRequest(json: string): GetInfoRequest { + return cast(JSON.parse(json), r('GetInfoRequest')); + } + + public static getInfoRequestToJson(value: GetInfoRequest): string { + return JSON.stringify(uncast(value, r('GetInfoRequest')), null, 2); + } + + public static toGetInfoResponse(json: string): GetInfoResponse { + return cast(JSON.parse(json), r('GetInfoResponse')); + } + + public static getInfoResponseToJson(value: GetInfoResponse): string { + return JSON.stringify(uncast(value, r('GetInfoResponse')), null, 2); + } + + public static toGetOrCreateChannelRequest(json: string): GetOrCreateChannelRequest { + return cast(JSON.parse(json), r('GetOrCreateChannelRequest')); + } + + public static getOrCreateChannelRequestToJson(value: GetOrCreateChannelRequest): string { + return JSON.stringify(uncast(value, r('GetOrCreateChannelRequest')), null, 2); + } + + public static toGetOrCreateChannelResponse(json: string): GetOrCreateChannelResponse { + return cast(JSON.parse(json), r('GetOrCreateChannelResponse')); + } + + public static getOrCreateChannelResponseToJson(value: GetOrCreateChannelResponse): string { + return JSON.stringify(uncast(value, r('GetOrCreateChannelResponse')), null, 2); + } + + public static toGetUserChannelsRequest(json: string): GetUserChannelsRequest { + return cast(JSON.parse(json), r('GetUserChannelsRequest')); + } + + public static getUserChannelsRequestToJson(value: GetUserChannelsRequest): string { + return JSON.stringify(uncast(value, r('GetUserChannelsRequest')), null, 2); + } + + public static toGetUserChannelsResponse(json: string): GetUserChannelsResponse { + return cast(JSON.parse(json), r('GetUserChannelsResponse')); + } + + public static getUserChannelsResponseToJson(value: GetUserChannelsResponse): string { + return JSON.stringify(uncast(value, r('GetUserChannelsResponse')), null, 2); + } + + public static toHeartbeatAcknowledgementRequest(json: string): HeartbeatAcknowledgementRequest { + return cast(JSON.parse(json), r('HeartbeatAcknowledgementRequest')); + } + + public static heartbeatAcknowledgementRequestToJson(value: HeartbeatAcknowledgementRequest): string { + return JSON.stringify(uncast(value, r('HeartbeatAcknowledgementRequest')), null, 2); + } + + public static toHeartbeatEvent(json: string): HeartbeatEvent { + return cast(JSON.parse(json), r('HeartbeatEvent')); + } + + public static heartbeatEventToJson(value: HeartbeatEvent): string { + return JSON.stringify(uncast(value, r('HeartbeatEvent')), null, 2); + } + + public static toIntentEvent(json: string): IntentEvent { + return cast(JSON.parse(json), r('IntentEvent')); + } + + public static intentEventToJson(value: IntentEvent): string { + return JSON.stringify(uncast(value, r('IntentEvent')), null, 2); + } + + public static toIntentListenerUnsubscribeRequest(json: string): IntentListenerUnsubscribeRequest { + return cast(JSON.parse(json), r('IntentListenerUnsubscribeRequest')); + } + + public static intentListenerUnsubscribeRequestToJson(value: IntentListenerUnsubscribeRequest): string { + return JSON.stringify(uncast(value, r('IntentListenerUnsubscribeRequest')), null, 2); + } + + public static toIntentListenerUnsubscribeResponse(json: string): IntentListenerUnsubscribeResponse { + return cast(JSON.parse(json), r('IntentListenerUnsubscribeResponse')); + } + + public static intentListenerUnsubscribeResponseToJson(value: IntentListenerUnsubscribeResponse): string { + return JSON.stringify(uncast(value, r('IntentListenerUnsubscribeResponse')), null, 2); + } + + public static toIntentResultRequest(json: string): IntentResultRequest { + return cast(JSON.parse(json), r('IntentResultRequest')); + } + + public static intentResultRequestToJson(value: IntentResultRequest): string { + return JSON.stringify(uncast(value, r('IntentResultRequest')), null, 2); + } + + public static toIntentResultResponse(json: string): IntentResultResponse { + return cast(JSON.parse(json), r('IntentResultResponse')); + } + + public static intentResultResponseToJson(value: IntentResultResponse): string { + return JSON.stringify(uncast(value, r('IntentResultResponse')), null, 2); + } + + public static toJoinUserChannelRequest(json: string): JoinUserChannelRequest { + return cast(JSON.parse(json), r('JoinUserChannelRequest')); + } + + public static joinUserChannelRequestToJson(value: JoinUserChannelRequest): string { + return JSON.stringify(uncast(value, r('JoinUserChannelRequest')), null, 2); + } + + public static toJoinUserChannelResponse(json: string): JoinUserChannelResponse { + return cast(JSON.parse(json), r('JoinUserChannelResponse')); + } + + public static joinUserChannelResponseToJson(value: JoinUserChannelResponse): string { + return JSON.stringify(uncast(value, r('JoinUserChannelResponse')), null, 2); + } + + public static toLeaveCurrentChannelRequest(json: string): LeaveCurrentChannelRequest { + return cast(JSON.parse(json), r('LeaveCurrentChannelRequest')); + } + + public static leaveCurrentChannelRequestToJson(value: LeaveCurrentChannelRequest): string { + return JSON.stringify(uncast(value, r('LeaveCurrentChannelRequest')), null, 2); + } + + public static toLeaveCurrentChannelResponse(json: string): LeaveCurrentChannelResponse { + return cast(JSON.parse(json), r('LeaveCurrentChannelResponse')); + } + + public static leaveCurrentChannelResponseToJson(value: LeaveCurrentChannelResponse): string { + return JSON.stringify(uncast(value, r('LeaveCurrentChannelResponse')), null, 2); + } + + public static toOpenRequest(json: string): OpenRequest { + return cast(JSON.parse(json), r('OpenRequest')); + } + + public static openRequestToJson(value: OpenRequest): string { + return JSON.stringify(uncast(value, r('OpenRequest')), null, 2); + } + + public static toOpenResponse(json: string): OpenResponse { + return cast(JSON.parse(json), r('OpenResponse')); + } + + public static openResponseToJson(value: OpenResponse): string { + return JSON.stringify(uncast(value, r('OpenResponse')), null, 2); + } + + public static toPrivateChannelAddEventListenerRequest(json: string): PrivateChannelAddEventListenerRequest { + return cast(JSON.parse(json), r('PrivateChannelAddEventListenerRequest')); + } + + public static privateChannelAddEventListenerRequestToJson(value: PrivateChannelAddEventListenerRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelAddEventListenerRequest')), null, 2); + } + + public static toPrivateChannelAddEventListenerResponse(json: string): PrivateChannelAddEventListenerResponse { + return cast(JSON.parse(json), r('PrivateChannelAddEventListenerResponse')); + } + + public static privateChannelAddEventListenerResponseToJson(value: PrivateChannelAddEventListenerResponse): string { + return JSON.stringify(uncast(value, r('PrivateChannelAddEventListenerResponse')), null, 2); + } + + public static toPrivateChannelDisconnectRequest(json: string): PrivateChannelDisconnectRequest { + return cast(JSON.parse(json), r('PrivateChannelDisconnectRequest')); + } + + public static privateChannelDisconnectRequestToJson(value: PrivateChannelDisconnectRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelDisconnectRequest')), null, 2); + } + + public static toPrivateChannelDisconnectResponse(json: string): PrivateChannelDisconnectResponse { + return cast(JSON.parse(json), r('PrivateChannelDisconnectResponse')); + } + + public static privateChannelDisconnectResponseToJson(value: PrivateChannelDisconnectResponse): string { + return JSON.stringify(uncast(value, r('PrivateChannelDisconnectResponse')), null, 2); + } + + public static toPrivateChannelOnAddContextListenerEvent(json: string): PrivateChannelOnAddContextListenerEvent { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListenerEvent')); + } + + public static privateChannelOnAddContextListenerEventToJson(value: PrivateChannelOnAddContextListenerEvent): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListenerEvent')), null, 2); + } + + public static toPrivateChannelOnDisconnectEvent(json: string): PrivateChannelOnDisconnectEvent { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnectEvent')); + } + + public static privateChannelOnDisconnectEventToJson(value: PrivateChannelOnDisconnectEvent): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnectEvent')), null, 2); + } + + public static toPrivateChannelOnUnsubscribeEvent(json: string): PrivateChannelOnUnsubscribeEvent { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribeEvent')); + } + + public static privateChannelOnUnsubscribeEventToJson(value: PrivateChannelOnUnsubscribeEvent): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeEvent')), null, 2); + } + + public static toPrivateChannelUnsubscribeEventListenerRequest( + json: string + ): PrivateChannelUnsubscribeEventListenerRequest { + return cast(JSON.parse(json), r('PrivateChannelUnsubscribeEventListenerRequest')); + } + + public static privateChannelUnsubscribeEventListenerRequestToJson( + value: PrivateChannelUnsubscribeEventListenerRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelUnsubscribeEventListenerRequest')), null, 2); + } + + public static toPrivateChannelUnsubscribeEventListenerResponse( + json: string + ): PrivateChannelUnsubscribeEventListenerResponse { + return cast(JSON.parse(json), r('PrivateChannelUnsubscribeEventListenerResponse')); + } + + public static privateChannelUnsubscribeEventListenerResponseToJson( + value: PrivateChannelUnsubscribeEventListenerResponse + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelUnsubscribeEventListenerResponse')), null, 2); + } + + public static toRaiseIntentForContextRequest(json: string): RaiseIntentForContextRequest { + return cast(JSON.parse(json), r('RaiseIntentForContextRequest')); + } + + public static raiseIntentForContextRequestToJson(value: RaiseIntentForContextRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentForContextRequest')), null, 2); + } + + public static toRaiseIntentForContextResponse(json: string): RaiseIntentForContextResponse { + return cast(JSON.parse(json), r('RaiseIntentForContextResponse')); + } + + public static raiseIntentForContextResponseToJson(value: RaiseIntentForContextResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentForContextResponse')), null, 2); + } + + public static toRaiseIntentRequest(json: string): RaiseIntentRequest { + return cast(JSON.parse(json), r('RaiseIntentRequest')); + } + + public static raiseIntentRequestToJson(value: RaiseIntentRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentRequest')), null, 2); + } + + public static toRaiseIntentResponse(json: string): RaiseIntentResponse { + return cast(JSON.parse(json), r('RaiseIntentResponse')); + } + + public static raiseIntentResponseToJson(value: RaiseIntentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResponse')), null, 2); + } + + public static toRaiseIntentResultResponse(json: string): RaiseIntentResultResponse { + return cast(JSON.parse(json), r('RaiseIntentResultResponse')); + } + + public static raiseIntentResultResponseToJson(value: RaiseIntentResultResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultResponse')), null, 2); + } + + public static toWebConnectionProtocol1Hello(json: string): WebConnectionProtocol1Hello { + return cast(JSON.parse(json), r('WebConnectionProtocol1Hello')); + } + + public static webConnectionProtocol1HelloToJson(value: WebConnectionProtocol1Hello): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol1Hello')), null, 2); + } + + public static toWebConnectionProtocol2LoadURL(json: string): WebConnectionProtocol2LoadURL { + return cast(JSON.parse(json), r('WebConnectionProtocol2LoadURL')); + } + + public static webConnectionProtocol2LoadURLToJson(value: WebConnectionProtocol2LoadURL): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol2LoadURL')), null, 2); + } + + public static toWebConnectionProtocol3Handshake(json: string): WebConnectionProtocol3Handshake { + return cast(JSON.parse(json), r('WebConnectionProtocol3Handshake')); + } + + public static webConnectionProtocol3HandshakeToJson(value: WebConnectionProtocol3Handshake): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol3Handshake')), null, 2); + } + + public static toWebConnectionProtocol4ValidateAppIdentity(json: string): WebConnectionProtocol4ValidateAppIdentity { + return cast(JSON.parse(json), r('WebConnectionProtocol4ValidateAppIdentity')); + } + + public static webConnectionProtocol4ValidateAppIdentityToJson( + value: WebConnectionProtocol4ValidateAppIdentity + ): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol4ValidateAppIdentity')), null, 2); + } + + public static toWebConnectionProtocol5ValidateAppIdentityFailedResponse( + json: string + ): WebConnectionProtocol5ValidateAppIdentityFailedResponse { + return cast(JSON.parse(json), r('WebConnectionProtocol5ValidateAppIdentityFailedResponse')); + } + + public static webConnectionProtocol5ValidateAppIdentityFailedResponseToJson( + value: WebConnectionProtocol5ValidateAppIdentityFailedResponse + ): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol5ValidateAppIdentityFailedResponse')), null, 2); + } + + public static toWebConnectionProtocol5ValidateAppIdentitySuccessResponse( + json: string + ): WebConnectionProtocol5ValidateAppIdentitySuccessResponse { + return cast(JSON.parse(json), r('WebConnectionProtocol5ValidateAppIdentitySuccessResponse')); + } + + public static webConnectionProtocol5ValidateAppIdentitySuccessResponseToJson( + value: WebConnectionProtocol5ValidateAppIdentitySuccessResponse + ): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol5ValidateAppIdentitySuccessResponse')), null, 2); + } + + public static toWebConnectionProtocol6Goodbye(json: string): WebConnectionProtocol6Goodbye { + return cast(JSON.parse(json), r('WebConnectionProtocol6Goodbye')); + } + + public static webConnectionProtocol6GoodbyeToJson(value: WebConnectionProtocol6Goodbye): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocol6Goodbye')), null, 2); + } + + public static toWebConnectionProtocolMessage(json: string): WebConnectionProtocolMessage { + return cast(JSON.parse(json), r('WebConnectionProtocolMessage')); + } + + public static webConnectionProtocolMessageToJson(value: WebConnectionProtocolMessage): string { + return JSON.stringify(uncast(value, r('WebConnectionProtocolMessage')), null, 2); + } +} + +function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { + const prettyTyp = prettyTypeName(typ); + const parentText = parent ? ` on ${parent}` : ''; + const keyText = key ? ` for key "${key}"` : ''; + throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); +} + +function prettyTypeName(typ: any): string { + if (Array.isArray(typ)) { + if (typ.length === 2 && typ[0] === undefined) { + return `an optional ${prettyTypeName(typ[1])}`; + } else { + return `one of [${typ + .map(a => { + return prettyTypeName(a); + }) + .join(', ')}]`; + } + } else if (typeof typ === 'object' && typ.literal !== undefined) { + return typ.literal; + } else { + return typeof typ; + } +} + +function jsonToJSProps(typ: any): any { + if (typ.jsonToJS === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.json] = { key: p.js, typ: p.typ })); + typ.jsonToJS = map; + } + return typ.jsonToJS; +} + +function jsToJSONProps(typ: any): any { + if (typ.jsToJSON === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.js] = { key: p.json, typ: p.typ })); + typ.jsToJSON = map; + } + return typ.jsToJSON; +} + +function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { + function transformPrimitive(typ: string, val: any): any { + if (typeof typ === typeof val) return val; + return invalidValue(typ, val, key, parent); + } + + function transformUnion(typs: any[], val: any): any { + // val must validate against one typ in typs + const l = typs.length; + for (let i = 0; i < l; i++) { + const typ = typs[i]; + try { + return transform(val, typ, getProps); + } catch (_) {} + } + return invalidValue(typs, val, key, parent); + } + + function transformEnum(cases: string[], val: any): any { + if (cases.indexOf(val) !== -1) return val; + return invalidValue( + cases.map(a => { + return l(a); + }), + val, + key, + parent + ); + } + + function transformArray(typ: any, val: any): any { + // val must be an array with no invalid elements + if (!Array.isArray(val)) return invalidValue(l('array'), val, key, parent); + return val.map(el => transform(el, typ, getProps)); + } + + function transformDate(val: any): any { + if (val === null) { + return null; + } + const d = new Date(val); + if (isNaN(d.valueOf())) { + return invalidValue(l('Date'), val, key, parent); + } + return d; + } + + function transformObject(props: { [k: string]: any }, additional: any, val: any): any { + if (val === null || typeof val !== 'object' || Array.isArray(val)) { + return invalidValue(l(ref || 'object'), val, key, parent); + } + const result: any = {}; + Object.getOwnPropertyNames(props).forEach(key => { + const prop = props[key]; + const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; + result[prop.key] = transform(v, prop.typ, getProps, key, ref); + }); + Object.getOwnPropertyNames(val).forEach(key => { + if (!Object.prototype.hasOwnProperty.call(props, key)) { + result[key] = transform(val[key], additional, getProps, key, ref); + } + }); + return result; + } + + if (typ === 'any') return val; + if (typ === null) { + if (val === null) return val; + return invalidValue(typ, val, key, parent); + } + if (typ === false) return invalidValue(typ, val, key, parent); + let ref: any = undefined; + while (typeof typ === 'object' && typ.ref !== undefined) { + ref = typ.ref; + typ = typeMap[typ.ref]; + } + if (Array.isArray(typ)) return transformEnum(typ, val); + if (typeof typ === 'object') { + return typ.hasOwnProperty('unionMembers') + ? transformUnion(typ.unionMembers, val) + : typ.hasOwnProperty('arrayItems') + ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty('props') + ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val, key, parent); + } + // Numbers can be parsed by Date but shouldn't be. + if (typ === Date && typeof val !== 'number') return transformDate(val); + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + AddContextListenerRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('AddContextListenerRequestPayload') }, + { json: 'type', js: 'type', typ: r('AddContextListenerRequestType') }, + ], + false + ), + AddContextListenerRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('AppIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + AppIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + AddContextListenerRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: u(null, '') }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + AddContextListenerResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('AddContextListenerResponsePayload') }, + { json: 'type', js: 'type', typ: r('AddContextListenerResponseType') }, + ], + false + ), + AddContextListenerResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('AppIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + AddContextListenerResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'listenerUUID', js: 'listenerUUID', typ: u(undefined, '') }, + ], + false + ), + AddEventListenerRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('AddEventListenerRequestPayload') }, + { json: 'type', js: 'type', typ: r('AddEventListenerRequestType') }, + ], + false + ), + AddEventListenerRequestPayload: o([{ json: 'type', js: 'type', typ: u(r('FDC3EventType'), null) }], false), + AddEventListenerResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('AddEventListenerResponsePayload') }, + { json: 'type', js: 'type', typ: r('AddEventListenerResponseType') }, + ], + false + ), + AddEventListenerResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }, + { json: 'listenerUUID', js: 'listenerUUID', typ: u(undefined, '') }, + ], + false + ), + AddIntentListenerRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('AddIntentListenerRequestPayload') }, + { json: 'type', js: 'type', typ: r('AddIntentListenerRequestType') }, + ], + false + ), + AddIntentListenerRequestPayload: o([{ json: 'intent', js: 'intent', typ: '' }], false), + AddIntentListenerResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('PayloadObject') }, + { json: 'type', js: 'type', typ: r('AddIntentListenerResponseType') }, + ], + false + ), + PayloadObject: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FluffyError')) }, + { json: 'listenerUUID', js: 'listenerUUID', typ: u(undefined, '') }, + ], + 'any' + ), + AgentEventMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentEventMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('EventMessageType') }, + ], + false + ), + AgentEventMessageMeta: o( + [ + { json: 'eventUuid', js: 'eventUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + AgentResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: r('AgentResponseMessageResponsePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + AgentResponseMessageMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('AppIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + AgentResponseMessageResponsePayload: o( + [{ json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }], + 'any' + ), + AppRequestMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AppRequestMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, + ], + false + ), + AppRequestMessageMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('AppIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BroadcastEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastEventPayload') }, + { json: 'type', js: 'type', typ: r('BroadcastEventType') }, + ], + false + ), + BroadcastEventMeta: o( + [ + { json: 'eventUuid', js: 'eventUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BroadcastEventPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: u(null, '') }, + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'originatingApp', js: 'originatingApp', typ: u(undefined, r('AppIdentifier')) }, + ], + false + ), + Context: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + BroadcastRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastRequestPayload') }, + { json: 'type', js: 'type', typ: r('BroadcastRequestType') }, + ], + false + ), + BroadcastRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + BroadcastResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('BroadcastResponseType') }, + ], + false + ), + BroadcastResponseResponsePayload: o( + [{ json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }], + 'any' + ), + ChannelChangedEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('ChannelChangedEventPayload') }, + { json: 'type', js: 'type', typ: r('ChannelChangedEventType') }, + ], + false + ), + ChannelChangedEventPayload: o([{ json: 'newChannelId', js: 'newChannelId', typ: u(null, '') }], false), + ContextListenerUnsubscribeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('ContextListenerUnsubscribeRequestPayload') }, + { json: 'type', js: 'type', typ: r('ContextListenerUnsubscribeRequestType') }, + ], + false + ), + ContextListenerUnsubscribeRequestPayload: o([{ json: 'listenerUUID', js: 'listenerUUID', typ: '' }], false), + ContextListenerUnsubscribeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('ContextListenerUnsubscribeResponseType') }, + ], + false + ), + CreatePrivateChannelRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('CreatePrivateChannelRequestPayload') }, + { json: 'type', js: 'type', typ: r('CreatePrivateChannelRequestType') }, + ], + false + ), + CreatePrivateChannelRequestPayload: o([], false), + CreatePrivateChannelResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('CreatePrivateChannelResponsePayload') }, + { json: 'type', js: 'type', typ: r('CreatePrivateChannelResponseType') }, + ], + false + ), + CreatePrivateChannelResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'privateChannel', js: 'privateChannel', typ: u(undefined, r('Channel')) }, + ], + false + ), + Channel: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadata')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + EventListenerUnsubscribeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('EventListenerUnsubscribeRequestPayload') }, + { json: 'type', js: 'type', typ: r('EventListenerUnsubscribeRequestType') }, + ], + false + ), + EventListenerUnsubscribeRequestPayload: o([{ json: 'listenerUUID', js: 'listenerUUID', typ: '' }], false), + EventListenerUnsubscribeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('EventListenerUnsubscribeResponseType') }, + ], + false + ), + Fdc3UserInterfaceChannels: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceChannelsPayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceChannelsType') }, + ], + false + ), + Fdc3UserInterfaceChannelsPayload: o( + [ + { json: 'selected', js: 'selected', typ: u(null, '') }, + { json: 'userChannels', js: 'userChannels', typ: a(r('Channel')) }, + ], + false + ), + Fdc3UserInterfaceChannelSelected: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceChannelSelectedPayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceChannelSelectedType') }, + ], + false + ), + Fdc3UserInterfaceChannelSelectedPayload: o([{ json: 'selected', js: 'selected', typ: u(null, '') }], false), + Fdc3UserInterfaceDrag: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceDragPayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceDragType') }, + ], + false + ), + Fdc3UserInterfaceDragPayload: o([{ json: 'mouseOffsets', js: 'mouseOffsets', typ: r('MouseOffsets') }], false), + MouseOffsets: o( + [ + { json: 'x', js: 'x', typ: 0 }, + { json: 'y', js: 'y', typ: 0 }, + ], + false + ), + Fdc3UserInterfaceHandshake: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceHandshakePayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceHandshakeType') }, + ], + false + ), + Fdc3UserInterfaceHandshakePayload: o([{ json: 'fdc3Version', js: 'fdc3Version', typ: '' }], false), + Fdc3UserInterfaceHello: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceHelloPayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceHelloType') }, + ], + false + ), + Fdc3UserInterfaceHelloPayload: o( + [ + { json: 'implementationDetails', js: 'implementationDetails', typ: '' }, + { json: 'initialCSS', js: 'initialCSS', typ: r('InitialCSS') }, + ], + false + ), + InitialCSS: o( + [ + { json: 'bottom', js: 'bottom', typ: u(undefined, '') }, + { json: 'height', js: 'height', typ: u(undefined, '') }, + { json: 'left', js: 'left', typ: u(undefined, '') }, + { json: 'maxHeight', js: 'maxHeight', typ: u(undefined, '') }, + { json: 'maxWidth', js: 'maxWidth', typ: u(undefined, '') }, + { json: 'right', js: 'right', typ: u(undefined, '') }, + { json: 'top', js: 'top', typ: u(undefined, '') }, + { json: 'transition', js: 'transition', typ: u(undefined, '') }, + { json: 'width', js: 'width', typ: u(undefined, '') }, + { json: 'zIndex', js: 'zIndex', typ: u(undefined, '') }, + ], + 'any' + ), + Fdc3UserInterfaceMessage: o( + [ + { json: 'payload', js: 'payload', typ: u(undefined, m('any')) }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceMessageType') }, + ], + false + ), + Fdc3UserInterfaceResolve: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceResolvePayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceResolveType') }, + ], + false + ), + Fdc3UserInterfaceResolvePayload: o( + [ + { json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + AppIntent: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadata')) }, + { json: 'intent', js: 'intent', typ: r('IntentMetadata') }, + ], + false + ), + AppMetadata: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'description', js: 'description', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'icons', js: 'icons', typ: u(undefined, a(r('Icon'))) }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, + { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('Image'))) }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + Icon: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + Image: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + IntentMetadata: o( + [ + { json: 'displayName', js: 'displayName', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: '' }, + ], + false + ), + Fdc3UserInterfaceResolveAction: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceResolveActionPayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceResolveActionType') }, + ], + false + ), + Fdc3UserInterfaceResolveActionPayload: o( + [ + { json: 'action', js: 'action', typ: r('Action') }, + { json: 'appIdentifier', js: 'appIdentifier', typ: u(undefined, r('AppIdentifier')) }, + { json: 'intent', js: 'intent', typ: u(undefined, '') }, + ], + false + ), + Fdc3UserInterfaceRestyle: o( + [ + { json: 'payload', js: 'payload', typ: r('Fdc3UserInterfaceRestylePayload') }, + { json: 'type', js: 'type', typ: r('Fdc3UserInterfaceRestyleType') }, + ], + false + ), + Fdc3UserInterfaceRestylePayload: o([{ json: 'updatedCSS', js: 'updatedCSS', typ: r('UpdatedCSS') }], false), + UpdatedCSS: o( + [ + { json: 'bottom', js: 'bottom', typ: u(undefined, '') }, + { json: 'height', js: 'height', typ: u(undefined, '') }, + { json: 'left', js: 'left', typ: u(undefined, '') }, + { json: 'maxHeight', js: 'maxHeight', typ: u(undefined, '') }, + { json: 'maxWidth', js: 'maxWidth', typ: u(undefined, '') }, + { json: 'right', js: 'right', typ: u(undefined, '') }, + { json: 'top', js: 'top', typ: u(undefined, '') }, + { json: 'transition', js: 'transition', typ: u(undefined, '') }, + { json: 'width', js: 'width', typ: u(undefined, '') }, + { json: 'zIndex', js: 'zIndex', typ: u(undefined, '') }, + ], + 'any' + ), + FindInstancesRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesRequestType') }, + ], + false + ), + FindInstancesRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + FindInstancesResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesResponseType') }, + ], + false + ), + FindInstancesResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'appIdentifiers', js: 'appIdentifiers', typ: u(undefined, a(r('AppMetadata'))) }, + ], + false + ), + FindIntentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentRequestType') }, + ], + false + ), + FindIntentRequestPayload: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + { json: 'intent', js: 'intent', typ: '' }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentResponseType') }, + ], + false + ), + FindIntentResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'appIntent', js: 'appIntent', typ: u(undefined, r('AppIntent')) }, + ], + false + ), + FindIntentsByContextRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextRequestType') }, + ], + false + ), + FindIntentsByContextRequestPayload: o( + [ + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentsByContextResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextResponseType') }, + ], + false + ), + FindIntentsByContextResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'appIntents', js: 'appIntents', typ: u(undefined, a(r('AppIntent'))) }, + ], + false + ), + GetAppMetadataRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataRequestType') }, + ], + false + ), + GetAppMetadataRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + GetAppMetadataResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataResponseType') }, + ], + false + ), + GetAppMetadataResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'appMetadata', js: 'appMetadata', typ: u(undefined, r('AppMetadata')) }, + ], + false + ), + GetCurrentChannelRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetCurrentChannelRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetCurrentChannelRequestType') }, + ], + false + ), + GetCurrentChannelRequestPayload: o([], false), + GetCurrentChannelResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetCurrentChannelResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetCurrentChannelResponseType') }, + ], + false + ), + GetCurrentChannelResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }, + { json: 'channel', js: 'channel', typ: u(undefined, u(r('Channel'), null)) }, + ], + false + ), + GetCurrentContextRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetCurrentContextRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetCurrentContextRequestType') }, + ], + false + ), + GetCurrentContextRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + GetCurrentContextResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetCurrentContextResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetCurrentContextResponseType') }, + ], + false + ), + GetCurrentContextResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'context', js: 'context', typ: u(undefined, u(null, r('Context'))) }, + ], + false + ), + GetInfoRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetInfoRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetInfoRequestType') }, + ], + false + ), + GetInfoRequestPayload: o([], false), + GetInfoResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetInfoResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetInfoResponseType') }, + ], + false + ), + GetInfoResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: u(undefined, r('ImplementationMetadata')) }, + ], + false + ), + ImplementationMetadata: o( + [ + { json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('OptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + OptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + GetOrCreateChannelRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetOrCreateChannelRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetOrCreateChannelRequestType') }, + ], + false + ), + GetOrCreateChannelRequestPayload: o([{ json: 'channelId', js: 'channelId', typ: '' }], false), + GetOrCreateChannelResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetOrCreateChannelResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetOrCreateChannelResponseType') }, + ], + false + ), + GetOrCreateChannelResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('Channel')) }, + ], + false + ), + GetUserChannelsRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetUserChannelsRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetUserChannelsRequestType') }, + ], + false + ), + GetUserChannelsRequestPayload: o([], false), + GetUserChannelsResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetUserChannelsResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetUserChannelsResponseType') }, + ], + false + ), + GetUserChannelsResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'userChannels', js: 'userChannels', typ: u(undefined, a(r('Channel'))) }, + ], + false + ), + HeartbeatAcknowledgementRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('HeartbeatAcknowledgementRequestPayload') }, + { json: 'type', js: 'type', typ: r('HeartbeatAcknowledgementRequestType') }, + ], + false + ), + HeartbeatAcknowledgementRequestPayload: o([{ json: 'heartbeatEventUuid', js: 'heartbeatEventUuid', typ: '' }], false), + HeartbeatEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('HeartbeatEventPayload') }, + { json: 'type', js: 'type', typ: r('HeartbeatEventType') }, + ], + false + ), + HeartbeatEventPayload: o([], false), + IntentEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('IntentEventPayload') }, + { json: 'type', js: 'type', typ: r('IntentEventType') }, + ], + false + ), + IntentEventPayload: o( + [ + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'intent', js: 'intent', typ: '' }, + { json: 'originatingApp', js: 'originatingApp', typ: u(undefined, r('AppIdentifier')) }, + { json: 'raiseIntentRequestUuid', js: 'raiseIntentRequestUuid', typ: '' }, + ], + false + ), + IntentListenerUnsubscribeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('IntentListenerUnsubscribeRequestPayload') }, + { json: 'type', js: 'type', typ: r('IntentListenerUnsubscribeRequestType') }, + ], + false + ), + IntentListenerUnsubscribeRequestPayload: o([{ json: 'listenerUUID', js: 'listenerUUID', typ: '' }], false), + IntentListenerUnsubscribeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('IntentListenerUnsubscribeResponseType') }, + ], + false + ), + IntentResultRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('IntentResultRequestPayload') }, + { json: 'type', js: 'type', typ: r('IntentResultRequestType') }, + ], + false + ), + IntentResultRequestPayload: o( + [ + { json: 'intentEventUuid', js: 'intentEventUuid', typ: '' }, + { json: 'intentResult', js: 'intentResult', typ: r('IntentResult') }, + { json: 'raiseIntentRequestUuid', js: 'raiseIntentRequestUuid', typ: '' }, + ], + false + ), + IntentResult: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('Channel')) }, + ], + false + ), + IntentResultResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('IntentResultResponseType') }, + ], + false + ), + JoinUserChannelRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('JoinUserChannelRequestPayload') }, + { json: 'type', js: 'type', typ: r('JoinUserChannelRequestType') }, + ], + false + ), + JoinUserChannelRequestPayload: o([{ json: 'channelId', js: 'channelId', typ: '' }], false), + JoinUserChannelResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('JoinUserChannelResponsePayload') }, + { json: 'type', js: 'type', typ: r('JoinUserChannelResponseType') }, + ], + false + ), + JoinUserChannelResponsePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }], false), + LeaveCurrentChannelRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('LeaveCurrentChannelRequestPayload') }, + { json: 'type', js: 'type', typ: r('LeaveCurrentChannelRequestType') }, + ], + false + ), + LeaveCurrentChannelRequestPayload: o([], false), + LeaveCurrentChannelResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('LeaveCurrentChannelResponsePayload') }, + { json: 'type', js: 'type', typ: r('LeaveCurrentChannelResponseType') }, + ], + false + ), + LeaveCurrentChannelResponsePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }], false), + OpenRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenRequestPayload') }, + { json: 'type', js: 'type', typ: r('OpenRequestType') }, + ], + false + ), + OpenRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('AppIdentifier') }, + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + ], + false + ), + OpenResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenResponsePayload') }, + { json: 'type', js: 'type', typ: r('OpenResponseType') }, + ], + false + ), + OpenResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('OpenErrorResponsePayload')) }, + { json: 'appIdentifier', js: 'appIdentifier', typ: u(undefined, r('AppIdentifier')) }, + ], + false + ), + PrivateChannelAddEventListenerRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelAddEventListenerRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelAddEventListenerRequestType') }, + ], + false + ), + PrivateChannelAddEventListenerRequestPayload: o( + [ + { json: 'listenerType', js: 'listenerType', typ: u(r('PrivateChannelEventType'), null) }, + { json: 'privateChannelId', js: 'privateChannelId', typ: '' }, + ], + false + ), + PrivateChannelAddEventListenerResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelAddEventListenerResponsePayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelAddEventListenerResponseType') }, + ], + false + ), + PrivateChannelAddEventListenerResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }, + { json: 'listenerUUID', js: 'listenerUUID', typ: u(undefined, '') }, + ], + false + ), + PrivateChannelDisconnectRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelDisconnectRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelDisconnectRequestType') }, + ], + false + ), + PrivateChannelDisconnectRequestPayload: o([{ json: 'channelId', js: 'channelId', typ: '' }], false), + PrivateChannelDisconnectResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelDisconnectResponsePayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelDisconnectResponseType') }, + ], + false + ), + PrivateChannelDisconnectResponsePayload: o( + [{ json: 'error', js: 'error', typ: u(undefined, r('PurpleError')) }], + false + ), + PrivateChannelOnAddContextListenerEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerEventPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnAddContextListenerEventType') }, + ], + false + ), + PrivateChannelOnAddContextListenerEventPayload: o( + [ + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + { json: 'privateChannelId', js: 'privateChannelId', typ: '' }, + ], + false + ), + PrivateChannelOnDisconnectEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectEventPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnDisconnectEventType') }, + ], + false + ), + PrivateChannelOnDisconnectEventPayload: o([{ json: 'privateChannelId', js: 'privateChannelId', typ: '' }], false), + PrivateChannelOnUnsubscribeEvent: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastEventMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeEventPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnUnsubscribeEventType') }, + ], + false + ), + PrivateChannelOnUnsubscribeEventPayload: o( + [ + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + { json: 'privateChannelId', js: 'privateChannelId', typ: '' }, + ], + false + ), + PrivateChannelUnsubscribeEventListenerRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelUnsubscribeEventListenerRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelUnsubscribeEventListenerRequestType') }, + ], + false + ), + PrivateChannelUnsubscribeEventListenerRequestPayload: o( + [{ json: 'listenerUUID', js: 'listenerUUID', typ: '' }], + false + ), + PrivateChannelUnsubscribeEventListenerResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastResponseResponsePayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelUnsubscribeEventListenerResponseType') }, + ], + false + ), + RaiseIntentForContextRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentForContextRequestPayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentForContextRequestType') }, + ], + false + ), + RaiseIntentForContextRequestPayload: o( + [ + { json: 'app', js: 'app', typ: u(undefined, r('AppIdentifier')) }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + RaiseIntentForContextResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentForContextResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentForContextResponseType') }, + ], + false + ), + RaiseIntentForContextResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'intentResolution', js: 'intentResolution', typ: u(undefined, r('IntentResolution')) }, + { json: 'appIntents', js: 'appIntents', typ: u(undefined, a(r('AppIntent'))) }, + ], + false + ), + IntentResolution: o( + [ + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('AppIdentifier') }, + ], + false + ), + RaiseIntentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentRequestPayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentRequestType') }, + ], + false + ), + RaiseIntentRequestPayload: o( + [ + { json: 'app', js: 'app', typ: u(undefined, r('AppIdentifier')) }, + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'intent', js: 'intent', typ: '' }, + ], + false + ), + RaiseIntentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResponseType') }, + ], + false + ), + RaiseIntentResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('FindInstancesErrors')) }, + { json: 'intentResolution', js: 'intentResolution', typ: u(undefined, r('IntentResolution')) }, + { json: 'appIntent', js: 'appIntent', typ: u(undefined, r('AppIntent')) }, + ], + false + ), + RaiseIntentResultResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AddContextListenerResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResultResponseType') }, + ], + false + ), + RaiseIntentResultResponsePayload: o( + [ + { json: 'error', js: 'error', typ: u(undefined, r('ResponsePayloadError')) }, + { json: 'intentResult', js: 'intentResult', typ: u(undefined, r('IntentResult')) }, + ], + false + ), + WebConnectionProtocol1Hello: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol1HelloPayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol1HelloType') }, + ], + false + ), + WebConnectionProtocol1HelloMeta: o( + [ + { json: 'connectionAttemptUuid', js: 'connectionAttemptUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + WebConnectionProtocol1HelloPayload: o( + [ + { json: 'actualUrl', js: 'actualUrl', typ: '' }, + { json: 'channelSelector', js: 'channelSelector', typ: u(undefined, true) }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'identityUrl', js: 'identityUrl', typ: '' }, + { json: 'intentResolver', js: 'intentResolver', typ: u(undefined, true) }, + ], + 'any' + ), + WebConnectionProtocol2LoadURL: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol2LoadURLPayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol2LoadURLType') }, + ], + false + ), + WebConnectionProtocol2LoadURLPayload: o([{ json: 'iframeUrl', js: 'iframeUrl', typ: '' }], 'any'), + WebConnectionProtocol3Handshake: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol3HandshakePayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol3HandshakeType') }, + ], + false + ), + WebConnectionProtocol3HandshakePayload: o( + [ + { json: 'appLaunchTimeout', js: 'appLaunchTimeout', typ: u(undefined, 3.14) }, + { json: 'channelSelectorUrl', js: 'channelSelectorUrl', typ: u(true, '') }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'intentResolverUrl', js: 'intentResolverUrl', typ: u(true, '') }, + { json: 'messageExchangeTimeout', js: 'messageExchangeTimeout', typ: u(undefined, 3.14) }, + ], + false + ), + WebConnectionProtocol4ValidateAppIdentity: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol4ValidateAppIdentityPayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol4ValidateAppIdentityType') }, + ], + false + ), + WebConnectionProtocol4ValidateAppIdentityPayload: o( + [ + { json: 'actualUrl', js: 'actualUrl', typ: '' }, + { json: 'identityUrl', js: 'identityUrl', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceUuid', js: 'instanceUuid', typ: u(undefined, '') }, + ], + false + ), + WebConnectionProtocol5ValidateAppIdentityFailedResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol5ValidateAppIdentityFailedResponseType') }, + ], + false + ), + WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload: o( + [{ json: 'message', js: 'message', typ: u(undefined, '') }], + false + ), + WebConnectionProtocol5ValidateAppIdentitySuccessResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol1HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol5ValidateAppIdentitySuccessResponseType') }, + ], + false + ), + WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ImplementationMetadata') }, + { json: 'instanceId', js: 'instanceId', typ: '' }, + { json: 'instanceUuid', js: 'instanceUuid', typ: '' }, + ], + false + ), + WebConnectionProtocol6Goodbye: o( + [ + { json: 'meta', js: 'meta', typ: r('WebConnectionProtocol6GoodbyeMeta') }, + { json: 'type', js: 'type', typ: r('WebConnectionProtocol6GoodbyeType') }, + ], + false + ), + WebConnectionProtocol6GoodbyeMeta: o([{ json: 'timestamp', js: 'timestamp', typ: Date }], false), + WebConnectionProtocolMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStepMetadata') }, + { json: 'payload', js: 'payload', typ: u(undefined, m('any')) }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, + ], + false + ), + ConnectionStepMetadata: o( + [ + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'connectionAttemptUuid', js: 'connectionAttemptUuid', typ: u(undefined, '') }, + ], + false + ), + AddContextListenerRequestType: ['addContextListenerRequest'], + PurpleError: ['ApiTimeout', 'AccessDenied', 'CreationFailed', 'MalformedContext', 'NoChannelFound'], + AddContextListenerResponseType: ['addContextListenerResponse'], + FDC3EventType: ['USER_CHANNEL_CHANGED'], + AddEventListenerRequestType: ['addEventListenerRequest'], + ResponsePayloadError: [ + 'ApiTimeout', + 'AccessDenied', + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'CreationFailed', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'IntentDeliveryFailed', + 'IntentHandlerRejected', + 'MalformedContext', + 'MalformedMessage', + 'NoAppsFound', + 'NoChannelFound', + 'NoResultReturned', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + AddEventListenerResponseType: ['addEventListenerResponse'], + AddIntentListenerRequestType: ['addIntentListenerRequest'], + FluffyError: [ + 'ApiTimeout', + 'DesktopAgentNotFound', + 'IntentDeliveryFailed', + 'MalformedContext', + 'NoAppsFound', + 'ResolverTimeout', + 'ResolverUnavailable', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + AddIntentListenerResponseType: ['addIntentListenerResponse'], + EventMessageType: [ + 'addEventListenerEvent', + 'broadcastEvent', + 'channelChangedEvent', + 'heartbeatEvent', + 'intentEvent', + 'privateChannelOnAddContextListenerEvent', + 'privateChannelOnDisconnectEvent', + 'privateChannelOnUnsubscribeEvent', + ], + ResponseMessageType: [ + 'addContextListenerResponse', + 'addEventListenerResponse', + 'addIntentListenerResponse', + 'broadcastResponse', + 'contextListenerUnsubscribeResponse', + 'createPrivateChannelResponse', + 'eventListenerUnsubscribeResponse', + 'findInstancesResponse', + 'findIntentResponse', + 'findIntentsByContextResponse', + 'getAppMetadataResponse', + 'getCurrentChannelResponse', + 'getCurrentContextResponse', + 'getInfoResponse', + 'getOrCreateChannelResponse', + 'getUserChannelsResponse', + 'intentListenerUnsubscribeResponse', + 'intentResultResponse', + 'joinUserChannelResponse', + 'leaveCurrentChannelResponse', + 'openResponse', + 'privateChannelAddEventListenerResponse', + 'privateChannelDisconnectResponse', + 'privateChannelUnsubscribeEventListenerResponse', + 'raiseIntentForContextResponse', + 'raiseIntentResponse', + 'raiseIntentResultResponse', + ], + RequestMessageType: [ + 'addContextListenerRequest', + 'addEventListenerRequest', + 'addIntentListenerRequest', + 'broadcastRequest', + 'contextListenerUnsubscribeRequest', + 'createPrivateChannelRequest', + 'eventListenerUnsubscribeRequest', + 'findInstancesRequest', + 'findIntentRequest', + 'findIntentsByContextRequest', + 'getAppMetadataRequest', + 'getCurrentChannelRequest', + 'getCurrentContextRequest', + 'getInfoRequest', + 'getOrCreateChannelRequest', + 'getUserChannelsRequest', + 'heartbeatAcknowledgementRequest', + 'intentListenerUnsubscribeRequest', + 'intentResultRequest', + 'joinUserChannelRequest', + 'leaveCurrentChannelRequest', + 'openRequest', + 'privateChannelAddEventListenerRequest', + 'privateChannelDisconnectRequest', + 'privateChannelUnsubscribeEventListenerRequest', + 'raiseIntentForContextRequest', + 'raiseIntentRequest', + ], + BroadcastEventType: ['broadcastEvent'], + BroadcastRequestType: ['broadcastRequest'], + BroadcastResponseType: ['broadcastResponse'], + ChannelChangedEventType: ['channelChangedEvent'], + ContextListenerUnsubscribeRequestType: ['contextListenerUnsubscribeRequest'], + ContextListenerUnsubscribeResponseType: ['contextListenerUnsubscribeResponse'], + CreatePrivateChannelRequestType: ['createPrivateChannelRequest'], + Type: ['app', 'private', 'user'], + CreatePrivateChannelResponseType: ['createPrivateChannelResponse'], + EventListenerUnsubscribeRequestType: ['eventListenerUnsubscribeRequest'], + EventListenerUnsubscribeResponseType: ['eventListenerUnsubscribeResponse'], + Fdc3UserInterfaceChannelsType: ['Fdc3UserInterfaceChannels'], + Fdc3UserInterfaceChannelSelectedType: ['Fdc3UserInterfaceChannelSelected'], + Fdc3UserInterfaceDragType: ['Fdc3UserInterfaceDrag'], + Fdc3UserInterfaceHandshakeType: ['Fdc3UserInterfaceHandshake'], + Fdc3UserInterfaceHelloType: ['Fdc3UserInterfaceHello'], + Fdc3UserInterfaceMessageType: [ + 'Fdc3UserInterfaceChannelSelected', + 'Fdc3UserInterfaceChannels', + 'Fdc3UserInterfaceDrag', + 'Fdc3UserInterfaceHandshake', + 'Fdc3UserInterfaceHello', + 'Fdc3UserInterfaceResolve', + 'Fdc3UserInterfaceResolveAction', + 'Fdc3UserInterfaceRestyle', + ], + Fdc3UserInterfaceResolveType: ['Fdc3UserInterfaceResolve'], + Action: ['cancel', 'click', 'hover'], + Fdc3UserInterfaceResolveActionType: ['Fdc3UserInterfaceResolveAction'], + Fdc3UserInterfaceRestyleType: ['Fdc3UserInterfaceRestyle'], + FindInstancesRequestType: ['findInstancesRequest'], + FindInstancesErrors: [ + 'ApiTimeout', + 'AgentDisconnected', + 'DesktopAgentNotFound', + 'IntentDeliveryFailed', + 'MalformedContext', + 'MalformedMessage', + 'NoAppsFound', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + FindInstancesResponseType: ['findInstancesResponse'], + FindIntentRequestType: ['findIntentRequest'], + FindIntentResponseType: ['findIntentResponse'], + FindIntentsByContextRequestType: ['findIntentsByContextRequest'], + FindIntentsByContextResponseType: ['findIntentsByContextResponse'], + GetAppMetadataRequestType: ['getAppMetadataRequest'], + GetAppMetadataResponseType: ['getAppMetadataResponse'], + GetCurrentChannelRequestType: ['getCurrentChannelRequest'], + GetCurrentChannelResponseType: ['getCurrentChannelResponse'], + GetCurrentContextRequestType: ['getCurrentContextRequest'], + GetCurrentContextResponseType: ['getCurrentContextResponse'], + GetInfoRequestType: ['getInfoRequest'], + GetInfoResponseType: ['getInfoResponse'], + GetOrCreateChannelRequestType: ['getOrCreateChannelRequest'], + GetOrCreateChannelResponseType: ['getOrCreateChannelResponse'], + GetUserChannelsRequestType: ['getUserChannelsRequest'], + GetUserChannelsResponseType: ['getUserChannelsResponse'], + HeartbeatAcknowledgementRequestType: ['heartbeatAcknowledgementRequest'], + HeartbeatEventType: ['heartbeatEvent'], + IntentEventType: ['intentEvent'], + IntentListenerUnsubscribeRequestType: ['intentListenerUnsubscribeRequest'], + IntentListenerUnsubscribeResponseType: ['intentListenerUnsubscribeResponse'], + IntentResultRequestType: ['intentResultRequest'], + IntentResultResponseType: ['intentResultResponse'], + JoinUserChannelRequestType: ['joinUserChannelRequest'], + JoinUserChannelResponseType: ['joinUserChannelResponse'], + LeaveCurrentChannelRequestType: ['leaveCurrentChannelRequest'], + LeaveCurrentChannelResponseType: ['leaveCurrentChannelResponse'], + OpenRequestType: ['openRequest'], + OpenErrorResponsePayload: [ + 'ApiTimeout', + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'MalformedContext', + 'MalformedMessage', + 'NotConnectedToBridge', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + ], + OpenResponseType: ['openResponse'], + PrivateChannelEventType: ['addContextListener', 'disconnect', 'unsubscribe'], + PrivateChannelAddEventListenerRequestType: ['privateChannelAddEventListenerRequest'], + PrivateChannelAddEventListenerResponseType: ['privateChannelAddEventListenerResponse'], + PrivateChannelDisconnectRequestType: ['privateChannelDisconnectRequest'], + PrivateChannelDisconnectResponseType: ['privateChannelDisconnectResponse'], + PrivateChannelOnAddContextListenerEventType: ['privateChannelOnAddContextListenerEvent'], + PrivateChannelOnDisconnectEventType: ['privateChannelOnDisconnectEvent'], + PrivateChannelOnUnsubscribeEventType: ['privateChannelOnUnsubscribeEvent'], + PrivateChannelUnsubscribeEventListenerRequestType: ['privateChannelUnsubscribeEventListenerRequest'], + PrivateChannelUnsubscribeEventListenerResponseType: ['privateChannelUnsubscribeEventListenerResponse'], + RaiseIntentForContextRequestType: ['raiseIntentForContextRequest'], + RaiseIntentForContextResponseType: ['raiseIntentForContextResponse'], + RaiseIntentRequestType: ['raiseIntentRequest'], + RaiseIntentResponseType: ['raiseIntentResponse'], + RaiseIntentResultResponseType: ['raiseIntentResultResponse'], + WebConnectionProtocol1HelloType: ['WCP1Hello'], + WebConnectionProtocol2LoadURLType: ['WCP2LoadUrl'], + WebConnectionProtocol3HandshakeType: ['WCP3Handshake'], + WebConnectionProtocol4ValidateAppIdentityType: ['WCP4ValidateAppIdentity'], + WebConnectionProtocol5ValidateAppIdentityFailedResponseType: ['WCP5ValidateAppIdentityFailedResponse'], + WebConnectionProtocol5ValidateAppIdentitySuccessResponseType: ['WCP5ValidateAppIdentityResponse'], + WebConnectionProtocol6GoodbyeType: ['WCP6Goodbye'], + ConnectionStepMessageType: [ + 'WCP1Hello', + 'WCP2LoadUrl', + 'WCP3Handshake', + 'WCP4ValidateAppIdentity', + 'WCP5ValidateAppIdentityFailedResponse', + 'WCP5ValidateAppIdentityResponse', + 'WCP6Goodbye', + ], +}; + +export type AppRequestMessage = + | AddContextListenerRequest + | AddEventListenerRequest + | AddIntentListenerRequest + | BroadcastRequest + | ContextListenerUnsubscribeRequest + | CreatePrivateChannelRequest + | EventListenerUnsubscribeRequest + | FindInstancesRequest + | FindIntentRequest + | FindIntentsByContextRequest + | GetAppMetadataRequest + | GetCurrentChannelRequest + | GetCurrentContextRequest + | GetInfoRequest + | GetOrCreateChannelRequest + | GetUserChannelsRequest + | HeartbeatAcknowledgementRequest + | IntentListenerUnsubscribeRequest + | IntentResultRequest + | JoinUserChannelRequest + | LeaveCurrentChannelRequest + | OpenRequest + | PrivateChannelAddEventListenerRequest + | PrivateChannelDisconnectRequest + | PrivateChannelUnsubscribeEventListenerRequest + | RaiseIntentForContextRequest + | RaiseIntentRequest; + +export type AgentResponseMessage = + | AddContextListenerResponse + | AddEventListenerResponse + | AddIntentListenerResponse + | BroadcastResponse + | ContextListenerUnsubscribeResponse + | CreatePrivateChannelResponse + | EventListenerUnsubscribeResponse + | FindInstancesResponse + | FindIntentResponse + | FindIntentsByContextResponse + | GetAppMetadataResponse + | GetCurrentChannelResponse + | GetCurrentContextResponse + | GetInfoResponse + | GetOrCreateChannelResponse + | GetUserChannelsResponse + | IntentListenerUnsubscribeResponse + | IntentResultResponse + | JoinUserChannelResponse + | LeaveCurrentChannelResponse + | OpenResponse + | PrivateChannelAddEventListenerResponse + | PrivateChannelDisconnectResponse + | PrivateChannelUnsubscribeEventListenerResponse + | RaiseIntentForContextResponse + | RaiseIntentResponse + | RaiseIntentResultResponse; + +export type AgentEventMessage = + | BroadcastEvent + | ChannelChangedEvent + | HeartbeatEvent + | IntentEvent + | PrivateChannelOnAddContextListenerEvent + | PrivateChannelOnDisconnectEvent + | PrivateChannelOnUnsubscribeEvent; + +/** + * Returns true if the value has a type property with value 'addContextListenerRequest'. This is a fast check that does not check the format of the message + */ +export function isAddContextListenerRequest(value: any): value is AddContextListenerRequest { + return value != null && value.type === 'addContextListenerRequest'; +} + +/** + * Returns true if value is a valid AddContextListenerRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddContextListenerRequest(value: any): value is AddContextListenerRequest { + try { + Convert.addContextListenerRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_CONTEXT_LISTENER_REQUEST_TYPE = 'AddContextListenerRequest'; + +/** + * Returns true if the value has a type property with value 'addContextListenerResponse'. This is a fast check that does not check the format of the message + */ +export function isAddContextListenerResponse(value: any): value is AddContextListenerResponse { + return value != null && value.type === 'addContextListenerResponse'; +} + +/** + * Returns true if value is a valid AddContextListenerResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddContextListenerResponse(value: any): value is AddContextListenerResponse { + try { + Convert.addContextListenerResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_CONTEXT_LISTENER_RESPONSE_TYPE = 'AddContextListenerResponse'; + +/** + * Returns true if the value has a type property with value 'addEventListenerRequest'. This is a fast check that does not check the format of the message + */ +export function isAddEventListenerRequest(value: any): value is AddEventListenerRequest { + return value != null && value.type === 'addEventListenerRequest'; +} + +/** + * Returns true if value is a valid AddEventListenerRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddEventListenerRequest(value: any): value is AddEventListenerRequest { + try { + Convert.addEventListenerRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_EVENT_LISTENER_REQUEST_TYPE = 'AddEventListenerRequest'; + +/** + * Returns true if the value has a type property with value 'addEventListenerResponse'. This is a fast check that does not check the format of the message + */ +export function isAddEventListenerResponse(value: any): value is AddEventListenerResponse { + return value != null && value.type === 'addEventListenerResponse'; +} + +/** + * Returns true if value is a valid AddEventListenerResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddEventListenerResponse(value: any): value is AddEventListenerResponse { + try { + Convert.addEventListenerResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_EVENT_LISTENER_RESPONSE_TYPE = 'AddEventListenerResponse'; + +/** + * Returns true if the value has a type property with value 'addIntentListenerRequest'. This is a fast check that does not check the format of the message + */ +export function isAddIntentListenerRequest(value: any): value is AddIntentListenerRequest { + return value != null && value.type === 'addIntentListenerRequest'; +} + +/** + * Returns true if value is a valid AddIntentListenerRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddIntentListenerRequest(value: any): value is AddIntentListenerRequest { + try { + Convert.addIntentListenerRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_INTENT_LISTENER_REQUEST_TYPE = 'AddIntentListenerRequest'; + +/** + * Returns true if the value has a type property with value 'addIntentListenerResponse'. This is a fast check that does not check the format of the message + */ +export function isAddIntentListenerResponse(value: any): value is AddIntentListenerResponse { + return value != null && value.type === 'addIntentListenerResponse'; +} + +/** + * Returns true if value is a valid AddIntentListenerResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidAddIntentListenerResponse(value: any): value is AddIntentListenerResponse { + try { + Convert.addIntentListenerResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const ADD_INTENT_LISTENER_RESPONSE_TYPE = 'AddIntentListenerResponse'; + +/** + * Returns true if the value has a type property with value 'broadcastEvent'. This is a fast check that does not check the format of the message + */ +export function isBroadcastEvent(value: any): value is BroadcastEvent { + return value != null && value.type === 'broadcastEvent'; +} + +/** + * Returns true if value is a valid BroadcastEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidBroadcastEvent(value: any): value is BroadcastEvent { + try { + Convert.broadcastEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const BROADCAST_EVENT_TYPE = 'BroadcastEvent'; + +/** + * Returns true if the value has a type property with value 'broadcastRequest'. This is a fast check that does not check the format of the message + */ +export function isBroadcastRequest(value: any): value is BroadcastRequest { + return value != null && value.type === 'broadcastRequest'; +} + +/** + * Returns true if value is a valid BroadcastRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidBroadcastRequest(value: any): value is BroadcastRequest { + try { + Convert.broadcastRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const BROADCAST_REQUEST_TYPE = 'BroadcastRequest'; + +/** + * Returns true if the value has a type property with value 'broadcastResponse'. This is a fast check that does not check the format of the message + */ +export function isBroadcastResponse(value: any): value is BroadcastResponse { + return value != null && value.type === 'broadcastResponse'; +} + +/** + * Returns true if value is a valid BroadcastResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidBroadcastResponse(value: any): value is BroadcastResponse { + try { + Convert.broadcastResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const BROADCAST_RESPONSE_TYPE = 'BroadcastResponse'; + +/** + * Returns true if the value has a type property with value 'channelChangedEvent'. This is a fast check that does not check the format of the message + */ +export function isChannelChangedEvent(value: any): value is ChannelChangedEvent { + return value != null && value.type === 'channelChangedEvent'; +} + +/** + * Returns true if value is a valid ChannelChangedEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidChannelChangedEvent(value: any): value is ChannelChangedEvent { + try { + Convert.channelChangedEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const CHANNEL_CHANGED_EVENT_TYPE = 'ChannelChangedEvent'; + +/** + * Returns true if the value has a type property with value 'contextListenerUnsubscribeRequest'. This is a fast check that does not check the format of the message + */ +export function isContextListenerUnsubscribeRequest(value: any): value is ContextListenerUnsubscribeRequest { + return value != null && value.type === 'contextListenerUnsubscribeRequest'; +} + +/** + * Returns true if value is a valid ContextListenerUnsubscribeRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidContextListenerUnsubscribeRequest(value: any): value is ContextListenerUnsubscribeRequest { + try { + Convert.contextListenerUnsubscribeRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const CONTEXT_LISTENER_UNSUBSCRIBE_REQUEST_TYPE = 'ContextListenerUnsubscribeRequest'; + +/** + * Returns true if the value has a type property with value 'contextListenerUnsubscribeResponse'. This is a fast check that does not check the format of the message + */ +export function isContextListenerUnsubscribeResponse(value: any): value is ContextListenerUnsubscribeResponse { + return value != null && value.type === 'contextListenerUnsubscribeResponse'; +} + +/** + * Returns true if value is a valid ContextListenerUnsubscribeResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidContextListenerUnsubscribeResponse(value: any): value is ContextListenerUnsubscribeResponse { + try { + Convert.contextListenerUnsubscribeResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const CONTEXT_LISTENER_UNSUBSCRIBE_RESPONSE_TYPE = 'ContextListenerUnsubscribeResponse'; + +/** + * Returns true if the value has a type property with value 'createPrivateChannelRequest'. This is a fast check that does not check the format of the message + */ +export function isCreatePrivateChannelRequest(value: any): value is CreatePrivateChannelRequest { + return value != null && value.type === 'createPrivateChannelRequest'; +} + +/** + * Returns true if value is a valid CreatePrivateChannelRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidCreatePrivateChannelRequest(value: any): value is CreatePrivateChannelRequest { + try { + Convert.createPrivateChannelRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const CREATE_PRIVATE_CHANNEL_REQUEST_TYPE = 'CreatePrivateChannelRequest'; + +/** + * Returns true if the value has a type property with value 'createPrivateChannelResponse'. This is a fast check that does not check the format of the message + */ +export function isCreatePrivateChannelResponse(value: any): value is CreatePrivateChannelResponse { + return value != null && value.type === 'createPrivateChannelResponse'; +} + +/** + * Returns true if value is a valid CreatePrivateChannelResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidCreatePrivateChannelResponse(value: any): value is CreatePrivateChannelResponse { + try { + Convert.createPrivateChannelResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const CREATE_PRIVATE_CHANNEL_RESPONSE_TYPE = 'CreatePrivateChannelResponse'; + +/** + * Returns true if the value has a type property with value 'eventListenerUnsubscribeRequest'. This is a fast check that does not check the format of the message + */ +export function isEventListenerUnsubscribeRequest(value: any): value is EventListenerUnsubscribeRequest { + return value != null && value.type === 'eventListenerUnsubscribeRequest'; +} + +/** + * Returns true if value is a valid EventListenerUnsubscribeRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidEventListenerUnsubscribeRequest(value: any): value is EventListenerUnsubscribeRequest { + try { + Convert.eventListenerUnsubscribeRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const EVENT_LISTENER_UNSUBSCRIBE_REQUEST_TYPE = 'EventListenerUnsubscribeRequest'; + +/** + * Returns true if the value has a type property with value 'eventListenerUnsubscribeResponse'. This is a fast check that does not check the format of the message + */ +export function isEventListenerUnsubscribeResponse(value: any): value is EventListenerUnsubscribeResponse { + return value != null && value.type === 'eventListenerUnsubscribeResponse'; +} + +/** + * Returns true if value is a valid EventListenerUnsubscribeResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidEventListenerUnsubscribeResponse(value: any): value is EventListenerUnsubscribeResponse { + try { + Convert.eventListenerUnsubscribeResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const EVENT_LISTENER_UNSUBSCRIBE_RESPONSE_TYPE = 'EventListenerUnsubscribeResponse'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceChannels'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceChannels(value: any): value is Fdc3UserInterfaceChannels { + return value != null && value.type === 'Fdc3UserInterfaceChannels'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceChannels. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceChannels(value: any): value is Fdc3UserInterfaceChannels { + try { + Convert.fdc3UserInterfaceChannelsToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_CHANNELS_TYPE = 'Fdc3UserInterfaceChannels'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceChannelSelected'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceChannelSelected(value: any): value is Fdc3UserInterfaceChannelSelected { + return value != null && value.type === 'Fdc3UserInterfaceChannelSelected'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceChannelSelected. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceChannelSelected(value: any): value is Fdc3UserInterfaceChannelSelected { + try { + Convert.fdc3UserInterfaceChannelSelectedToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_CHANNEL_SELECTED_TYPE = 'Fdc3UserInterfaceChannelSelected'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceDrag'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceDrag(value: any): value is Fdc3UserInterfaceDrag { + return value != null && value.type === 'Fdc3UserInterfaceDrag'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceDrag. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceDrag(value: any): value is Fdc3UserInterfaceDrag { + try { + Convert.fdc3UserInterfaceDragToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_DRAG_TYPE = 'Fdc3UserInterfaceDrag'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceHandshake'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceHandshake(value: any): value is Fdc3UserInterfaceHandshake { + return value != null && value.type === 'Fdc3UserInterfaceHandshake'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceHandshake. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceHandshake(value: any): value is Fdc3UserInterfaceHandshake { + try { + Convert.fdc3UserInterfaceHandshakeToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_HANDSHAKE_TYPE = 'Fdc3UserInterfaceHandshake'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceHello'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceHello(value: any): value is Fdc3UserInterfaceHello { + return value != null && value.type === 'Fdc3UserInterfaceHello'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceHello. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceHello(value: any): value is Fdc3UserInterfaceHello { + try { + Convert.fdc3UserInterfaceHelloToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_HELLO_TYPE = 'Fdc3UserInterfaceHello'; + +/** + * Returns true if value is a valid Fdc3UserInterfaceMessage. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceMessage(value: any): value is Fdc3UserInterfaceMessage { + try { + Convert.fdc3UserInterfaceMessageToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_MESSAGE_TYPE = 'Fdc3UserInterfaceMessage'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceResolve'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceResolve(value: any): value is Fdc3UserInterfaceResolve { + return value != null && value.type === 'Fdc3UserInterfaceResolve'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceResolve. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceResolve(value: any): value is Fdc3UserInterfaceResolve { + try { + Convert.fdc3UserInterfaceResolveToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_RESOLVE_TYPE = 'Fdc3UserInterfaceResolve'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceResolveAction'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceResolveAction(value: any): value is Fdc3UserInterfaceResolveAction { + return value != null && value.type === 'Fdc3UserInterfaceResolveAction'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceResolveAction. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceResolveAction(value: any): value is Fdc3UserInterfaceResolveAction { + try { + Convert.fdc3UserInterfaceResolveActionToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_RESOLVE_ACTION_TYPE = 'Fdc3UserInterfaceResolveAction'; + +/** + * Returns true if the value has a type property with value 'Fdc3UserInterfaceRestyle'. This is a fast check that does not check the format of the message + */ +export function isFdc3UserInterfaceRestyle(value: any): value is Fdc3UserInterfaceRestyle { + return value != null && value.type === 'Fdc3UserInterfaceRestyle'; +} + +/** + * Returns true if value is a valid Fdc3UserInterfaceRestyle. This checks the type against the json schema for the message and will be slower + */ +export function isValidFdc3UserInterfaceRestyle(value: any): value is Fdc3UserInterfaceRestyle { + try { + Convert.fdc3UserInterfaceRestyleToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FDC3_USER_INTERFACE_RESTYLE_TYPE = 'Fdc3UserInterfaceRestyle'; + +/** + * Returns true if the value has a type property with value 'findInstancesRequest'. This is a fast check that does not check the format of the message + */ +export function isFindInstancesRequest(value: any): value is FindInstancesRequest { + return value != null && value.type === 'findInstancesRequest'; +} + +/** + * Returns true if value is a valid FindInstancesRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindInstancesRequest(value: any): value is FindInstancesRequest { + try { + Convert.findInstancesRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INSTANCES_REQUEST_TYPE = 'FindInstancesRequest'; + +/** + * Returns true if the value has a type property with value 'findInstancesResponse'. This is a fast check that does not check the format of the message + */ +export function isFindInstancesResponse(value: any): value is FindInstancesResponse { + return value != null && value.type === 'findInstancesResponse'; +} + +/** + * Returns true if value is a valid FindInstancesResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindInstancesResponse(value: any): value is FindInstancesResponse { + try { + Convert.findInstancesResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INSTANCES_RESPONSE_TYPE = 'FindInstancesResponse'; + +/** + * Returns true if the value has a type property with value 'findIntentRequest'. This is a fast check that does not check the format of the message + */ +export function isFindIntentRequest(value: any): value is FindIntentRequest { + return value != null && value.type === 'findIntentRequest'; +} + +/** + * Returns true if value is a valid FindIntentRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindIntentRequest(value: any): value is FindIntentRequest { + try { + Convert.findIntentRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INTENT_REQUEST_TYPE = 'FindIntentRequest'; + +/** + * Returns true if the value has a type property with value 'findIntentResponse'. This is a fast check that does not check the format of the message + */ +export function isFindIntentResponse(value: any): value is FindIntentResponse { + return value != null && value.type === 'findIntentResponse'; +} + +/** + * Returns true if value is a valid FindIntentResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindIntentResponse(value: any): value is FindIntentResponse { + try { + Convert.findIntentResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INTENT_RESPONSE_TYPE = 'FindIntentResponse'; + +/** + * Returns true if the value has a type property with value 'findIntentsByContextRequest'. This is a fast check that does not check the format of the message + */ +export function isFindIntentsByContextRequest(value: any): value is FindIntentsByContextRequest { + return value != null && value.type === 'findIntentsByContextRequest'; +} + +/** + * Returns true if value is a valid FindIntentsByContextRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindIntentsByContextRequest(value: any): value is FindIntentsByContextRequest { + try { + Convert.findIntentsByContextRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INTENTS_BY_CONTEXT_REQUEST_TYPE = 'FindIntentsByContextRequest'; + +/** + * Returns true if the value has a type property with value 'findIntentsByContextResponse'. This is a fast check that does not check the format of the message + */ +export function isFindIntentsByContextResponse(value: any): value is FindIntentsByContextResponse { + return value != null && value.type === 'findIntentsByContextResponse'; +} + +/** + * Returns true if value is a valid FindIntentsByContextResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidFindIntentsByContextResponse(value: any): value is FindIntentsByContextResponse { + try { + Convert.findIntentsByContextResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const FIND_INTENTS_BY_CONTEXT_RESPONSE_TYPE = 'FindIntentsByContextResponse'; + +/** + * Returns true if the value has a type property with value 'getAppMetadataRequest'. This is a fast check that does not check the format of the message + */ +export function isGetAppMetadataRequest(value: any): value is GetAppMetadataRequest { + return value != null && value.type === 'getAppMetadataRequest'; +} + +/** + * Returns true if value is a valid GetAppMetadataRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetAppMetadataRequest(value: any): value is GetAppMetadataRequest { + try { + Convert.getAppMetadataRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_APP_METADATA_REQUEST_TYPE = 'GetAppMetadataRequest'; + +/** + * Returns true if the value has a type property with value 'getAppMetadataResponse'. This is a fast check that does not check the format of the message + */ +export function isGetAppMetadataResponse(value: any): value is GetAppMetadataResponse { + return value != null && value.type === 'getAppMetadataResponse'; +} + +/** + * Returns true if value is a valid GetAppMetadataResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetAppMetadataResponse(value: any): value is GetAppMetadataResponse { + try { + Convert.getAppMetadataResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_APP_METADATA_RESPONSE_TYPE = 'GetAppMetadataResponse'; + +/** + * Returns true if the value has a type property with value 'getCurrentChannelRequest'. This is a fast check that does not check the format of the message + */ +export function isGetCurrentChannelRequest(value: any): value is GetCurrentChannelRequest { + return value != null && value.type === 'getCurrentChannelRequest'; +} + +/** + * Returns true if value is a valid GetCurrentChannelRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetCurrentChannelRequest(value: any): value is GetCurrentChannelRequest { + try { + Convert.getCurrentChannelRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_CURRENT_CHANNEL_REQUEST_TYPE = 'GetCurrentChannelRequest'; + +/** + * Returns true if the value has a type property with value 'getCurrentChannelResponse'. This is a fast check that does not check the format of the message + */ +export function isGetCurrentChannelResponse(value: any): value is GetCurrentChannelResponse { + return value != null && value.type === 'getCurrentChannelResponse'; +} + +/** + * Returns true if value is a valid GetCurrentChannelResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetCurrentChannelResponse(value: any): value is GetCurrentChannelResponse { + try { + Convert.getCurrentChannelResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_CURRENT_CHANNEL_RESPONSE_TYPE = 'GetCurrentChannelResponse'; + +/** + * Returns true if the value has a type property with value 'getCurrentContextRequest'. This is a fast check that does not check the format of the message + */ +export function isGetCurrentContextRequest(value: any): value is GetCurrentContextRequest { + return value != null && value.type === 'getCurrentContextRequest'; +} + +/** + * Returns true if value is a valid GetCurrentContextRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetCurrentContextRequest(value: any): value is GetCurrentContextRequest { + try { + Convert.getCurrentContextRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_CURRENT_CONTEXT_REQUEST_TYPE = 'GetCurrentContextRequest'; + +/** + * Returns true if the value has a type property with value 'getCurrentContextResponse'. This is a fast check that does not check the format of the message + */ +export function isGetCurrentContextResponse(value: any): value is GetCurrentContextResponse { + return value != null && value.type === 'getCurrentContextResponse'; +} + +/** + * Returns true if value is a valid GetCurrentContextResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetCurrentContextResponse(value: any): value is GetCurrentContextResponse { + try { + Convert.getCurrentContextResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_CURRENT_CONTEXT_RESPONSE_TYPE = 'GetCurrentContextResponse'; + +/** + * Returns true if the value has a type property with value 'getInfoRequest'. This is a fast check that does not check the format of the message + */ +export function isGetInfoRequest(value: any): value is GetInfoRequest { + return value != null && value.type === 'getInfoRequest'; +} + +/** + * Returns true if value is a valid GetInfoRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetInfoRequest(value: any): value is GetInfoRequest { + try { + Convert.getInfoRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_INFO_REQUEST_TYPE = 'GetInfoRequest'; + +/** + * Returns true if the value has a type property with value 'getInfoResponse'. This is a fast check that does not check the format of the message + */ +export function isGetInfoResponse(value: any): value is GetInfoResponse { + return value != null && value.type === 'getInfoResponse'; +} + +/** + * Returns true if value is a valid GetInfoResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetInfoResponse(value: any): value is GetInfoResponse { + try { + Convert.getInfoResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_INFO_RESPONSE_TYPE = 'GetInfoResponse'; + +/** + * Returns true if the value has a type property with value 'getOrCreateChannelRequest'. This is a fast check that does not check the format of the message + */ +export function isGetOrCreateChannelRequest(value: any): value is GetOrCreateChannelRequest { + return value != null && value.type === 'getOrCreateChannelRequest'; +} + +/** + * Returns true if value is a valid GetOrCreateChannelRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetOrCreateChannelRequest(value: any): value is GetOrCreateChannelRequest { + try { + Convert.getOrCreateChannelRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_OR_CREATE_CHANNEL_REQUEST_TYPE = 'GetOrCreateChannelRequest'; + +/** + * Returns true if the value has a type property with value 'getOrCreateChannelResponse'. This is a fast check that does not check the format of the message + */ +export function isGetOrCreateChannelResponse(value: any): value is GetOrCreateChannelResponse { + return value != null && value.type === 'getOrCreateChannelResponse'; +} + +/** + * Returns true if value is a valid GetOrCreateChannelResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetOrCreateChannelResponse(value: any): value is GetOrCreateChannelResponse { + try { + Convert.getOrCreateChannelResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_OR_CREATE_CHANNEL_RESPONSE_TYPE = 'GetOrCreateChannelResponse'; + +/** + * Returns true if the value has a type property with value 'getUserChannelsRequest'. This is a fast check that does not check the format of the message + */ +export function isGetUserChannelsRequest(value: any): value is GetUserChannelsRequest { + return value != null && value.type === 'getUserChannelsRequest'; +} + +/** + * Returns true if value is a valid GetUserChannelsRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetUserChannelsRequest(value: any): value is GetUserChannelsRequest { + try { + Convert.getUserChannelsRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_USER_CHANNELS_REQUEST_TYPE = 'GetUserChannelsRequest'; + +/** + * Returns true if the value has a type property with value 'getUserChannelsResponse'. This is a fast check that does not check the format of the message + */ +export function isGetUserChannelsResponse(value: any): value is GetUserChannelsResponse { + return value != null && value.type === 'getUserChannelsResponse'; +} + +/** + * Returns true if value is a valid GetUserChannelsResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidGetUserChannelsResponse(value: any): value is GetUserChannelsResponse { + try { + Convert.getUserChannelsResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const GET_USER_CHANNELS_RESPONSE_TYPE = 'GetUserChannelsResponse'; + +/** + * Returns true if the value has a type property with value 'heartbeatAcknowledgementRequest'. This is a fast check that does not check the format of the message + */ +export function isHeartbeatAcknowledgementRequest(value: any): value is HeartbeatAcknowledgementRequest { + return value != null && value.type === 'heartbeatAcknowledgementRequest'; +} + +/** + * Returns true if value is a valid HeartbeatAcknowledgementRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidHeartbeatAcknowledgementRequest(value: any): value is HeartbeatAcknowledgementRequest { + try { + Convert.heartbeatAcknowledgementRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const HEARTBEAT_ACKNOWLEDGEMENT_REQUEST_TYPE = 'HeartbeatAcknowledgementRequest'; + +/** + * Returns true if the value has a type property with value 'heartbeatEvent'. This is a fast check that does not check the format of the message + */ +export function isHeartbeatEvent(value: any): value is HeartbeatEvent { + return value != null && value.type === 'heartbeatEvent'; +} + +/** + * Returns true if value is a valid HeartbeatEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidHeartbeatEvent(value: any): value is HeartbeatEvent { + try { + Convert.heartbeatEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const HEARTBEAT_EVENT_TYPE = 'HeartbeatEvent'; + +/** + * Returns true if the value has a type property with value 'intentEvent'. This is a fast check that does not check the format of the message + */ +export function isIntentEvent(value: any): value is IntentEvent { + return value != null && value.type === 'intentEvent'; +} + +/** + * Returns true if value is a valid IntentEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidIntentEvent(value: any): value is IntentEvent { + try { + Convert.intentEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const INTENT_EVENT_TYPE = 'IntentEvent'; + +/** + * Returns true if the value has a type property with value 'intentListenerUnsubscribeRequest'. This is a fast check that does not check the format of the message + */ +export function isIntentListenerUnsubscribeRequest(value: any): value is IntentListenerUnsubscribeRequest { + return value != null && value.type === 'intentListenerUnsubscribeRequest'; +} + +/** + * Returns true if value is a valid IntentListenerUnsubscribeRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidIntentListenerUnsubscribeRequest(value: any): value is IntentListenerUnsubscribeRequest { + try { + Convert.intentListenerUnsubscribeRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const INTENT_LISTENER_UNSUBSCRIBE_REQUEST_TYPE = 'IntentListenerUnsubscribeRequest'; + +/** + * Returns true if the value has a type property with value 'intentListenerUnsubscribeResponse'. This is a fast check that does not check the format of the message + */ +export function isIntentListenerUnsubscribeResponse(value: any): value is IntentListenerUnsubscribeResponse { + return value != null && value.type === 'intentListenerUnsubscribeResponse'; +} + +/** + * Returns true if value is a valid IntentListenerUnsubscribeResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidIntentListenerUnsubscribeResponse(value: any): value is IntentListenerUnsubscribeResponse { + try { + Convert.intentListenerUnsubscribeResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const INTENT_LISTENER_UNSUBSCRIBE_RESPONSE_TYPE = 'IntentListenerUnsubscribeResponse'; + +/** + * Returns true if the value has a type property with value 'intentResultRequest'. This is a fast check that does not check the format of the message + */ +export function isIntentResultRequest(value: any): value is IntentResultRequest { + return value != null && value.type === 'intentResultRequest'; +} + +/** + * Returns true if value is a valid IntentResultRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidIntentResultRequest(value: any): value is IntentResultRequest { + try { + Convert.intentResultRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const INTENT_RESULT_REQUEST_TYPE = 'IntentResultRequest'; + +/** + * Returns true if the value has a type property with value 'intentResultResponse'. This is a fast check that does not check the format of the message + */ +export function isIntentResultResponse(value: any): value is IntentResultResponse { + return value != null && value.type === 'intentResultResponse'; +} + +/** + * Returns true if value is a valid IntentResultResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidIntentResultResponse(value: any): value is IntentResultResponse { + try { + Convert.intentResultResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const INTENT_RESULT_RESPONSE_TYPE = 'IntentResultResponse'; + +/** + * Returns true if the value has a type property with value 'joinUserChannelRequest'. This is a fast check that does not check the format of the message + */ +export function isJoinUserChannelRequest(value: any): value is JoinUserChannelRequest { + return value != null && value.type === 'joinUserChannelRequest'; +} + +/** + * Returns true if value is a valid JoinUserChannelRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidJoinUserChannelRequest(value: any): value is JoinUserChannelRequest { + try { + Convert.joinUserChannelRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const JOIN_USER_CHANNEL_REQUEST_TYPE = 'JoinUserChannelRequest'; + +/** + * Returns true if the value has a type property with value 'joinUserChannelResponse'. This is a fast check that does not check the format of the message + */ +export function isJoinUserChannelResponse(value: any): value is JoinUserChannelResponse { + return value != null && value.type === 'joinUserChannelResponse'; +} + +/** + * Returns true if value is a valid JoinUserChannelResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidJoinUserChannelResponse(value: any): value is JoinUserChannelResponse { + try { + Convert.joinUserChannelResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const JOIN_USER_CHANNEL_RESPONSE_TYPE = 'JoinUserChannelResponse'; + +/** + * Returns true if the value has a type property with value 'leaveCurrentChannelRequest'. This is a fast check that does not check the format of the message + */ +export function isLeaveCurrentChannelRequest(value: any): value is LeaveCurrentChannelRequest { + return value != null && value.type === 'leaveCurrentChannelRequest'; +} + +/** + * Returns true if value is a valid LeaveCurrentChannelRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidLeaveCurrentChannelRequest(value: any): value is LeaveCurrentChannelRequest { + try { + Convert.leaveCurrentChannelRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const LEAVE_CURRENT_CHANNEL_REQUEST_TYPE = 'LeaveCurrentChannelRequest'; + +/** + * Returns true if the value has a type property with value 'leaveCurrentChannelResponse'. This is a fast check that does not check the format of the message + */ +export function isLeaveCurrentChannelResponse(value: any): value is LeaveCurrentChannelResponse { + return value != null && value.type === 'leaveCurrentChannelResponse'; +} + +/** + * Returns true if value is a valid LeaveCurrentChannelResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidLeaveCurrentChannelResponse(value: any): value is LeaveCurrentChannelResponse { + try { + Convert.leaveCurrentChannelResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const LEAVE_CURRENT_CHANNEL_RESPONSE_TYPE = 'LeaveCurrentChannelResponse'; + +/** + * Returns true if the value has a type property with value 'openRequest'. This is a fast check that does not check the format of the message + */ +export function isOpenRequest(value: any): value is OpenRequest { + return value != null && value.type === 'openRequest'; +} + +/** + * Returns true if value is a valid OpenRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidOpenRequest(value: any): value is OpenRequest { + try { + Convert.openRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const OPEN_REQUEST_TYPE = 'OpenRequest'; + +/** + * Returns true if the value has a type property with value 'openResponse'. This is a fast check that does not check the format of the message + */ +export function isOpenResponse(value: any): value is OpenResponse { + return value != null && value.type === 'openResponse'; +} + +/** + * Returns true if value is a valid OpenResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidOpenResponse(value: any): value is OpenResponse { + try { + Convert.openResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const OPEN_RESPONSE_TYPE = 'OpenResponse'; + +/** + * Returns true if the value has a type property with value 'privateChannelAddEventListenerRequest'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelAddEventListenerRequest(value: any): value is PrivateChannelAddEventListenerRequest { + return value != null && value.type === 'privateChannelAddEventListenerRequest'; +} + +/** + * Returns true if value is a valid PrivateChannelAddEventListenerRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelAddEventListenerRequest( + value: any +): value is PrivateChannelAddEventListenerRequest { + try { + Convert.privateChannelAddEventListenerRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_ADD_EVENT_LISTENER_REQUEST_TYPE = 'PrivateChannelAddEventListenerRequest'; + +/** + * Returns true if the value has a type property with value 'privateChannelAddEventListenerResponse'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelAddEventListenerResponse(value: any): value is PrivateChannelAddEventListenerResponse { + return value != null && value.type === 'privateChannelAddEventListenerResponse'; +} + +/** + * Returns true if value is a valid PrivateChannelAddEventListenerResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelAddEventListenerResponse( + value: any +): value is PrivateChannelAddEventListenerResponse { + try { + Convert.privateChannelAddEventListenerResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_ADD_EVENT_LISTENER_RESPONSE_TYPE = 'PrivateChannelAddEventListenerResponse'; + +/** + * Returns true if the value has a type property with value 'privateChannelDisconnectRequest'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelDisconnectRequest(value: any): value is PrivateChannelDisconnectRequest { + return value != null && value.type === 'privateChannelDisconnectRequest'; +} + +/** + * Returns true if value is a valid PrivateChannelDisconnectRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelDisconnectRequest(value: any): value is PrivateChannelDisconnectRequest { + try { + Convert.privateChannelDisconnectRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_DISCONNECT_REQUEST_TYPE = 'PrivateChannelDisconnectRequest'; + +/** + * Returns true if the value has a type property with value 'privateChannelDisconnectResponse'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelDisconnectResponse(value: any): value is PrivateChannelDisconnectResponse { + return value != null && value.type === 'privateChannelDisconnectResponse'; +} + +/** + * Returns true if value is a valid PrivateChannelDisconnectResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelDisconnectResponse(value: any): value is PrivateChannelDisconnectResponse { + try { + Convert.privateChannelDisconnectResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_DISCONNECT_RESPONSE_TYPE = 'PrivateChannelDisconnectResponse'; + +/** + * Returns true if the value has a type property with value 'privateChannelOnAddContextListenerEvent'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelOnAddContextListenerEvent( + value: any +): value is PrivateChannelOnAddContextListenerEvent { + return value != null && value.type === 'privateChannelOnAddContextListenerEvent'; +} + +/** + * Returns true if value is a valid PrivateChannelOnAddContextListenerEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelOnAddContextListenerEvent( + value: any +): value is PrivateChannelOnAddContextListenerEvent { + try { + Convert.privateChannelOnAddContextListenerEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_ON_ADD_CONTEXT_LISTENER_EVENT_TYPE = 'PrivateChannelOnAddContextListenerEvent'; + +/** + * Returns true if the value has a type property with value 'privateChannelOnDisconnectEvent'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelOnDisconnectEvent(value: any): value is PrivateChannelOnDisconnectEvent { + return value != null && value.type === 'privateChannelOnDisconnectEvent'; +} + +/** + * Returns true if value is a valid PrivateChannelOnDisconnectEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelOnDisconnectEvent(value: any): value is PrivateChannelOnDisconnectEvent { + try { + Convert.privateChannelOnDisconnectEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_ON_DISCONNECT_EVENT_TYPE = 'PrivateChannelOnDisconnectEvent'; + +/** + * Returns true if the value has a type property with value 'privateChannelOnUnsubscribeEvent'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelOnUnsubscribeEvent(value: any): value is PrivateChannelOnUnsubscribeEvent { + return value != null && value.type === 'privateChannelOnUnsubscribeEvent'; +} + +/** + * Returns true if value is a valid PrivateChannelOnUnsubscribeEvent. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelOnUnsubscribeEvent(value: any): value is PrivateChannelOnUnsubscribeEvent { + try { + Convert.privateChannelOnUnsubscribeEventToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_ON_UNSUBSCRIBE_EVENT_TYPE = 'PrivateChannelOnUnsubscribeEvent'; + +/** + * Returns true if the value has a type property with value 'privateChannelUnsubscribeEventListenerRequest'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelUnsubscribeEventListenerRequest( + value: any +): value is PrivateChannelUnsubscribeEventListenerRequest { + return value != null && value.type === 'privateChannelUnsubscribeEventListenerRequest'; +} + +/** + * Returns true if value is a valid PrivateChannelUnsubscribeEventListenerRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelUnsubscribeEventListenerRequest( + value: any +): value is PrivateChannelUnsubscribeEventListenerRequest { + try { + Convert.privateChannelUnsubscribeEventListenerRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_UNSUBSCRIBE_EVENT_LISTENER_REQUEST_TYPE = 'PrivateChannelUnsubscribeEventListenerRequest'; + +/** + * Returns true if the value has a type property with value 'privateChannelUnsubscribeEventListenerResponse'. This is a fast check that does not check the format of the message + */ +export function isPrivateChannelUnsubscribeEventListenerResponse( + value: any +): value is PrivateChannelUnsubscribeEventListenerResponse { + return value != null && value.type === 'privateChannelUnsubscribeEventListenerResponse'; +} + +/** + * Returns true if value is a valid PrivateChannelUnsubscribeEventListenerResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidPrivateChannelUnsubscribeEventListenerResponse( + value: any +): value is PrivateChannelUnsubscribeEventListenerResponse { + try { + Convert.privateChannelUnsubscribeEventListenerResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const PRIVATE_CHANNEL_UNSUBSCRIBE_EVENT_LISTENER_RESPONSE_TYPE = + 'PrivateChannelUnsubscribeEventListenerResponse'; + +/** + * Returns true if the value has a type property with value 'raiseIntentForContextRequest'. This is a fast check that does not check the format of the message + */ +export function isRaiseIntentForContextRequest(value: any): value is RaiseIntentForContextRequest { + return value != null && value.type === 'raiseIntentForContextRequest'; +} + +/** + * Returns true if value is a valid RaiseIntentForContextRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidRaiseIntentForContextRequest(value: any): value is RaiseIntentForContextRequest { + try { + Convert.raiseIntentForContextRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const RAISE_INTENT_FOR_CONTEXT_REQUEST_TYPE = 'RaiseIntentForContextRequest'; + +/** + * Returns true if the value has a type property with value 'raiseIntentForContextResponse'. This is a fast check that does not check the format of the message + */ +export function isRaiseIntentForContextResponse(value: any): value is RaiseIntentForContextResponse { + return value != null && value.type === 'raiseIntentForContextResponse'; +} + +/** + * Returns true if value is a valid RaiseIntentForContextResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidRaiseIntentForContextResponse(value: any): value is RaiseIntentForContextResponse { + try { + Convert.raiseIntentForContextResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const RAISE_INTENT_FOR_CONTEXT_RESPONSE_TYPE = 'RaiseIntentForContextResponse'; + +/** + * Returns true if the value has a type property with value 'raiseIntentRequest'. This is a fast check that does not check the format of the message + */ +export function isRaiseIntentRequest(value: any): value is RaiseIntentRequest { + return value != null && value.type === 'raiseIntentRequest'; +} + +/** + * Returns true if value is a valid RaiseIntentRequest. This checks the type against the json schema for the message and will be slower + */ +export function isValidRaiseIntentRequest(value: any): value is RaiseIntentRequest { + try { + Convert.raiseIntentRequestToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const RAISE_INTENT_REQUEST_TYPE = 'RaiseIntentRequest'; + +/** + * Returns true if the value has a type property with value 'raiseIntentResponse'. This is a fast check that does not check the format of the message + */ +export function isRaiseIntentResponse(value: any): value is RaiseIntentResponse { + return value != null && value.type === 'raiseIntentResponse'; +} + +/** + * Returns true if value is a valid RaiseIntentResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidRaiseIntentResponse(value: any): value is RaiseIntentResponse { + try { + Convert.raiseIntentResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const RAISE_INTENT_RESPONSE_TYPE = 'RaiseIntentResponse'; + +/** + * Returns true if the value has a type property with value 'raiseIntentResultResponse'. This is a fast check that does not check the format of the message + */ +export function isRaiseIntentResultResponse(value: any): value is RaiseIntentResultResponse { + return value != null && value.type === 'raiseIntentResultResponse'; +} + +/** + * Returns true if value is a valid RaiseIntentResultResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidRaiseIntentResultResponse(value: any): value is RaiseIntentResultResponse { + try { + Convert.raiseIntentResultResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const RAISE_INTENT_RESULT_RESPONSE_TYPE = 'RaiseIntentResultResponse'; + +/** + * Returns true if the value has a type property with value 'WCP1Hello'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol1Hello(value: any): value is WebConnectionProtocol1Hello { + return value != null && value.type === 'WCP1Hello'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol1Hello. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol1Hello(value: any): value is WebConnectionProtocol1Hello { + try { + Convert.webConnectionProtocol1HelloToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL1_HELLO_TYPE = 'WebConnectionProtocol1Hello'; + +/** + * Returns true if the value has a type property with value 'WCP2LoadUrl'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol2LoadURL(value: any): value is WebConnectionProtocol2LoadURL { + return value != null && value.type === 'WCP2LoadUrl'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol2LoadURL. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol2LoadURL(value: any): value is WebConnectionProtocol2LoadURL { + try { + Convert.webConnectionProtocol2LoadURLToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL2_LOAD_U_R_L_TYPE = 'WebConnectionProtocol2LoadURL'; + +/** + * Returns true if the value has a type property with value 'WCP3Handshake'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol3Handshake(value: any): value is WebConnectionProtocol3Handshake { + return value != null && value.type === 'WCP3Handshake'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol3Handshake. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol3Handshake(value: any): value is WebConnectionProtocol3Handshake { + try { + Convert.webConnectionProtocol3HandshakeToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL3_HANDSHAKE_TYPE = 'WebConnectionProtocol3Handshake'; + +/** + * Returns true if the value has a type property with value 'WCP4ValidateAppIdentity'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol4ValidateAppIdentity( + value: any +): value is WebConnectionProtocol4ValidateAppIdentity { + return value != null && value.type === 'WCP4ValidateAppIdentity'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol4ValidateAppIdentity. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol4ValidateAppIdentity( + value: any +): value is WebConnectionProtocol4ValidateAppIdentity { + try { + Convert.webConnectionProtocol4ValidateAppIdentityToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL4_VALIDATE_APP_IDENTITY_TYPE = 'WebConnectionProtocol4ValidateAppIdentity'; + +/** + * Returns true if the value has a type property with value 'WCP5ValidateAppIdentityFailedResponse'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol5ValidateAppIdentityFailedResponse( + value: any +): value is WebConnectionProtocol5ValidateAppIdentityFailedResponse { + return value != null && value.type === 'WCP5ValidateAppIdentityFailedResponse'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol5ValidateAppIdentityFailedResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol5ValidateAppIdentityFailedResponse( + value: any +): value is WebConnectionProtocol5ValidateAppIdentityFailedResponse { + try { + Convert.webConnectionProtocol5ValidateAppIdentityFailedResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL5_VALIDATE_APP_IDENTITY_FAILED_RESPONSE_TYPE = + 'WebConnectionProtocol5ValidateAppIdentityFailedResponse'; + +/** + * Returns true if the value has a type property with value 'WCP5ValidateAppIdentityResponse'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol5ValidateAppIdentitySuccessResponse( + value: any +): value is WebConnectionProtocol5ValidateAppIdentitySuccessResponse { + return value != null && value.type === 'WCP5ValidateAppIdentityResponse'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol5ValidateAppIdentitySuccessResponse. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol5ValidateAppIdentitySuccessResponse( + value: any +): value is WebConnectionProtocol5ValidateAppIdentitySuccessResponse { + try { + Convert.webConnectionProtocol5ValidateAppIdentitySuccessResponseToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL5_VALIDATE_APP_IDENTITY_SUCCESS_RESPONSE_TYPE = + 'WebConnectionProtocol5ValidateAppIdentitySuccessResponse'; + +/** + * Returns true if the value has a type property with value 'WCP6Goodbye'. This is a fast check that does not check the format of the message + */ +export function isWebConnectionProtocol6Goodbye(value: any): value is WebConnectionProtocol6Goodbye { + return value != null && value.type === 'WCP6Goodbye'; +} + +/** + * Returns true if value is a valid WebConnectionProtocol6Goodbye. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocol6Goodbye(value: any): value is WebConnectionProtocol6Goodbye { + try { + Convert.webConnectionProtocol6GoodbyeToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL6_GOODBYE_TYPE = 'WebConnectionProtocol6Goodbye'; + +/** + * Returns true if value is a valid WebConnectionProtocolMessage. This checks the type against the json schema for the message and will be slower + */ +export function isValidWebConnectionProtocolMessage(value: any): value is WebConnectionProtocolMessage { + try { + Convert.webConnectionProtocolMessageToJson(value); + return true; + } catch (_e: any) { + return false; + } +} + +export const WEB_CONNECTION_PROTOCOL_MESSAGE_TYPE = 'WebConnectionProtocolMessage'; diff --git a/packages/fdc3-schema/generated/bridging/BridgingTypes.ts b/packages/fdc3-schema/generated/bridging/BridgingTypes.ts new file mode 100644 index 000000000..d176b0fe5 --- /dev/null +++ b/packages/fdc3-schema/generated/bridging/BridgingTypes.ts @@ -0,0 +1,6591 @@ +// To parse this data: +// +// import { Convert, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeErrorResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeErrorResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentAgentRequest, FindIntentAgentResponse, FindIntentBridgeErrorResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeErrorResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeErrorResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeErrorResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeErrorResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeErrorResponse, RaiseIntentResultBridgeResponse } from "./file"; +// +// const agentErrorResponseMessage = Convert.toAgentErrorResponseMessage(json); +// const agentRequestMessage = Convert.toAgentRequestMessage(json); +// const agentResponseMessage = Convert.toAgentResponseMessage(json); +// const bridgeErrorResponseMessage = Convert.toBridgeErrorResponseMessage(json); +// const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); +// const bridgeResponseMessage = Convert.toBridgeResponseMessage(json); +// const broadcastAgentRequest = Convert.toBroadcastAgentRequest(json); +// const broadcastBridgeRequest = Convert.toBroadcastBridgeRequest(json); +// const bridgeCommonDefinitions = Convert.toBridgeCommonDefinitions(json); +// const connectionStepMessage = Convert.toConnectionStepMessage(json); +// const connectionStep2Hello = Convert.toConnectionStep2Hello(json); +// const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); +// const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); +// const connectionStep6ConnectedAgentsUpdate = Convert.toConnectionStep6ConnectedAgentsUpdate(json); +// const findInstancesAgentErrorResponse = Convert.toFindInstancesAgentErrorResponse(json); +// const findInstancesAgentRequest = Convert.toFindInstancesAgentRequest(json); +// const findInstancesAgentResponse = Convert.toFindInstancesAgentResponse(json); +// const findInstancesBridgeErrorResponse = Convert.toFindInstancesBridgeErrorResponse(json); +// const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); +// const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); +// const findIntentAgentErrorResponse = Convert.toFindIntentAgentErrorResponse(json); +// const findIntentAgentRequest = Convert.toFindIntentAgentRequest(json); +// const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); +// const findIntentBridgeErrorResponse = Convert.toFindIntentBridgeErrorResponse(json); +// const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); +// const findIntentBridgeResponse = Convert.toFindIntentBridgeResponse(json); +// const findIntentsByContextAgentErrorResponse = Convert.toFindIntentsByContextAgentErrorResponse(json); +// const findIntentsByContextAgentRequest = Convert.toFindIntentsByContextAgentRequest(json); +// const findIntentsByContextAgentResponse = Convert.toFindIntentsByContextAgentResponse(json); +// const findIntentsByContextBridgeErrorResponse = Convert.toFindIntentsByContextBridgeErrorResponse(json); +// const findIntentsByContextBridgeRequest = Convert.toFindIntentsByContextBridgeRequest(json); +// const findIntentsByContextBridgeResponse = Convert.toFindIntentsByContextBridgeResponse(json); +// const getAppMetadataAgentErrorResponse = Convert.toGetAppMetadataAgentErrorResponse(json); +// const getAppMetadataAgentRequest = Convert.toGetAppMetadataAgentRequest(json); +// const getAppMetadataAgentResponse = Convert.toGetAppMetadataAgentResponse(json); +// const getAppMetadataBridgeErrorResponse = Convert.toGetAppMetadataBridgeErrorResponse(json); +// const getAppMetadataBridgeRequest = Convert.toGetAppMetadataBridgeRequest(json); +// const getAppMetadataBridgeResponse = Convert.toGetAppMetadataBridgeResponse(json); +// const openAgentErrorResponse = Convert.toOpenAgentErrorResponse(json); +// const openAgentRequest = Convert.toOpenAgentRequest(json); +// const openAgentResponse = Convert.toOpenAgentResponse(json); +// const openBridgeErrorResponse = Convert.toOpenBridgeErrorResponse(json); +// const openBridgeRequest = Convert.toOpenBridgeRequest(json); +// const openBridgeResponse = Convert.toOpenBridgeResponse(json); +// const privateChannelBroadcastAgentRequest = Convert.toPrivateChannelBroadcastAgentRequest(json); +// const privateChannelBroadcastBridgeRequest = Convert.toPrivateChannelBroadcastBridgeRequest(json); +// const privateChannelEventListenerAddedAgentRequest = Convert.toPrivateChannelEventListenerAddedAgentRequest(json); +// const privateChannelEventListenerAddedBridgeRequest = Convert.toPrivateChannelEventListenerAddedBridgeRequest(json); +// const privateChannelEventListenerRemovedAgentRequest = Convert.toPrivateChannelEventListenerRemovedAgentRequest(json); +// const privateChannelEventListenerRemovedBridgeRequest = Convert.toPrivateChannelEventListenerRemovedBridgeRequest(json); +// const privateChannelOnAddContextListenerAgentRequest = Convert.toPrivateChannelOnAddContextListenerAgentRequest(json); +// const privateChannelOnAddContextListenerBridgeRequest = Convert.toPrivateChannelOnAddContextListenerBridgeRequest(json); +// const privateChannelOnDisconnectAgentRequest = Convert.toPrivateChannelOnDisconnectAgentRequest(json); +// const privateChannelOnDisconnectBridgeRequest = Convert.toPrivateChannelOnDisconnectBridgeRequest(json); +// const privateChannelOnUnsubscribeAgentRequest = Convert.toPrivateChannelOnUnsubscribeAgentRequest(json); +// const privateChannelOnUnsubscribeBridgeRequest = Convert.toPrivateChannelOnUnsubscribeBridgeRequest(json); +// const raiseIntentAgentErrorResponse = Convert.toRaiseIntentAgentErrorResponse(json); +// const raiseIntentAgentRequest = Convert.toRaiseIntentAgentRequest(json); +// const raiseIntentAgentResponse = Convert.toRaiseIntentAgentResponse(json); +// const raiseIntentBridgeErrorResponse = Convert.toRaiseIntentBridgeErrorResponse(json); +// const raiseIntentBridgeRequest = Convert.toRaiseIntentBridgeRequest(json); +// const raiseIntentBridgeResponse = Convert.toRaiseIntentBridgeResponse(json); +// const raiseIntentResultAgentErrorResponse = Convert.toRaiseIntentResultAgentErrorResponse(json); +// const raiseIntentResultAgentResponse = Convert.toRaiseIntentResultAgentResponse(json); +// const raiseIntentResultBridgeErrorResponse = Convert.toRaiseIntentResultBridgeErrorResponse(json); +// const raiseIntentResultBridgeResponse = Convert.toRaiseIntentResultBridgeResponse(json); +// +// These functions will throw an error if the JSON doesn't +// match the expected interface, even if the JSON is valid. + +/** + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface AgentErrorResponseMessage { + meta: AgentResponseMetadata; + /** + * Error message payload containing an standardized error string. + */ + payload: ErrorResponseMessagePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface AgentResponseMetadata { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface ErrorResponseMessagePayload { + error: ResponseErrorDetail; + [property: string]: any; +} + +/** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type ResponseErrorDetail = + | 'AccessDenied' + | 'CreationFailed' + | 'MalformedContext' + | 'NoChannelFound' + | 'ApiTimeout' + | 'AppNotFound' + | 'AppTimeout' + | 'DesktopAgentNotFound' + | 'ErrorOnLaunch' + | 'ResolverUnavailable' + | 'IntentDeliveryFailed' + | 'NoAppsFound' + | 'ResolverTimeout' + | 'TargetAppUnavailable' + | 'TargetInstanceUnavailable' + | 'UserCancelledResolution' + | 'IntentHandlerRejected' + | 'NoResultReturned' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ +export type ResponseMessageType = + | 'findInstancesResponse' + | 'findIntentResponse' + | 'findIntentsByContextResponse' + | 'getAppMetadataResponse' + | 'openResponse' + | 'raiseIntentResponse' + | 'raiseIntentResultResponse'; + +/** + * A request message from a Desktop Agent to the Bridge. + */ +export interface AgentRequestMessage { + meta: AgentRequestMetadata; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: RequestMessageType; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface AgentRequestMetadata { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceIdentifier; + timestamp: Date; +} + +/** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface BridgeParticipantIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + */ +export interface SourceIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ +export type RequestMessageType = + | 'broadcastRequest' + | 'findInstancesRequest' + | 'findIntentRequest' + | 'findIntentsByContextRequest' + | 'getAppMetadataRequest' + | 'openRequest' + | 'PrivateChannel.broadcast' + | 'PrivateChannel.eventListenerAdded' + | 'PrivateChannel.eventListenerRemoved' + | 'PrivateChannel.onAddContextListener' + | 'PrivateChannel.onDisconnect' + | 'PrivateChannel.onUnsubscribe' + | 'raiseIntentRequest'; + +/** + * A response message from a Desktop Agent to the Bridge. + */ +export interface AgentResponseMessage { + meta: AgentResponseMetadata; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: ResponseMessageType; +} + +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface BridgeErrorResponseMessage { + meta: BridgeErrorResponseMessageMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: ResponseErrorMessagePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface BridgeErrorResponseMessageMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + */ +export interface DesktopAgentIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + [property: string]: any; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface ResponseErrorMessagePayload { + error?: ResponseErrorDetail; + [property: string]: any; +} + +/** + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface BridgeRequestMessage { + meta: BridgeRequestMetadata; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: string; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface BridgeRequestMetadata { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: BridgeParticipantIdentifier; + timestamp: Date; +} + +/** + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface BridgeResponseMessage { + meta: BridgeResponseMessageMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: string; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface BridgeResponseMessageMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * A request to broadcast context on a channel. + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface BroadcastAgentRequest { + meta: BroadcastAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: BroadcastAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'broadcastRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface BroadcastAgentRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: SourceObject; + timestamp: Date; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + */ +export interface SourceObject { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastAgentRequestPayload { + /** + * The Id of the Channel that the broadcast was sent on. + */ + channelId: string; + /** + * The context object that is to be broadcast. + */ + context: Context; +} + +/** + * The context object that is to be broadcast. + * + * The context object that was the payload of a broadcast message. + * + * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by + * FDC3 operations. As such, it is not really meant to be used on its own, but is imported + * by more specific type definitions (standardized or custom) to provide the structure and + * properties shared by all FDC3 context data types. + * + * The key element of FDC3 context types is their mandatory `type` property, which is used + * to identify what type of data the object represents, and what shape it has. + * + * The FDC3 context type, and all derived types, define the minimum set of fields a context + * data object of a particular type can be expected to have, but this can always be extended + * with custom fields as appropriate. + */ +export interface Context { + /** + * Context data objects may include a set of equivalent key-value pairs that can be used to + * help applications identify and look up the context type they receive in their own domain. + * The idea behind this design is that applications can provide as many equivalent + * identifiers to a target application as possible, e.g. an instrument may be represented by + * an ISIN, CUSIP or Bloomberg identifier. + * + * Identifiers do not make sense for all types of data, so the `id` property is therefore + * optional, but some derived types may choose to require at least one identifier. + * Identifier values SHOULD always be of type string. + */ + id?: { [key: string]: any }; + /** + * Context data objects may include a name property that can be used for more information, + * or display purposes. Some derived types may require the name object as mandatory, + * depending on use case. + */ + name?: string; + /** + * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 + * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present + * to route shared context data appropriately. + * + * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data + * types they support in an FDC3 [App + * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery + * and routing. + * + * Standardized FDC3 context types have well-known `type` properties prefixed with the + * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and + * used by a particular organization, the convention is to prefix them with an + * organization-specific namespace, e.g. `blackrock.fund`. + * + * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more + * information about context data types. + */ + type: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to broadcast context on a channel. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface BroadcastBridgeRequest { + meta: BroadcastBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: BroadcastBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'broadcastRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface BroadcastBridgeRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + */ +export interface MetaSource { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface BroadcastBridgeRequestPayload { + /** + * The Id of the Channel that the broadcast was sent on. + */ + channelId: string; + /** + * The context object that is to be broadcast. + */ + context: Context; +} + +/** + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStepMessage { + meta: ConnectionStepMetadata; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: { [key: string]: any }; + /** + * Identifies the type of the connection step message. + */ + type: ConnectionStepMessageType; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStepMetadata { + requestUuid?: string; + responseUuid?: string; + timestamp: Date; +} + +/** + * Identifies the type of the connection step message. + */ +export type ConnectionStepMessageType = 'hello' | 'handshake' | 'authenticationFailed' | 'connectedAgentsUpdate'; + +/** + * Hello message sent by the Bridge to anyone connecting to the Bridge (enables + * identification as a bridge and confirmation of whether authentication is required) + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStep2Hello { + meta: ConnectionStep2HelloMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: ConnectionStep2HelloPayload; + /** + * Identifies the type of the connection step message. + */ + type: 'hello'; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStep2HelloMeta { + timestamp: Date; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface ConnectionStep2HelloPayload { + /** + * A flag indicating whether the Desktop Agent Bridge requires authentication or not. + */ + authRequired: boolean; + /** + * An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to + * authenticate a bridge. + */ + authToken?: string; + /** + * The version of the Bridge + */ + desktopAgentBridgeVersion: string; + /** + * The FDC3 versions supported by the Bridge + */ + supportedFDC3Versions: string[]; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Handshake message sent by the Desktop Agent to the Bridge (including requested name, + * channel state and authentication data) + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStep3Handshake { + meta: ConnectionStep3HandshakeMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: ConnectionStep3HandshakePayload; + /** + * Identifies the type of the connection step message. + */ + type: 'handshake'; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStep3HandshakeMeta { + requestUuid: string; + timestamp: Date; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface ConnectionStep3HandshakePayload { + authToken?: string; + /** + * The current state of the Desktop Agent's App and User channels (exclude any Private + * channels), as a mapping of channel id to an array of Context objects, one per type found + * in the channel, most recent first. + */ + channelsState: { [key: string]: Context[] }; + /** + * Desktop Agent ImplementationMetadata trying to connect to the bridge. + */ + implementationMetadata: ConnectingAgentImplementationMetadata; + /** + * The requested Desktop Agent name + */ + requestedName: string; +} + +/** + * Desktop Agent ImplementationMetadata trying to connect to the bridge. + * + * Metadata relating to the FDC3 Desktop Agent implementation and its provider. + */ +export interface ConnectingAgentImplementationMetadata { + /** + * The version number of the FDC3 specification that the implementation provides. + * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. + */ + fdc3Version: string; + /** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ + optionalFeatures: OptionalFeatures; + /** + * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, + * OpenFin etc.). + */ + provider: string; + /** + * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). + */ + providerVersion?: string; +} + +/** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ +export interface OptionalFeatures { + /** + * Used to indicate whether the experimental Desktop Agent Bridging + * feature is implemented by the Desktop Agent. + */ + DesktopAgentBridging: boolean; + /** + * Used to indicate whether the exposure of 'originating app metadata' for + * context and intent messages is supported by the Desktop Agent. + */ + OriginatingAppMetadata: boolean; + /** + * Used to indicate whether the optional `fdc3.joinUserChannel`, + * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by + * the Desktop Agent. + */ + UserChannelMembershipAPIs: boolean; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Message sent by Bridge to Desktop Agent if their authentication fails. + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStep4AuthenticationFailed { + meta: ConnectionStep4AuthenticationFailedMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: ConnectionStep4AuthenticationFailedPayload; + /** + * Identifies the type of the connection step message. + */ + type: 'authenticationFailed'; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStep4AuthenticationFailedMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface ConnectionStep4AuthenticationFailedPayload { + message?: string; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, + * includes the details of all agents, the change made and the expected channel state for + * all agents. + * + * A message used during the connection flow for a Desktop Agent to the Bridge. Used for + * messages sent in either direction. + */ +export interface ConnectionStep6ConnectedAgentsUpdate { + meta: ConnectionStep6ConnectedAgentsUpdateMeta; + /** + * The message payload, containing data pertaining to this connection step. + */ + payload: ConnectionStep6ConnectedAgentsUpdatePayload; + /** + * Identifies the type of the connection step message. + */ + type: 'connectedAgentsUpdate'; +} + +/** + * Metadata for this connection step message. + */ +export interface ConnectionStep6ConnectedAgentsUpdateMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload, containing data pertaining to this connection step. + */ +export interface ConnectionStep6ConnectedAgentsUpdatePayload { + /** + * Should be set when an agent first connects to the bridge and provide its assigned name. + */ + addAgent?: string; + /** + * Desktop Agent Bridge implementation metadata of all connected agents. + */ + allAgents: DesktopAgentImplementationMetadata[]; + /** + * The updated state of channels that should be adopted by the agents. Should only be set + * when an agent is connecting to the bridge. + */ + channelsState?: { [key: string]: Context[] }; + /** + * Should be set when an agent disconnects from the bridge and provide the name that no + * longer is assigned. + */ + removeAgent?: string; +} + +/** + * Includes the name assigned to the Desktop Agent by the Bridge. + * + * Metadata relating to the FDC3 Desktop Agent implementation and its provider. + */ +export interface DesktopAgentImplementationMetadata { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a particular Desktop + * Agent. + */ + desktopAgent: string; + /** + * The version number of the FDC3 specification that the implementation provides. + * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. + */ + fdc3Version: string; + /** + * Metadata indicating whether the Desktop Agent implements optional features of + * the Desktop Agent API. + */ + optionalFeatures: OptionalFeatures; + /** + * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, + * OpenFin etc.). + */ + provider: string; + /** + * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). + */ + providerVersion?: string; +} + +/** + * Identifies the type of the connection step message. + */ + +/** + * A response to a findInstances request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindInstancesAgentErrorResponse { + meta: FindInstancesAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: PayloadClass; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findInstancesResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindInstancesAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface PayloadClass { + error: FindInstancesErrors; +} + +/** + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + * + * Should be set if the raiseIntent request returned an error. + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + * + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + */ +export type FindInstancesErrors = + | 'DesktopAgentNotFound' + | 'IntentDeliveryFailed' + | 'MalformedContext' + | 'NoAppsFound' + | 'ResolverTimeout' + | 'ResolverUnavailable' + | 'TargetAppUnavailable' + | 'TargetInstanceUnavailable' + | 'UserCancelledResolution' + | 'ApiTimeout' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request for details of instances of a particular app + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface FindInstancesAgentRequest { + meta: FindInstancesAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindInstancesAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findInstancesRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface FindInstancesAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceIdentifier; + timestamp: Date; +} + +/** + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface DestinationObject { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindInstancesAgentRequestPayload { + app: AppIdentifier; +} + +/** + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppIdentifier { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to a findInstances request. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface FindInstancesAgentResponse { + meta: AgentResponseMetadata; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindInstancesAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findInstancesResponse'; +} + +/** + * The message payload contains a flag indicating whether the API call was successful, plus + * any return values for the FDC3 API function called, or indicating that the request + * resulted in an error and including a standardized error message. + * + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesAgentResponsePayload { + appIdentifiers: AppMetadata[]; +} + +/** + * Extends an `AppIdentifier`, describing an application or instance of an application, with + * additional descriptive metadata that is usually provided by an FDC3 App Directory that + * the Desktop Agent connects to. + * + * The additional information from an app directory can aid in rendering UI elements, such + * as a launcher menu or resolver UI. This includes a title, description, tooltip and icon + * and screenshot URLs. + * + * Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the + * `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc. + */ +export interface AppMetadata { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * A longer, multi-paragraph description for the application that could include markup. + */ + description?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent?: string; + /** + * A list of icon URLs for the application that can be used to render UI elements. + */ + icons?: Icon[]; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + /** + * An optional set of, implementation specific, metadata fields that can be used to + * disambiguate instances, such as a window title or screen position. Must only be set if + * `instanceId` is set. + */ + instanceMetadata?: { [key: string]: any }; + /** + * The 'friendly' app name. + * This field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now + * require an `AppIdentifier` wth `appId` set. + * Note that for display purposes the `title` field should be used, if set, in preference to + * this field. + */ + name?: string; + /** + * The type of output returned for any intent specified during resolution. May express a + * particular context type (e.g. "fdc3.instrument"), channel (e.g. "channel") or a channel + * that will receive a specified type (e.g. "channel"). + */ + resultType?: null | string; + /** + * Images representing the app in common usage scenarios that can be used to render UI + * elements. + */ + screenshots?: Image[]; + /** + * A more user-friendly application title that can be used to render UI elements. + */ + title?: string; + /** + * A tooltip for the application that can be used to render UI elements. + */ + tooltip?: string; + /** + * The Version of the application. + */ + version?: string; +} + +/** + * Describes an Icon image that may be used to represent the application. + */ +export interface Icon { + /** + * The icon dimension, formatted as `x`. + */ + size?: string; + /** + * The icon url. + */ + src: string; + /** + * Icon media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; +} + +/** + * Describes an image file, typically a screenshot, that often represents the application in + * a common usage scenario. + */ +export interface Image { + /** + * Caption for the image. + */ + label?: string; + /** + * The image dimension, formatted as `x`. + */ + size?: string; + /** + * The image url. + */ + src: string; + /** + * Image media type. If not present the Desktop Agent may use the src file extension. + */ + type?: string; +} + +/** + * A response to a findInstances request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindInstancesBridgeErrorResponse { + meta: FindInstancesBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: MessagePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findInstancesResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindInstancesBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface MessagePayload { + error: FindInstancesErrors; +} + +/** + * A request for details of instances of a particular app + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface FindInstancesBridgeRequest { + meta: FindInstancesBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindInstancesBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findInstancesRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindInstancesBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSourceObject; + timestamp: Date; +} + +/** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + * + * Field that represents the source application that a request or response was received + * from, or the source Desktop Agent if it issued the request or response itself. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + * + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + */ +export interface MetaSourceObject { + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId?: string; + /** + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + * + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + */ + desktopAgent: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindInstancesBridgeRequestPayload { + app: AppIdentifier; +} + +/** + * A response to a findInstances request. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface FindInstancesBridgeResponse { + meta: BridgeResponseMessageMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindInstancesBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findInstancesResponse'; +} + +/** + * The message payload contains a flag indicating whether the API call was successful, plus + * any return values for the FDC3 API function called, or indicating that the request + * resulted in an error and including a standardized error message. + * + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindInstancesBridgeResponsePayload { + appIdentifiers: AppMetadata[]; +} + +/** + * A response to a findIntent request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindIntentAgentErrorResponse { + meta: FindIntentAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: FindIntentAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface FindIntentAgentErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request for details of apps available to resolve a particular intent and context pair. + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface FindIntentAgentRequest { + meta: FindIntentAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface FindIntentAgentRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceIdentifier; + timestamp: Date; + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentAgentRequestPayload { + context?: Context; + intent: string; + resultType?: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to a findIntent request. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface FindIntentAgentResponse { + meta: FindIntentAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentAgentResponsePayload { + appIntent: AppIntent; +} + +/** + * An interface that relates an intent to apps. + */ +export interface AppIntent { + /** + * Details of applications that can resolve the intent. + */ + apps: AppMetadata[]; + /** + * Details of the intent whose relationship to resolving applications is being described. + */ + intent: IntentMetadata; +} + +/** + * Details of the intent whose relationship to resolving applications is being described. + * + * Metadata describing an Intent. + */ +export interface IntentMetadata { + /** + * Display name for the intent. + */ + displayName?: string; + /** + * The unique name of the intent that can be invoked by the raiseIntent call. + */ + name: string; +} + +/** + * A response to a findIntent request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindIntentBridgeErrorResponse { + meta: FindIntentBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: FindIntentBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface FindIntentBridgeErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * A request for details of apps available to resolve a particular intent and context pair. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface FindIntentBridgeRequest { + meta: FindIntentBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindIntentBridgeRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: BridgeParticipantIdentifier; + timestamp: Date; + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentBridgeRequestPayload { + context?: Context; + intent: string; + resultType?: string; +} + +/** + * A response to a findIntent request. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface FindIntentBridgeResponse { + meta: FindIntentBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentBridgeResponsePayload { + appIntent: AppIntent; +} + +/** + * A response to a findIntentsByContext request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface FindIntentsByContextAgentErrorResponse { + meta: FindIntentsByContextAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: FindIntentsByContextAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentsByContextResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentsByContextAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface FindIntentsByContextAgentErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request for details of intents and apps available to resolve them for a particular + * context. + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface FindIntentsByContextAgentRequest { + meta: FindIntentsByContextAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentsByContextAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentsByContextRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface FindIntentsByContextAgentRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentsByContextAgentRequestPayload { + context: Context; + resultType?: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to a findIntentsByContext request. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface FindIntentsByContextAgentResponse { + meta: FindIntentsByContextAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentsByContextAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentsByContextResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface FindIntentsByContextAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentsByContextAgentResponsePayload { + appIntents: AppIntent[]; +} + +/** + * A response to a findIntentsByContext request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface FindIntentsByContextBridgeErrorResponse { + meta: FindIntentsByContextBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: FindIntentsByContextBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentsByContextResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentsByContextBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface FindIntentsByContextBridgeErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * A request for details of intents and apps available to resolve them for a particular + * context. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface FindIntentsByContextBridgeRequest { + meta: FindIntentsByContextBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: FindIntentsByContextBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'findIntentsByContextRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface FindIntentsByContextBridgeRequestMeta { + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: BridgeParticipantIdentifier; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface FindIntentsByContextBridgeRequestPayload { + context: Context; + resultType?: string; +} + +/** + * A response to a findIntentsByContext request. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface FindIntentsByContextBridgeResponse { + meta: FindIntentsByContextBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: FindIntentsByContextBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'findIntentsByContextResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface FindIntentsByContextBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface FindIntentsByContextBridgeResponsePayload { + appIntents: AppIntent[]; +} + +/** + * A response to a getAppMetadata request that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface GetAppMetadataAgentErrorResponse { + meta: GetAppMetadataAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: GetAppMetadataAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getAppMetadataResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface GetAppMetadataAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface GetAppMetadataAgentErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request for metadata about an app + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface GetAppMetadataAgentRequest { + meta: GetAppMetadataAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetAppMetadataAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getAppMetadataRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface GetAppMetadataAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceIdentifier; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetAppMetadataAgentRequestPayload { + app: AppObject; +} + +/** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppObject { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to a getAppMetadata request. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface GetAppMetadataAgentResponse { + meta: GetAppMetadataAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: GetAppMetadataAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getAppMetadataResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface GetAppMetadataAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface GetAppMetadataAgentResponsePayload { + appMetadata: AppMetadata; +} + +/** + * A response to a getAppMetadata request that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface GetAppMetadataBridgeErrorResponse { + meta: GetAppMetadataBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: GetAppMetadataBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getAppMetadataResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface GetAppMetadataBridgeErrorResponsePayload { + error: FindInstancesErrors; +} + +/** + * A request for metadata about an app + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface GetAppMetadataBridgeRequest { + meta: GetAppMetadataBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: GetAppMetadataBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'getAppMetadataRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface GetAppMetadataBridgeRequestPayload { + app: AppObject; +} + +/** + * A response to a getAppMetadata request. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface GetAppMetadataBridgeResponse { + meta: GetAppMetadataBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: GetAppMetadataBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'getAppMetadataResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface GetAppMetadataBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface GetAppMetadataBridgeResponsePayload { + appMetadata: AppMetadata; +} + +/** + * A response to an open request that contains an error + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface OpenAgentErrorResponse { + meta: OpenAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: OpenAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'openResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface OpenAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface OpenAgentErrorResponsePayload { + error: OpenErrorResponsePayload; +} + +/** + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type OpenErrorResponsePayload = + | 'AppNotFound' + | 'AppTimeout' + | 'DesktopAgentNotFound' + | 'ErrorOnLaunch' + | 'MalformedContext' + | 'ResolverUnavailable' + | 'ApiTimeout' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to open an application + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface OpenAgentRequest { + meta: OpenAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: OpenAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'openRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface OpenAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface OpenAgentRequestPayload { + /** + * The application to open on the specified Desktop Agent + */ + app: AppToOpen; + context?: Context; +} + +/** + * The application to open on the specified Desktop Agent + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppToOpen { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to an open request + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface OpenAgentResponse { + meta: OpenAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: OpenAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'openResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface OpenAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface OpenAgentResponsePayload { + appIdentifier: AppIdentifier; +} + +/** + * A response to an open request that contains an error + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface OpenBridgeErrorResponse { + meta: OpenBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: OpenBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'openResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface OpenBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface OpenBridgeErrorResponsePayload { + error: OpenErrorResponsePayload; +} + +/** + * A request to open an application + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface OpenBridgeRequest { + meta: OpenBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: OpenBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'openRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface OpenBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: DestinationObject; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface OpenBridgeRequestPayload { + /** + * The application to open on the specified Desktop Agent + */ + app: AppToOpen; + context?: Context; +} + +/** + * A response to an open request + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface OpenBridgeResponse { + meta: OpenBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: OpenBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'openResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface OpenBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface OpenBridgeResponsePayload { + appIdentifier: AppIdentifier; +} + +/** + * A request to broadcast on a PrivateChannel. + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelBroadcastAgentRequest { + meta: PrivateChannelBroadcastAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelBroadcastAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.broadcast'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelBroadcastAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + * + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + * + * Represents identifiers that MUST include the Desktop Agent name and MAY identify a + * specific app or instance. + * + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ +export interface MetaDestination { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelBroadcastAgentRequestPayload { + /** + * The Id of the PrivateChannel that the broadcast was sent on + */ + channelId: string; + /** + * The context object that was the payload of a broadcast message. + */ + context: Context; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to broadcast on a PrivateChannel. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelBroadcastBridgeRequest { + meta: PrivateChannelBroadcastBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelBroadcastBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.broadcast'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelBroadcastBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelBroadcastBridgeRequestPayload { + /** + * The Id of the PrivateChannel that the broadcast was sent on + */ + channelId: string; + /** + * The context object that was the payload of a broadcast message. + */ + context: Context; +} + +/** + * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelEventListenerAddedAgentRequest { + meta: PrivateChannelEventListenerAddedAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerAddedAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.eventListenerAdded'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelEventListenerAddedAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerAddedAgentRequestPayload { + /** + * The id of the PrivateChannel that the event listener was added to. + */ + channelId: string; + listenerType: PrivateChannelEventListenerTypes; +} + +/** + * Event listener type names for Private Channel events. + */ +export type PrivateChannelEventListenerTypes = 'addContextListener' | 'unsubscribe' | 'disconnect'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to forward on an EventListenerAdded event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelEventListenerAddedBridgeRequest { + meta: PrivateChannelEventListenerAddedBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerAddedBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.eventListenerAdded'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelEventListenerAddedBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerAddedBridgeRequestPayload { + /** + * The id of the PrivateChannel that the event listener was added to. + */ + channelId: string; + listenerType: PrivateChannelEventListenerTypes; +} + +/** + * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelEventListenerRemovedAgentRequest { + meta: PrivateChannelEventListenerRemovedAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerRemovedAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.eventListenerRemoved'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelEventListenerRemovedAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerRemovedAgentRequestPayload { + /** + * The id of the PrivateChannel that the event listener was removed from. + */ + channelId: string; + listenerType: PrivateChannelEventListenerTypes; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelEventListenerRemovedBridgeRequest { + meta: PrivateChannelEventListenerRemovedBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelEventListenerRemovedBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.eventListenerRemoved'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelEventListenerRemovedBridgeRequestPayload { + /** + * The id of the PrivateChannel that the event listener was removed from. + */ + channelId: string; + listenerType: PrivateChannelEventListenerTypes; +} + +/** + * A request to forward on an AddContextListener event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelOnAddContextListenerAgentRequest { + meta: PrivateChannelOnAddContextListenerAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnAddContextListenerAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onAddContextListener'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnAddContextListenerAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnAddContextListenerAgentRequestPayload { + /** + * The id of the PrivateChannel that the context listener was added to. + */ + channelId: string; + /** + * The type of the context listener added. Should be null for an untyped listener. + */ + contextType: null | string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to forward on an AddContextListener event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelOnAddContextListenerBridgeRequest { + meta: PrivateChannelOnAddContextListenerBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnAddContextListenerBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onAddContextListener'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnAddContextListenerBridgeRequestPayload { + /** + * The id of the PrivateChannel that the context listener was added to. + */ + channelId: string; + /** + * The type of the context listener added. Should be null for an untyped listener. + */ + contextType: null | string; +} + +/** + * A request to forward on a Disconnect event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelOnDisconnectAgentRequest { + meta: PrivateChannelOnDisconnectAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnDisconnectAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onDisconnect'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnDisconnectAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnDisconnectAgentRequestPayload { + /** + * The id of the PrivateChannel that the agent discconnected from. + */ + channelId: string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to forward on a Disconnect event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelOnDisconnectBridgeRequest { + meta: PrivateChannelOnDisconnectBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnDisconnectBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onDisconnect'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface PrivateChannelOnDisconnectBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnDisconnectBridgeRequestPayload { + /** + * The id of the PrivateChannel that the agent discconnected from. + */ + channelId: string; +} + +/** + * A request to forward on an Unsubscribe event, relating to a PrivateChannel + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface PrivateChannelOnUnsubscribeAgentRequest { + meta: PrivateChannelOnUnsubscribeAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnUnsubscribeAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onUnsubscribe'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface PrivateChannelOnUnsubscribeAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source?: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnUnsubscribeAgentRequestPayload { + /** + * The id of the PrivateChannel that the context listener was unsubscribed from. + */ + channelId: string; + /** + * The type of the context listener that was unsubscribed. Should be null for an untyped + * listener. + */ + contextType: null | string; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to forward on an Unsubscribe event, relating to a PrivateChannel + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface PrivateChannelOnUnsubscribeBridgeRequest { + meta: ERequestMetadata; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: PrivateChannelOnUnsubscribeBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'PrivateChannel.onUnsubscribe'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface ERequestMetadata { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination?: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface PrivateChannelOnUnsubscribeBridgeRequestPayload { + /** + * The id of the PrivateChannel that the context listener was unsubscribed from. + */ + channelId: string; + /** + * The type of the context listener that was unsubscribed. Should be null for an untyped + * listener. + */ + contextType: null | string; +} + +/** + * A response to a request to raise an intent that contains an error. + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface RaiseIntentAgentErrorResponse { + meta: RaiseIntentAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: RaiseIntentAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Used if a raiseIntent request resulted in an error. + * + * Error message payload containing an standardized error string. + */ +export interface RaiseIntentAgentErrorResponsePayload { + /** + * Should be set if the raiseIntent request returned an error. + */ + error: FindInstancesErrors; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A request to raise an intent. + * + * A request message from a Desktop Agent to the Bridge. + */ +export interface RaiseIntentAgentRequest { + meta: RaiseIntentAgentRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentAgentRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'raiseIntentRequest'; +} + +/** + * Metadata for a request message sent by Desktop Agents to the Bridge. + */ +export interface RaiseIntentAgentRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. + */ + source: SourceObject; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentAgentRequestPayload { + app: AppDestinationIdentifier; + context: Context; + intent: string; +} + +/** + * Field that represents a destination App on a remote Desktop Agent that a request is to be + * sent to. + * + * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios + * where a request needs to be directed to a Desktop Agent rather than a specific app, or a + * response message is returned by the Desktop Agent (or more specifically its resolver) + * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no + * app details are available or are appropriate. + * + * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge + * before the timeout or because an error occurred. May be omitted if all sources responded + * without errors. MUST include the `desktopAgent` field when returned by the bridge. + * + * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. + * Will contain a single value for individual responses and multiple values for responses + * that were collated by the bridge. May be omitted if all sources errored. MUST include the + * `desktopAgent` field when returned by the bridge. + * + * Field that represents a destination Desktop Agent that a request is to be sent to. + * + * Identifies an application, or instance of an application, and is used to target FDC3 API + * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application + * instances. + * + * Will always include at least an `appId` field, which uniquely identifies a specific app. + * + * If the `instanceId` field is set then the `AppMetadata` object represents a specific + * instance of the application that may be addressed using that Id. + * + * Field that represents the source application that a request or response was received + * from. + * + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ +export interface AppDestinationIdentifier { + /** + * Used in Desktop Agent Bridging to attribute or target a message to a + * particular Desktop Agent. + * + * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to + * identify the Desktop Agent to target. + */ + desktopAgent: string; + /** + * The unique application identifier located within a specific application directory + * instance. An example of an appId might be 'app@sub.root'. + */ + appId: string; + /** + * An optional instance identifier, indicating that this object represents a specific + * instance of the application described. + */ + instanceId?: string; + [property: string]: any; +} + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A response to a request to raise an intent. + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface RaiseIntentAgentResponse { + meta: RaiseIntentAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentAgentResponsePayload { + /** + * Used if the raiseIntent request was successfully resolved. + */ + intentResolution: IntentResolution; +} + +/** + * Used if the raiseIntent request was successfully resolved. + * + * IntentResolution provides a standard format for data returned upon resolving an intent. + * + * ```javascript + * //resolve a "Chain" type intent + * let resolution = await agent.raiseIntent("intentName", context); + * + * //resolve a "Client-Service" type intent with a data response or a Channel + * let resolution = await agent.raiseIntent("intentName", context); + * try { + * const result = await resolution.getResult(); + * if (result && result.broadcast) { + * console.log(`${resolution.source} returned a channel with id ${result.id}`); + * } else if (result){ + * console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`); + * } else { + * console.error(`${resolution.source} didn't return data` + * } + * } catch(error) { + * console.error(`${resolution.source} returned an error: ${error}`); + * } + * + * // Use metadata about the resolving app instance to target a further intent + * await agent.raiseIntent("intentName", context, resolution.source); + * ``` + */ +export interface IntentResolution { + /** + * The intent that was raised. May be used to determine which intent the user + * chose in response to `fdc3.raiseIntentForContext()`. + */ + intent: string; + /** + * Identifier for the app instance that was selected (or started) to resolve the intent. + * `source.instanceId` MUST be set, indicating the specific app instance that + * received the intent. + */ + source: AppIdentifier; +} + +/** + * A response to a request to raise an intent that contains an error. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface RaiseIntentBridgeErrorResponse { + meta: RaiseIntentBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: RaiseIntentBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Used if a raiseIntent request resulted in an error. + * + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface RaiseIntentBridgeErrorResponsePayload { + /** + * Should be set if the raiseIntent request returned an error. + */ + error: FindInstancesErrors; +} + +/** + * A request to raise an intent. + * + * A request message forwarded from the Bridge onto a Desktop Agent connected to it. + */ +export interface RaiseIntentBridgeRequest { + meta: RaiseIntentBridgeRequestMeta; + /** + * The message payload typically contains the arguments to FDC3 API functions. + */ + payload: RaiseIntentBridgeRequestPayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Request' appended. + */ + type: 'raiseIntentRequest'; +} + +/** + * Metadata required in a request message forwarded on by the Bridge + */ +export interface RaiseIntentBridgeRequestMeta { + /** + * Optional field that represents the destination that the request should be routed to. Must + * be set by the Desktop Agent for API calls that include a target app parameter and must + * include the name of the Desktop Agent hosting the target application. + */ + destination: MetaDestination; + requestUuid: string; + /** + * Field that represents the source application that the request was received from, or the + * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST + * be set by the bridge. + */ + source: MetaSource; + timestamp: Date; +} + +/** + * The message payload typically contains the arguments to FDC3 API functions. + */ +export interface RaiseIntentBridgeRequestPayload { + app: AppDestinationIdentifier; + context: Context; + intent: string; +} + +/** + * A response to a request to raise an intent. + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface RaiseIntentBridgeResponse { + meta: RaiseIntentBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentBridgeResponsePayload { + /** + * Used if the raiseIntent request was successfully resolved. + */ + intentResolution: IntentResolution; +} + +/** + * A secondary response to a request to raise an intent used to deliver the intent result, + * which contains an error + * + * A response message from a Desktop Agent to the Bridge containing an error, to be used in + * preference to the standard response when an error needs to be returned. + */ +export interface RaiseIntentResultAgentErrorResponse { + meta: RaiseIntentResultAgentErrorResponseMeta; + /** + * Error message payload containing an standardized error string. + */ + payload: RaiseIntentResultAgentErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResultResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentResultAgentErrorResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * Error message payload containing an standardized error string. + */ +export interface RaiseIntentResultAgentErrorResponsePayload { + error: RaiseIntentResultErrorMessage; +} + +/** + * Array of error message strings for responses that were not returned to the bridge before + * the timeout or because an error occurred. Should be the same length as the `errorSources` + * array and ordered the same. May be omitted if all sources responded without errors. + * + * Constants representing the errors that can be encountered when calling the `open` method + * on the DesktopAgent object (`fdc3`). + * + * Constants representing the errors that can be encountered when calling the `findIntent`, + * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the + * DesktopAgent (`fdc3`). + */ +export type RaiseIntentResultErrorMessage = + | 'IntentHandlerRejected' + | 'NoResultReturned' + | 'ApiTimeout' + | 'AgentDisconnected' + | 'NotConnectedToBridge' + | 'ResponseToBridgeTimedOut' + | 'MalformedMessage'; + +/** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + * + * Unique identifier for a request or event message. Required in all message types. + * + * Unique identifier for a response to a specific message and must always be accompanied by + * a RequestUuid. + */ + +/** + * A secondary response to a request to raise an intent used to deliver the intent result + * + * A response message from a Desktop Agent to the Bridge. + */ +export interface RaiseIntentResultAgentResponse { + meta: RaiseIntentResultAgentResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResultAgentResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResultResponse'; +} + +/** + * Metadata for a response messages sent by a Desktop Agent to the Bridge + */ +export interface RaiseIntentResultAgentResponseMeta { + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResultAgentResponsePayload { + intentResult: IntentResult; +} + +export interface IntentResult { + context?: Context; + channel?: Channel; +} + +/** + * Represents a context channel that applications can use to send and receive + * context data. + * + * Please note that There are differences in behavior when you interact with a + * User channel via the `DesktopAgent` interface and the `Channel` interface. + * Specifically, when 'joining' a User channel or adding a context listener + * when already joined to a channel via the `DesktopAgent` interface, existing + * context (matching the type of the context listener) on the channel is + * received by the context listener immediately. Whereas, when a context + * listener is added via the Channel interface, context is not received + * automatically, but may be retrieved manually via the `getCurrentContext()` + * function. + */ +export interface Channel { + /** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + */ + displayMetadata?: DisplayMetadata; + /** + * Constant that uniquely identifies this channel. + */ + id: string; + /** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ + type: Type; +} + +/** + * Channels may be visualized and selectable by users. DisplayMetadata may be used to + * provide hints on how to see them. + * For App channels, displayMetadata would typically not be present. + * + * A system channel will be global enough to have a presence across many apps. This gives us + * some hints + * to render them in a standard way. It is assumed it may have other properties too, but if + * it has these, + * this is their meaning. + */ +export interface DisplayMetadata { + /** + * The color that should be associated within this channel when displaying this channel in a + * UI, e.g: `0xFF0000`. + */ + color?: string; + /** + * A URL of an image that can be used to display this channel. + */ + glyph?: string; + /** + * A user-readable name for this channel, e.g: `"Red"`. + */ + name?: string; +} + +/** + * Uniquely defines each channel type. + * Can be "user", "app" or "private". + */ +export type Type = 'app' | 'private' | 'user'; + +/** + * A secondary response to a request to raise an intent used to deliver the intent result, + * which contains an error + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request, used where all connected agents returned errors. + */ +export interface RaiseIntentResultBridgeErrorResponse { + meta: RaiseIntentResultBridgeErrorResponseMeta; + /** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ + payload: RaiseIntentResultBridgeErrorResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResultResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentResultBridgeErrorResponseMeta { + errorDetails: ResponseErrorDetail[]; + errorSources: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + timestamp: Date; +} + +/** + * The error message payload contains details of an error return to the app or agent that + * raised the original request. + */ +export interface RaiseIntentResultBridgeErrorResponsePayload { + error: RaiseIntentResultErrorMessage; +} + +/** + * A secondary response to a request to raise an intent used to deliver the intent result + * + * A response message from the Bridge back to the original Desktop Agent that raised the + * request. + */ +export interface RaiseIntentResultBridgeResponse { + meta: RaiseIntentResultBridgeResponseMeta; + /** + * The message payload typically contains return values for FDC3 API functions. + */ + payload: RaiseIntentResultBridgeResponsePayload; + /** + * Identifies the type of the message and it is typically set to the FDC3 function name that + * the message relates to, e.g. 'findIntent', with 'Response' appended. + */ + type: 'raiseIntentResultResponse'; +} + +/** + * Metadata required in a response message collated and/or forwarded on by the Bridge + */ +export interface RaiseIntentResultBridgeResponseMeta { + errorDetails?: ResponseErrorDetail[]; + errorSources?: DesktopAgentIdentifier[]; + requestUuid: string; + responseUuid: string; + sources?: DesktopAgentIdentifier[]; + timestamp: Date; +} + +/** + * The message payload typically contains return values for FDC3 API functions. + */ +export interface RaiseIntentResultBridgeResponsePayload { + intentResult: IntentResult; +} + +// Converts JSON strings to/from your types +// and asserts the results of JSON.parse at runtime +export class Convert { + public static toAgentErrorResponseMessage(json: string): AgentErrorResponseMessage { + return cast(JSON.parse(json), r('AgentErrorResponseMessage')); + } + + public static agentErrorResponseMessageToJson(value: AgentErrorResponseMessage): string { + return JSON.stringify(uncast(value, r('AgentErrorResponseMessage')), null, 2); + } + + public static toAgentRequestMessage(json: string): AgentRequestMessage { + return cast(JSON.parse(json), r('AgentRequestMessage')); + } + + public static agentRequestMessageToJson(value: AgentRequestMessage): string { + return JSON.stringify(uncast(value, r('AgentRequestMessage')), null, 2); + } + + public static toAgentResponseMessage(json: string): AgentResponseMessage { + return cast(JSON.parse(json), r('AgentResponseMessage')); + } + + public static agentResponseMessageToJson(value: AgentResponseMessage): string { + return JSON.stringify(uncast(value, r('AgentResponseMessage')), null, 2); + } + + public static toBridgeErrorResponseMessage(json: string): BridgeErrorResponseMessage { + return cast(JSON.parse(json), r('BridgeErrorResponseMessage')); + } + + public static bridgeErrorResponseMessageToJson(value: BridgeErrorResponseMessage): string { + return JSON.stringify(uncast(value, r('BridgeErrorResponseMessage')), null, 2); + } + + public static toBridgeRequestMessage(json: string): BridgeRequestMessage { + return cast(JSON.parse(json), r('BridgeRequestMessage')); + } + + public static bridgeRequestMessageToJson(value: BridgeRequestMessage): string { + return JSON.stringify(uncast(value, r('BridgeRequestMessage')), null, 2); + } + + public static toBridgeResponseMessage(json: string): BridgeResponseMessage { + return cast(JSON.parse(json), r('BridgeResponseMessage')); + } + + public static bridgeResponseMessageToJson(value: BridgeResponseMessage): string { + return JSON.stringify(uncast(value, r('BridgeResponseMessage')), null, 2); + } + + public static toBroadcastAgentRequest(json: string): BroadcastAgentRequest { + return cast(JSON.parse(json), r('BroadcastAgentRequest')); + } + + public static broadcastAgentRequestToJson(value: BroadcastAgentRequest): string { + return JSON.stringify(uncast(value, r('BroadcastAgentRequest')), null, 2); + } + + public static toBroadcastBridgeRequest(json: string): BroadcastBridgeRequest { + return cast(JSON.parse(json), r('BroadcastBridgeRequest')); + } + + public static broadcastBridgeRequestToJson(value: BroadcastBridgeRequest): string { + return JSON.stringify(uncast(value, r('BroadcastBridgeRequest')), null, 2); + } + + public static toBridgeCommonDefinitions(json: string): { [key: string]: any } { + return cast(JSON.parse(json), m('any')); + } + + public static bridgeCommonDefinitionsToJson(value: { [key: string]: any }): string { + return JSON.stringify(uncast(value, m('any')), null, 2); + } + + public static toConnectionStepMessage(json: string): ConnectionStepMessage { + return cast(JSON.parse(json), r('ConnectionStepMessage')); + } + + public static connectionStepMessageToJson(value: ConnectionStepMessage): string { + return JSON.stringify(uncast(value, r('ConnectionStepMessage')), null, 2); + } + + public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { + return cast(JSON.parse(json), r('ConnectionStep2Hello')); + } + + public static connectionStep2HelloToJson(value: ConnectionStep2Hello): string { + return JSON.stringify(uncast(value, r('ConnectionStep2Hello')), null, 2); + } + + public static toConnectionStep3Handshake(json: string): ConnectionStep3Handshake { + return cast(JSON.parse(json), r('ConnectionStep3Handshake')); + } + + public static connectionStep3HandshakeToJson(value: ConnectionStep3Handshake): string { + return JSON.stringify(uncast(value, r('ConnectionStep3Handshake')), null, 2); + } + + public static toConnectionStep4AuthenticationFailed(json: string): ConnectionStep4AuthenticationFailed { + return cast(JSON.parse(json), r('ConnectionStep4AuthenticationFailed')); + } + + public static connectionStep4AuthenticationFailedToJson(value: ConnectionStep4AuthenticationFailed): string { + return JSON.stringify(uncast(value, r('ConnectionStep4AuthenticationFailed')), null, 2); + } + + public static toConnectionStep6ConnectedAgentsUpdate(json: string): ConnectionStep6ConnectedAgentsUpdate { + return cast(JSON.parse(json), r('ConnectionStep6ConnectedAgentsUpdate')); + } + + public static connectionStep6ConnectedAgentsUpdateToJson(value: ConnectionStep6ConnectedAgentsUpdate): string { + return JSON.stringify(uncast(value, r('ConnectionStep6ConnectedAgentsUpdate')), null, 2); + } + + public static toFindInstancesAgentErrorResponse(json: string): FindInstancesAgentErrorResponse { + return cast(JSON.parse(json), r('FindInstancesAgentErrorResponse')); + } + + public static findInstancesAgentErrorResponseToJson(value: FindInstancesAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentErrorResponse')), null, 2); + } + + public static toFindInstancesAgentRequest(json: string): FindInstancesAgentRequest { + return cast(JSON.parse(json), r('FindInstancesAgentRequest')); + } + + public static findInstancesAgentRequestToJson(value: FindInstancesAgentRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentRequest')), null, 2); + } + + public static toFindInstancesAgentResponse(json: string): FindInstancesAgentResponse { + return cast(JSON.parse(json), r('FindInstancesAgentResponse')); + } + + public static findInstancesAgentResponseToJson(value: FindInstancesAgentResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesAgentResponse')), null, 2); + } + + public static toFindInstancesBridgeErrorResponse(json: string): FindInstancesBridgeErrorResponse { + return cast(JSON.parse(json), r('FindInstancesBridgeErrorResponse')); + } + + public static findInstancesBridgeErrorResponseToJson(value: FindInstancesBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeErrorResponse')), null, 2); + } + + public static toFindInstancesBridgeRequest(json: string): FindInstancesBridgeRequest { + return cast(JSON.parse(json), r('FindInstancesBridgeRequest')); + } + + public static findInstancesBridgeRequestToJson(value: FindInstancesBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeRequest')), null, 2); + } + + public static toFindInstancesBridgeResponse(json: string): FindInstancesBridgeResponse { + return cast(JSON.parse(json), r('FindInstancesBridgeResponse')); + } + + public static findInstancesBridgeResponseToJson(value: FindInstancesBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindInstancesBridgeResponse')), null, 2); + } + + public static toFindIntentAgentErrorResponse(json: string): FindIntentAgentErrorResponse { + return cast(JSON.parse(json), r('FindIntentAgentErrorResponse')); + } + + public static findIntentAgentErrorResponseToJson(value: FindIntentAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentAgentErrorResponse')), null, 2); + } + + public static toFindIntentAgentRequest(json: string): FindIntentAgentRequest { + return cast(JSON.parse(json), r('FindIntentAgentRequest')); + } + + public static findIntentAgentRequestToJson(value: FindIntentAgentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentAgentRequest')), null, 2); + } + + public static toFindIntentAgentResponse(json: string): FindIntentAgentResponse { + return cast(JSON.parse(json), r('FindIntentAgentResponse')); + } + + public static findIntentAgentResponseToJson(value: FindIntentAgentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentAgentResponse')), null, 2); + } + + public static toFindIntentBridgeErrorResponse(json: string): FindIntentBridgeErrorResponse { + return cast(JSON.parse(json), r('FindIntentBridgeErrorResponse')); + } + + public static findIntentBridgeErrorResponseToJson(value: FindIntentBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeErrorResponse')), null, 2); + } + + public static toFindIntentBridgeRequest(json: string): FindIntentBridgeRequest { + return cast(JSON.parse(json), r('FindIntentBridgeRequest')); + } + + public static findIntentBridgeRequestToJson(value: FindIntentBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeRequest')), null, 2); + } + + public static toFindIntentBridgeResponse(json: string): FindIntentBridgeResponse { + return cast(JSON.parse(json), r('FindIntentBridgeResponse')); + } + + public static findIntentBridgeResponseToJson(value: FindIntentBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindIntentBridgeResponse')), null, 2); + } + + public static toFindIntentsByContextAgentErrorResponse(json: string): FindIntentsByContextAgentErrorResponse { + return cast(JSON.parse(json), r('FindIntentsByContextAgentErrorResponse')); + } + + public static findIntentsByContextAgentErrorResponseToJson(value: FindIntentsByContextAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentErrorResponse')), null, 2); + } + + public static toFindIntentsByContextAgentRequest(json: string): FindIntentsByContextAgentRequest { + return cast(JSON.parse(json), r('FindIntentsByContextAgentRequest')); + } + + public static findIntentsByContextAgentRequestToJson(value: FindIntentsByContextAgentRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentRequest')), null, 2); + } + + public static toFindIntentsByContextAgentResponse(json: string): FindIntentsByContextAgentResponse { + return cast(JSON.parse(json), r('FindIntentsByContextAgentResponse')); + } + + public static findIntentsByContextAgentResponseToJson(value: FindIntentsByContextAgentResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextAgentResponse')), null, 2); + } + + public static toFindIntentsByContextBridgeErrorResponse(json: string): FindIntentsByContextBridgeErrorResponse { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeErrorResponse')); + } + + public static findIntentsByContextBridgeErrorResponseToJson(value: FindIntentsByContextBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeErrorResponse')), null, 2); + } + + public static toFindIntentsByContextBridgeRequest(json: string): FindIntentsByContextBridgeRequest { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeRequest')); + } + + public static findIntentsByContextBridgeRequestToJson(value: FindIntentsByContextBridgeRequest): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeRequest')), null, 2); + } + + public static toFindIntentsByContextBridgeResponse(json: string): FindIntentsByContextBridgeResponse { + return cast(JSON.parse(json), r('FindIntentsByContextBridgeResponse')); + } + + public static findIntentsByContextBridgeResponseToJson(value: FindIntentsByContextBridgeResponse): string { + return JSON.stringify(uncast(value, r('FindIntentsByContextBridgeResponse')), null, 2); + } + + public static toGetAppMetadataAgentErrorResponse(json: string): GetAppMetadataAgentErrorResponse { + return cast(JSON.parse(json), r('GetAppMetadataAgentErrorResponse')); + } + + public static getAppMetadataAgentErrorResponseToJson(value: GetAppMetadataAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentErrorResponse')), null, 2); + } + + public static toGetAppMetadataAgentRequest(json: string): GetAppMetadataAgentRequest { + return cast(JSON.parse(json), r('GetAppMetadataAgentRequest')); + } + + public static getAppMetadataAgentRequestToJson(value: GetAppMetadataAgentRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentRequest')), null, 2); + } + + public static toGetAppMetadataAgentResponse(json: string): GetAppMetadataAgentResponse { + return cast(JSON.parse(json), r('GetAppMetadataAgentResponse')); + } + + public static getAppMetadataAgentResponseToJson(value: GetAppMetadataAgentResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataAgentResponse')), null, 2); + } + + public static toGetAppMetadataBridgeErrorResponse(json: string): GetAppMetadataBridgeErrorResponse { + return cast(JSON.parse(json), r('GetAppMetadataBridgeErrorResponse')); + } + + public static getAppMetadataBridgeErrorResponseToJson(value: GetAppMetadataBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeErrorResponse')), null, 2); + } + + public static toGetAppMetadataBridgeRequest(json: string): GetAppMetadataBridgeRequest { + return cast(JSON.parse(json), r('GetAppMetadataBridgeRequest')); + } + + public static getAppMetadataBridgeRequestToJson(value: GetAppMetadataBridgeRequest): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeRequest')), null, 2); + } + + public static toGetAppMetadataBridgeResponse(json: string): GetAppMetadataBridgeResponse { + return cast(JSON.parse(json), r('GetAppMetadataBridgeResponse')); + } + + public static getAppMetadataBridgeResponseToJson(value: GetAppMetadataBridgeResponse): string { + return JSON.stringify(uncast(value, r('GetAppMetadataBridgeResponse')), null, 2); + } + + public static toOpenAgentErrorResponse(json: string): OpenAgentErrorResponse { + return cast(JSON.parse(json), r('OpenAgentErrorResponse')); + } + + public static openAgentErrorResponseToJson(value: OpenAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('OpenAgentErrorResponse')), null, 2); + } + + public static toOpenAgentRequest(json: string): OpenAgentRequest { + return cast(JSON.parse(json), r('OpenAgentRequest')); + } + + public static openAgentRequestToJson(value: OpenAgentRequest): string { + return JSON.stringify(uncast(value, r('OpenAgentRequest')), null, 2); + } + + public static toOpenAgentResponse(json: string): OpenAgentResponse { + return cast(JSON.parse(json), r('OpenAgentResponse')); + } + + public static openAgentResponseToJson(value: OpenAgentResponse): string { + return JSON.stringify(uncast(value, r('OpenAgentResponse')), null, 2); + } + + public static toOpenBridgeErrorResponse(json: string): OpenBridgeErrorResponse { + return cast(JSON.parse(json), r('OpenBridgeErrorResponse')); + } + + public static openBridgeErrorResponseToJson(value: OpenBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('OpenBridgeErrorResponse')), null, 2); + } + + public static toOpenBridgeRequest(json: string): OpenBridgeRequest { + return cast(JSON.parse(json), r('OpenBridgeRequest')); + } + + public static openBridgeRequestToJson(value: OpenBridgeRequest): string { + return JSON.stringify(uncast(value, r('OpenBridgeRequest')), null, 2); + } + + public static toOpenBridgeResponse(json: string): OpenBridgeResponse { + return cast(JSON.parse(json), r('OpenBridgeResponse')); + } + + public static openBridgeResponseToJson(value: OpenBridgeResponse): string { + return JSON.stringify(uncast(value, r('OpenBridgeResponse')), null, 2); + } + + public static toPrivateChannelBroadcastAgentRequest(json: string): PrivateChannelBroadcastAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelBroadcastAgentRequest')); + } + + public static privateChannelBroadcastAgentRequestToJson(value: PrivateChannelBroadcastAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelBroadcastAgentRequest')), null, 2); + } + + public static toPrivateChannelBroadcastBridgeRequest(json: string): PrivateChannelBroadcastBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelBroadcastBridgeRequest')); + } + + public static privateChannelBroadcastBridgeRequestToJson(value: PrivateChannelBroadcastBridgeRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelBroadcastBridgeRequest')), null, 2); + } + + public static toPrivateChannelEventListenerAddedAgentRequest( + json: string + ): PrivateChannelEventListenerAddedAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerAddedAgentRequest')); + } + + public static privateChannelEventListenerAddedAgentRequestToJson( + value: PrivateChannelEventListenerAddedAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAddedAgentRequest')), null, 2); + } + + public static toPrivateChannelEventListenerAddedBridgeRequest( + json: string + ): PrivateChannelEventListenerAddedBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerAddedBridgeRequest')); + } + + public static privateChannelEventListenerAddedBridgeRequestToJson( + value: PrivateChannelEventListenerAddedBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerAddedBridgeRequest')), null, 2); + } + + public static toPrivateChannelEventListenerRemovedAgentRequest( + json: string + ): PrivateChannelEventListenerRemovedAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerRemovedAgentRequest')); + } + + public static privateChannelEventListenerRemovedAgentRequestToJson( + value: PrivateChannelEventListenerRemovedAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemovedAgentRequest')), null, 2); + } + + public static toPrivateChannelEventListenerRemovedBridgeRequest( + json: string + ): PrivateChannelEventListenerRemovedBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelEventListenerRemovedBridgeRequest')); + } + + public static privateChannelEventListenerRemovedBridgeRequestToJson( + value: PrivateChannelEventListenerRemovedBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelEventListenerRemovedBridgeRequest')), null, 2); + } + + public static toPrivateChannelOnAddContextListenerAgentRequest( + json: string + ): PrivateChannelOnAddContextListenerAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListenerAgentRequest')); + } + + public static privateChannelOnAddContextListenerAgentRequestToJson( + value: PrivateChannelOnAddContextListenerAgentRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListenerAgentRequest')), null, 2); + } + + public static toPrivateChannelOnAddContextListenerBridgeRequest( + json: string + ): PrivateChannelOnAddContextListenerBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnAddContextListenerBridgeRequest')); + } + + public static privateChannelOnAddContextListenerBridgeRequestToJson( + value: PrivateChannelOnAddContextListenerBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnAddContextListenerBridgeRequest')), null, 2); + } + + public static toPrivateChannelOnDisconnectAgentRequest(json: string): PrivateChannelOnDisconnectAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnectAgentRequest')); + } + + public static privateChannelOnDisconnectAgentRequestToJson(value: PrivateChannelOnDisconnectAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnectAgentRequest')), null, 2); + } + + public static toPrivateChannelOnDisconnectBridgeRequest(json: string): PrivateChannelOnDisconnectBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnDisconnectBridgeRequest')); + } + + public static privateChannelOnDisconnectBridgeRequestToJson(value: PrivateChannelOnDisconnectBridgeRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnDisconnectBridgeRequest')), null, 2); + } + + public static toPrivateChannelOnUnsubscribeAgentRequest(json: string): PrivateChannelOnUnsubscribeAgentRequest { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribeAgentRequest')); + } + + public static privateChannelOnUnsubscribeAgentRequestToJson(value: PrivateChannelOnUnsubscribeAgentRequest): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeAgentRequest')), null, 2); + } + + public static toPrivateChannelOnUnsubscribeBridgeRequest(json: string): PrivateChannelOnUnsubscribeBridgeRequest { + return cast(JSON.parse(json), r('PrivateChannelOnUnsubscribeBridgeRequest')); + } + + public static privateChannelOnUnsubscribeBridgeRequestToJson( + value: PrivateChannelOnUnsubscribeBridgeRequest + ): string { + return JSON.stringify(uncast(value, r('PrivateChannelOnUnsubscribeBridgeRequest')), null, 2); + } + + public static toRaiseIntentAgentErrorResponse(json: string): RaiseIntentAgentErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentAgentErrorResponse')); + } + + public static raiseIntentAgentErrorResponseToJson(value: RaiseIntentAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentErrorResponse')), null, 2); + } + + public static toRaiseIntentAgentRequest(json: string): RaiseIntentAgentRequest { + return cast(JSON.parse(json), r('RaiseIntentAgentRequest')); + } + + public static raiseIntentAgentRequestToJson(value: RaiseIntentAgentRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentRequest')), null, 2); + } + + public static toRaiseIntentAgentResponse(json: string): RaiseIntentAgentResponse { + return cast(JSON.parse(json), r('RaiseIntentAgentResponse')); + } + + public static raiseIntentAgentResponseToJson(value: RaiseIntentAgentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentAgentResponse')), null, 2); + } + + public static toRaiseIntentBridgeErrorResponse(json: string): RaiseIntentBridgeErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentBridgeErrorResponse')); + } + + public static raiseIntentBridgeErrorResponseToJson(value: RaiseIntentBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeErrorResponse')), null, 2); + } + + public static toRaiseIntentBridgeRequest(json: string): RaiseIntentBridgeRequest { + return cast(JSON.parse(json), r('RaiseIntentBridgeRequest')); + } + + public static raiseIntentBridgeRequestToJson(value: RaiseIntentBridgeRequest): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeRequest')), null, 2); + } + + public static toRaiseIntentBridgeResponse(json: string): RaiseIntentBridgeResponse { + return cast(JSON.parse(json), r('RaiseIntentBridgeResponse')); + } + + public static raiseIntentBridgeResponseToJson(value: RaiseIntentBridgeResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentBridgeResponse')), null, 2); + } + + public static toRaiseIntentResultAgentErrorResponse(json: string): RaiseIntentResultAgentErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentResultAgentErrorResponse')); + } + + public static raiseIntentResultAgentErrorResponseToJson(value: RaiseIntentResultAgentErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultAgentErrorResponse')), null, 2); + } + + public static toRaiseIntentResultAgentResponse(json: string): RaiseIntentResultAgentResponse { + return cast(JSON.parse(json), r('RaiseIntentResultAgentResponse')); + } + + public static raiseIntentResultAgentResponseToJson(value: RaiseIntentResultAgentResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultAgentResponse')), null, 2); + } + + public static toRaiseIntentResultBridgeErrorResponse(json: string): RaiseIntentResultBridgeErrorResponse { + return cast(JSON.parse(json), r('RaiseIntentResultBridgeErrorResponse')); + } + + public static raiseIntentResultBridgeErrorResponseToJson(value: RaiseIntentResultBridgeErrorResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultBridgeErrorResponse')), null, 2); + } + + public static toRaiseIntentResultBridgeResponse(json: string): RaiseIntentResultBridgeResponse { + return cast(JSON.parse(json), r('RaiseIntentResultBridgeResponse')); + } + + public static raiseIntentResultBridgeResponseToJson(value: RaiseIntentResultBridgeResponse): string { + return JSON.stringify(uncast(value, r('RaiseIntentResultBridgeResponse')), null, 2); + } +} + +function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { + const prettyTyp = prettyTypeName(typ); + const parentText = parent ? ` on ${parent}` : ''; + const keyText = key ? ` for key "${key}"` : ''; + throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); +} + +function prettyTypeName(typ: any): string { + if (Array.isArray(typ)) { + if (typ.length === 2 && typ[0] === undefined) { + return `an optional ${prettyTypeName(typ[1])}`; + } else { + return `one of [${typ + .map(a => { + return prettyTypeName(a); + }) + .join(', ')}]`; + } + } else if (typeof typ === 'object' && typ.literal !== undefined) { + return typ.literal; + } else { + return typeof typ; + } +} + +function jsonToJSProps(typ: any): any { + if (typ.jsonToJS === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.json] = { key: p.js, typ: p.typ })); + typ.jsonToJS = map; + } + return typ.jsonToJS; +} + +function jsToJSONProps(typ: any): any { + if (typ.jsToJSON === undefined) { + const map: any = {}; + typ.props.forEach((p: any) => (map[p.js] = { key: p.json, typ: p.typ })); + typ.jsToJSON = map; + } + return typ.jsToJSON; +} + +function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { + function transformPrimitive(typ: string, val: any): any { + if (typeof typ === typeof val) return val; + return invalidValue(typ, val, key, parent); + } + + function transformUnion(typs: any[], val: any): any { + // val must validate against one typ in typs + const l = typs.length; + for (let i = 0; i < l; i++) { + const typ = typs[i]; + try { + return transform(val, typ, getProps); + } catch (_) {} + } + return invalidValue(typs, val, key, parent); + } + + function transformEnum(cases: string[], val: any): any { + if (cases.indexOf(val) !== -1) return val; + return invalidValue( + cases.map(a => { + return l(a); + }), + val, + key, + parent + ); + } + + function transformArray(typ: any, val: any): any { + // val must be an array with no invalid elements + if (!Array.isArray(val)) return invalidValue(l('array'), val, key, parent); + return val.map(el => transform(el, typ, getProps)); + } + + function transformDate(val: any): any { + if (val === null) { + return null; + } + const d = new Date(val); + if (isNaN(d.valueOf())) { + return invalidValue(l('Date'), val, key, parent); + } + return d; + } + + function transformObject(props: { [k: string]: any }, additional: any, val: any): any { + if (val === null || typeof val !== 'object' || Array.isArray(val)) { + return invalidValue(l(ref || 'object'), val, key, parent); + } + const result: any = {}; + Object.getOwnPropertyNames(props).forEach(key => { + const prop = props[key]; + const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; + result[prop.key] = transform(v, prop.typ, getProps, key, ref); + }); + Object.getOwnPropertyNames(val).forEach(key => { + if (!Object.prototype.hasOwnProperty.call(props, key)) { + result[key] = transform(val[key], additional, getProps, key, ref); + } + }); + return result; + } + + if (typ === 'any') return val; + if (typ === null) { + if (val === null) return val; + return invalidValue(typ, val, key, parent); + } + if (typ === false) return invalidValue(typ, val, key, parent); + let ref: any = undefined; + while (typeof typ === 'object' && typ.ref !== undefined) { + ref = typ.ref; + typ = typeMap[typ.ref]; + } + if (Array.isArray(typ)) return transformEnum(typ, val); + if (typeof typ === 'object') { + return typ.hasOwnProperty('unionMembers') + ? transformUnion(typ.unionMembers, val) + : typ.hasOwnProperty('arrayItems') + ? transformArray(typ.arrayItems, val) + : typ.hasOwnProperty('props') + ? transformObject(getProps(typ), typ.additional, val) + : invalidValue(typ, val, key, parent); + } + // Numbers can be parsed by Date but shouldn't be. + if (typ === Date && typeof val !== 'number') return transformDate(val); + return transformPrimitive(typ, val); +} + +function cast(val: any, typ: any): T { + return transform(val, typ, jsonToJSProps); +} + +function uncast(val: T, typ: any): any { + return transform(val, typ, jsToJSONProps); +} + +function l(typ: any) { + return { literal: typ }; +} + +function a(typ: any) { + return { arrayItems: typ }; +} + +function u(...typs: any[]) { + return { unionMembers: typs }; +} + +function o(props: any[], additional: any) { + return { props, additional }; +} + +function m(additional: any) { + return { props: [], additional }; +} + +function r(name: string) { + return { ref: name }; +} + +const typeMap: any = { + AgentErrorResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('ErrorResponseMessagePayload') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + AgentResponseMetadata: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ErrorResponseMessagePayload: o([{ json: 'error', js: 'error', typ: r('ResponseErrorDetail') }], 'any'), + AgentRequestMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentRequestMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('RequestMessageType') }, + ], + false + ), + AgentRequestMetadata: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BridgeParticipantIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + SourceIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + AgentResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('ResponseMessageType') }, + ], + false + ), + BridgeErrorResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeErrorResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: r('ResponseErrorMessagePayload') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeErrorResponseMessageMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DesktopAgentIdentifier: o([{ json: 'desktopAgent', js: 'desktopAgent', typ: '' }], 'any'), + ResponseErrorMessagePayload: o([{ json: 'error', js: 'error', typ: u(undefined, r('ResponseErrorDetail')) }], 'any'), + BridgeRequestMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeRequestMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeRequestMetadata: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BridgeResponseMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: '' }, + ], + false + ), + BridgeResponseMessageMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + BroadcastAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('BroadcastAgentRequestType') }, + ], + false + ), + BroadcastAgentRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceObject') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + SourceObject: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + BroadcastAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + Context: o( + [ + { json: 'id', js: 'id', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'type', js: 'type', typ: '' }, + ], + 'any' + ), + BroadcastBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('BroadcastBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('BroadcastBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('BroadcastAgentRequestType') }, + ], + false + ), + BroadcastBridgeRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + MetaSource: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + BroadcastBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + ConnectionStepMessage: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStepMetadata') }, + { json: 'payload', js: 'payload', typ: m('any') }, + { json: 'type', js: 'type', typ: r('ConnectionStepMessageType') }, + ], + false + ), + ConnectionStepMetadata: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: u(undefined, '') }, + { json: 'responseUuid', js: 'responseUuid', typ: u(undefined, '') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep2Hello: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep2HelloMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep2HelloPayload') }, + { json: 'type', js: 'type', typ: r('ConnectionStep2HelloType') }, + ], + false + ), + ConnectionStep2HelloMeta: o([{ json: 'timestamp', js: 'timestamp', typ: Date }], false), + ConnectionStep2HelloPayload: o( + [ + { json: 'authRequired', js: 'authRequired', typ: true }, + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'desktopAgentBridgeVersion', js: 'desktopAgentBridgeVersion', typ: '' }, + { json: 'supportedFDC3Versions', js: 'supportedFDC3Versions', typ: a('') }, + ], + false + ), + ConnectionStep3Handshake: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep3HandshakeMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep3HandshakePayload') }, + { json: 'type', js: 'type', typ: r('ConnectionStep3HandshakeType') }, + ], + false + ), + ConnectionStep3HandshakeMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep3HandshakePayload: o( + [ + { json: 'authToken', js: 'authToken', typ: u(undefined, '') }, + { json: 'channelsState', js: 'channelsState', typ: m(a(r('Context'))) }, + { json: 'implementationMetadata', js: 'implementationMetadata', typ: r('ConnectingAgentImplementationMetadata') }, + { json: 'requestedName', js: 'requestedName', typ: '' }, + ], + false + ), + ConnectingAgentImplementationMetadata: o( + [ + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('OptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + OptionalFeatures: o( + [ + { json: 'DesktopAgentBridging', js: 'DesktopAgentBridging', typ: true }, + { json: 'OriginatingAppMetadata', js: 'OriginatingAppMetadata', typ: true }, + { json: 'UserChannelMembershipAPIs', js: 'UserChannelMembershipAPIs', typ: true }, + ], + false + ), + ConnectionStep4AuthenticationFailed: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep4AuthenticationFailedMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep4AuthenticationFailedPayload') }, + { json: 'type', js: 'type', typ: r('ConnectionStep4AuthenticationFailedType') }, + ], + false + ), + ConnectionStep4AuthenticationFailedMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep4AuthenticationFailedPayload: o([{ json: 'message', js: 'message', typ: u(undefined, '') }], false), + ConnectionStep6ConnectedAgentsUpdate: o( + [ + { json: 'meta', js: 'meta', typ: r('ConnectionStep6ConnectedAgentsUpdateMeta') }, + { json: 'payload', js: 'payload', typ: r('ConnectionStep6ConnectedAgentsUpdatePayload') }, + { json: 'type', js: 'type', typ: r('ConnectionStep6ConnectedAgentsUpdateType') }, + ], + false + ), + ConnectionStep6ConnectedAgentsUpdateMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + ConnectionStep6ConnectedAgentsUpdatePayload: o( + [ + { json: 'addAgent', js: 'addAgent', typ: u(undefined, '') }, + { json: 'allAgents', js: 'allAgents', typ: a(r('DesktopAgentImplementationMetadata')) }, + { json: 'channelsState', js: 'channelsState', typ: u(undefined, m(a(r('Context')))) }, + { json: 'removeAgent', js: 'removeAgent', typ: u(undefined, '') }, + ], + false + ), + DesktopAgentImplementationMetadata: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'fdc3Version', js: 'fdc3Version', typ: '' }, + { json: 'optionalFeatures', js: 'optionalFeatures', typ: r('OptionalFeatures') }, + { json: 'provider', js: 'provider', typ: '' }, + { json: 'providerVersion', js: 'providerVersion', typ: u(undefined, '') }, + ], + false + ), + FindInstancesAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('PayloadClass') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentErrorResponseType') }, + ], + false + ), + FindInstancesAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PayloadClass: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + FindInstancesAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentRequestType') }, + ], + false + ), + FindInstancesAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + DestinationObject: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + FindInstancesAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + AppIdentifier: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + FindInstancesAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('AgentResponseMetadata') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentErrorResponseType') }, + ], + false + ), + FindInstancesAgentResponsePayload: o( + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadata')) }], + false + ), + AppMetadata: o( + [ + { json: 'appId', js: 'appId', typ: '' }, + { json: 'description', js: 'description', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: u(undefined, '') }, + { json: 'icons', js: 'icons', typ: u(undefined, a(r('Icon'))) }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + { json: 'instanceMetadata', js: 'instanceMetadata', typ: u(undefined, m('any')) }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, u(null, '')) }, + { json: 'screenshots', js: 'screenshots', typ: u(undefined, a(r('Image'))) }, + { json: 'title', js: 'title', typ: u(undefined, '') }, + { json: 'tooltip', js: 'tooltip', typ: u(undefined, '') }, + { json: 'version', js: 'version', typ: u(undefined, '') }, + ], + false + ), + Icon: o( + [ + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + Image: o( + [ + { json: 'label', js: 'label', typ: u(undefined, '') }, + { json: 'size', js: 'size', typ: u(undefined, '') }, + { json: 'src', js: 'src', typ: '' }, + { json: 'type', js: 'type', typ: u(undefined, '') }, + ], + false + ), + FindInstancesBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('MessagePayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentErrorResponseType') }, + ], + false + ), + FindInstancesBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + MessagePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + FindInstancesBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindInstancesBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentRequestType') }, + ], + false + ), + FindInstancesBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSourceObject') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + MetaSourceObject: o( + [ + { json: 'appId', js: 'appId', typ: u(undefined, '') }, + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + FindInstancesBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppIdentifier') }], false), + FindInstancesBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('BridgeResponseMessageMeta') }, + { json: 'payload', js: 'payload', typ: r('FindInstancesBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindInstancesAgentErrorResponseType') }, + ], + false + ), + FindInstancesBridgeResponsePayload: o( + [{ json: 'appIdentifiers', js: 'appIdentifiers', typ: a(r('AppMetadata')) }], + false + ), + FindIntentAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentErrorResponseType') }, + ], + false + ), + FindIntentAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + FindIntentAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentRequestType') }, + ], + false + ), + FindIntentAgentRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + ], + false + ), + FindIntentAgentRequestPayload: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + { json: 'intent', js: 'intent', typ: '' }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentErrorResponseType') }, + ], + false + ), + FindIntentAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentAgentResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntent') }], false), + AppIntent: o( + [ + { json: 'apps', js: 'apps', typ: a(r('AppMetadata')) }, + { json: 'intent', js: 'intent', typ: r('IntentMetadata') }, + ], + false + ), + IntentMetadata: o( + [ + { json: 'displayName', js: 'displayName', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: '' }, + ], + false + ), + FindIntentBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentErrorResponseType') }, + ], + false + ), + FindIntentBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + FindIntentBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentRequestType') }, + ], + false + ), + FindIntentBridgeRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('BridgeParticipantIdentifier') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + ], + false + ), + FindIntentBridgeRequestPayload: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + { json: 'intent', js: 'intent', typ: '' }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentAgentErrorResponseType') }, + ], + false + ), + FindIntentBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentBridgeResponsePayload: o([{ json: 'appIntent', js: 'appIntent', typ: r('AppIntent') }], false), + FindIntentsByContextAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentErrorResponseType') }, + ], + false + ), + FindIntentsByContextAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextAgentErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], + false + ), + FindIntentsByContextAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentRequestType') }, + ], + false + ), + FindIntentsByContextAgentRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + ], + false + ), + FindIntentsByContextAgentRequestPayload: o( + [ + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentsByContextAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentErrorResponseType') }, + ], + false + ), + FindIntentsByContextAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextAgentResponsePayload: o( + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], + false + ), + FindIntentsByContextBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentErrorResponseType') }, + ], + false + ), + FindIntentsByContextBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextBridgeErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], + false + ), + FindIntentsByContextBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentRequestType') }, + ], + false + ), + FindIntentsByContextBridgeRequestMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + { json: 'destination', js: 'destination', typ: u(undefined, r('BridgeParticipantIdentifier')) }, + ], + false + ), + FindIntentsByContextBridgeRequestPayload: o( + [ + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'resultType', js: 'resultType', typ: u(undefined, '') }, + ], + false + ), + FindIntentsByContextBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('FindIntentsByContextBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('FindIntentsByContextBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('FindIntentsByContextAgentErrorResponseType') }, + ], + false + ), + FindIntentsByContextBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + FindIntentsByContextBridgeResponsePayload: o( + [{ json: 'appIntents', js: 'appIntents', typ: a(r('AppIntent')) }], + false + ), + GetAppMetadataAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentErrorResponseType') }, + ], + false + ), + GetAppMetadataAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + GetAppMetadataAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentRequestType') }, + ], + false + ), + GetAppMetadataAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceIdentifier')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataAgentRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppObject') }], false), + AppObject: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + GetAppMetadataAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentErrorResponseType') }, + ], + false + ), + GetAppMetadataAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataAgentResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), + GetAppMetadataBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentErrorResponseType') }, + ], + false + ), + GetAppMetadataBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + GetAppMetadataBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentRequestType') }, + ], + false + ), + GetAppMetadataBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSourceObject') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataBridgeRequestPayload: o([{ json: 'app', js: 'app', typ: r('AppObject') }], false), + GetAppMetadataBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('GetAppMetadataBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('GetAppMetadataBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('GetAppMetadataAgentErrorResponseType') }, + ], + false + ), + GetAppMetadataBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + GetAppMetadataBridgeResponsePayload: o([{ json: 'appMetadata', js: 'appMetadata', typ: r('AppMetadata') }], false), + OpenAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentErrorResponseType') }, + ], + false + ), + OpenAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('OpenErrorResponsePayload') }], false), + OpenAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentRequestType') }, + ], + false + ), + OpenAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceObject') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenAgentRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('AppToOpen') }, + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + ], + false + ), + AppToOpen: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + OpenAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentErrorResponseType') }, + ], + false + ), + OpenAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenAgentResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('AppIdentifier') }], false), + OpenBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentErrorResponseType') }, + ], + false + ), + OpenBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('OpenErrorResponsePayload') }], false), + OpenBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentRequestType') }, + ], + false + ), + OpenBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('DestinationObject')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenBridgeRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('AppToOpen') }, + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + ], + false + ), + OpenBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('OpenBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('OpenBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('OpenAgentErrorResponseType') }, + ], + false + ), + OpenBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + OpenBridgeResponsePayload: o([{ json: 'appIdentifier', js: 'appIdentifier', typ: r('AppIdentifier') }], false), + PrivateChannelBroadcastAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelBroadcastAgentRequestType') }, + ], + false + ), + PrivateChannelBroadcastAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + MetaDestination: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + PrivateChannelBroadcastAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + PrivateChannelBroadcastBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelBroadcastBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelBroadcastBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelBroadcastAgentRequestType') }, + ], + false + ), + PrivateChannelBroadcastBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelBroadcastBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'context', js: 'context', typ: r('Context') }, + ], + false + ), + PrivateChannelEventListenerAddedAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelEventListenerAddedAgentRequestType') }, + ], + false + ), + PrivateChannelEventListenerAddedAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerAddedAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: r('PrivateChannelEventListenerTypes') }, + ], + false + ), + PrivateChannelEventListenerAddedBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerAddedBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerAddedBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelEventListenerAddedAgentRequestType') }, + ], + false + ), + PrivateChannelEventListenerAddedBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerAddedBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: r('PrivateChannelEventListenerTypes') }, + ], + false + ), + PrivateChannelEventListenerRemovedAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelEventListenerRemovedAgentRequestType') }, + ], + false + ), + PrivateChannelEventListenerRemovedAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerRemovedAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: r('PrivateChannelEventListenerTypes') }, + ], + false + ), + PrivateChannelEventListenerRemovedBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelEventListenerRemovedBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelEventListenerRemovedBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelEventListenerRemovedAgentRequestType') }, + ], + false + ), + PrivateChannelEventListenerRemovedBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelEventListenerRemovedBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'listenerType', js: 'listenerType', typ: r('PrivateChannelEventListenerTypes') }, + ], + false + ), + PrivateChannelOnAddContextListenerAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnAddContextListenerAgentRequestType') }, + ], + false + ), + PrivateChannelOnAddContextListenerAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnAddContextListenerAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + PrivateChannelOnAddContextListenerBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnAddContextListenerBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnAddContextListenerBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnAddContextListenerAgentRequestType') }, + ], + false + ), + PrivateChannelOnAddContextListenerBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnAddContextListenerBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + PrivateChannelOnDisconnectAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnDisconnectAgentRequestType') }, + ], + false + ), + PrivateChannelOnDisconnectAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnDisconnectAgentRequestPayload: o([{ json: 'channelId', js: 'channelId', typ: '' }], false), + PrivateChannelOnDisconnectBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnDisconnectBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnDisconnectBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnDisconnectAgentRequestType') }, + ], + false + ), + PrivateChannelOnDisconnectBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnDisconnectBridgeRequestPayload: o([{ json: 'channelId', js: 'channelId', typ: '' }], false), + PrivateChannelOnUnsubscribeAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('PrivateChannelOnUnsubscribeAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnUnsubscribeAgentRequestType') }, + ], + false + ), + PrivateChannelOnUnsubscribeAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: u(undefined, r('SourceObject')) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnUnsubscribeAgentRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + PrivateChannelOnUnsubscribeBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('ERequestMetadata') }, + { json: 'payload', js: 'payload', typ: r('PrivateChannelOnUnsubscribeBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('PrivateChannelOnUnsubscribeAgentRequestType') }, + ], + false + ), + ERequestMetadata: o( + [ + { json: 'destination', js: 'destination', typ: u(undefined, r('MetaDestination')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + PrivateChannelOnUnsubscribeBridgeRequestPayload: o( + [ + { json: 'channelId', js: 'channelId', typ: '' }, + { json: 'contextType', js: 'contextType', typ: u(null, '') }, + ], + false + ), + RaiseIntentAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentErrorResponseType') }, + ], + false + ), + RaiseIntentAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentAgentErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + RaiseIntentAgentRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentRequestPayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentRequestType') }, + ], + false + ), + RaiseIntentAgentRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: r('MetaDestination') }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('SourceObject') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentAgentRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }, + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'intent', js: 'intent', typ: '' }, + ], + false + ), + AppDestinationIdentifier: o( + [ + { json: 'desktopAgent', js: 'desktopAgent', typ: '' }, + { json: 'appId', js: 'appId', typ: '' }, + { json: 'instanceId', js: 'instanceId', typ: u(undefined, '') }, + ], + 'any' + ), + RaiseIntentAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentErrorResponseType') }, + ], + false + ), + RaiseIntentAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentAgentResponsePayload: o( + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolution') }], + false + ), + IntentResolution: o( + [ + { json: 'intent', js: 'intent', typ: '' }, + { json: 'source', js: 'source', typ: r('AppIdentifier') }, + ], + false + ), + RaiseIntentBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentErrorResponseType') }, + ], + false + ), + RaiseIntentBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentBridgeErrorResponsePayload: o([{ json: 'error', js: 'error', typ: r('FindInstancesErrors') }], false), + RaiseIntentBridgeRequest: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeRequestMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeRequestPayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentRequestType') }, + ], + false + ), + RaiseIntentBridgeRequestMeta: o( + [ + { json: 'destination', js: 'destination', typ: r('MetaDestination') }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'source', js: 'source', typ: r('MetaSource') }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentBridgeRequestPayload: o( + [ + { json: 'app', js: 'app', typ: r('AppDestinationIdentifier') }, + { json: 'context', js: 'context', typ: r('Context') }, + { json: 'intent', js: 'intent', typ: '' }, + ], + false + ), + RaiseIntentBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentAgentErrorResponseType') }, + ], + false + ), + RaiseIntentBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentBridgeResponsePayload: o( + [{ json: 'intentResolution', js: 'intentResolution', typ: r('IntentResolution') }], + false + ), + RaiseIntentResultAgentErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultAgentErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultAgentErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResultAgentErrorResponseType') }, + ], + false + ), + RaiseIntentResultAgentErrorResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultAgentErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('RaiseIntentResultErrorMessage') }], + false + ), + RaiseIntentResultAgentResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultAgentResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultAgentResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResultAgentErrorResponseType') }, + ], + false + ), + RaiseIntentResultAgentResponseMeta: o( + [ + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultAgentResponsePayload: o( + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResult') }], + false + ), + IntentResult: o( + [ + { json: 'context', js: 'context', typ: u(undefined, r('Context')) }, + { json: 'channel', js: 'channel', typ: u(undefined, r('Channel')) }, + ], + false + ), + Channel: o( + [ + { json: 'displayMetadata', js: 'displayMetadata', typ: u(undefined, r('DisplayMetadata')) }, + { json: 'id', js: 'id', typ: '' }, + { json: 'type', js: 'type', typ: r('Type') }, + ], + false + ), + DisplayMetadata: o( + [ + { json: 'color', js: 'color', typ: u(undefined, '') }, + { json: 'glyph', js: 'glyph', typ: u(undefined, '') }, + { json: 'name', js: 'name', typ: u(undefined, '') }, + ], + false + ), + RaiseIntentResultBridgeErrorResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeErrorResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultBridgeErrorResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResultAgentErrorResponseType') }, + ], + false + ), + RaiseIntentResultBridgeErrorResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: a(r('ResponseErrorDetail')) }, + { json: 'errorSources', js: 'errorSources', typ: a(r('DesktopAgentIdentifier')) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultBridgeErrorResponsePayload: o( + [{ json: 'error', js: 'error', typ: r('RaiseIntentResultErrorMessage') }], + false + ), + RaiseIntentResultBridgeResponse: o( + [ + { json: 'meta', js: 'meta', typ: r('RaiseIntentResultBridgeResponseMeta') }, + { json: 'payload', js: 'payload', typ: r('RaiseIntentResultBridgeResponsePayload') }, + { json: 'type', js: 'type', typ: r('RaiseIntentResultAgentErrorResponseType') }, + ], + false + ), + RaiseIntentResultBridgeResponseMeta: o( + [ + { json: 'errorDetails', js: 'errorDetails', typ: u(undefined, a(r('ResponseErrorDetail'))) }, + { json: 'errorSources', js: 'errorSources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'requestUuid', js: 'requestUuid', typ: '' }, + { json: 'responseUuid', js: 'responseUuid', typ: '' }, + { json: 'sources', js: 'sources', typ: u(undefined, a(r('DesktopAgentIdentifier'))) }, + { json: 'timestamp', js: 'timestamp', typ: Date }, + ], + false + ), + RaiseIntentResultBridgeResponsePayload: o( + [{ json: 'intentResult', js: 'intentResult', typ: r('IntentResult') }], + false + ), + ResponseErrorDetail: [ + 'ApiTimeout', + 'AccessDenied', + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'CreationFailed', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'IntentDeliveryFailed', + 'IntentHandlerRejected', + 'MalformedContext', + 'MalformedMessage', + 'NoAppsFound', + 'NoChannelFound', + 'NoResultReturned', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + ResponseMessageType: [ + 'findInstancesResponse', + 'findIntentResponse', + 'findIntentsByContextResponse', + 'getAppMetadataResponse', + 'openResponse', + 'raiseIntentResponse', + 'raiseIntentResultResponse', + ], + RequestMessageType: [ + 'broadcastRequest', + 'findInstancesRequest', + 'findIntentRequest', + 'findIntentsByContextRequest', + 'getAppMetadataRequest', + 'openRequest', + 'PrivateChannel.broadcast', + 'PrivateChannel.eventListenerAdded', + 'PrivateChannel.eventListenerRemoved', + 'PrivateChannel.onAddContextListener', + 'PrivateChannel.onDisconnect', + 'PrivateChannel.onUnsubscribe', + 'raiseIntentRequest', + ], + BroadcastAgentRequestType: ['broadcastRequest'], + ConnectionStepMessageType: ['authenticationFailed', 'connectedAgentsUpdate', 'handshake', 'hello'], + ConnectionStep2HelloType: ['hello'], + ConnectionStep3HandshakeType: ['handshake'], + ConnectionStep4AuthenticationFailedType: ['authenticationFailed'], + ConnectionStep6ConnectedAgentsUpdateType: ['connectedAgentsUpdate'], + FindInstancesErrors: [ + 'ApiTimeout', + 'AgentDisconnected', + 'DesktopAgentNotFound', + 'IntentDeliveryFailed', + 'MalformedContext', + 'MalformedMessage', + 'NoAppsFound', + 'NotConnectedToBridge', + 'ResolverTimeout', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + 'TargetAppUnavailable', + 'TargetInstanceUnavailable', + 'UserCancelledResolution', + ], + FindInstancesAgentErrorResponseType: ['findInstancesResponse'], + FindInstancesAgentRequestType: ['findInstancesRequest'], + FindIntentAgentErrorResponseType: ['findIntentResponse'], + FindIntentAgentRequestType: ['findIntentRequest'], + FindIntentsByContextAgentErrorResponseType: ['findIntentsByContextResponse'], + FindIntentsByContextAgentRequestType: ['findIntentsByContextRequest'], + GetAppMetadataAgentErrorResponseType: ['getAppMetadataResponse'], + GetAppMetadataAgentRequestType: ['getAppMetadataRequest'], + OpenErrorResponsePayload: [ + 'ApiTimeout', + 'AgentDisconnected', + 'AppNotFound', + 'AppTimeout', + 'DesktopAgentNotFound', + 'ErrorOnLaunch', + 'MalformedContext', + 'MalformedMessage', + 'NotConnectedToBridge', + 'ResolverUnavailable', + 'ResponseToBridgeTimedOut', + ], + OpenAgentErrorResponseType: ['openResponse'], + OpenAgentRequestType: ['openRequest'], + PrivateChannelBroadcastAgentRequestType: ['PrivateChannel.broadcast'], + PrivateChannelEventListenerTypes: ['addContextListener', 'disconnect', 'unsubscribe'], + PrivateChannelEventListenerAddedAgentRequestType: ['PrivateChannel.eventListenerAdded'], + PrivateChannelEventListenerRemovedAgentRequestType: ['PrivateChannel.eventListenerRemoved'], + PrivateChannelOnAddContextListenerAgentRequestType: ['PrivateChannel.onAddContextListener'], + PrivateChannelOnDisconnectAgentRequestType: ['PrivateChannel.onDisconnect'], + PrivateChannelOnUnsubscribeAgentRequestType: ['PrivateChannel.onUnsubscribe'], + RaiseIntentAgentErrorResponseType: ['raiseIntentResponse'], + RaiseIntentAgentRequestType: ['raiseIntentRequest'], + RaiseIntentResultErrorMessage: [ + 'ApiTimeout', + 'AgentDisconnected', + 'IntentHandlerRejected', + 'MalformedMessage', + 'NoResultReturned', + 'NotConnectedToBridge', + 'ResponseToBridgeTimedOut', + ], + RaiseIntentResultAgentErrorResponseType: ['raiseIntentResultResponse'], + Type: ['app', 'private', 'user'], +}; diff --git a/packages/fdc3-schema/package.json b/packages/fdc3-schema/package.json new file mode 100644 index 000000000..a13458ff1 --- /dev/null +++ b/packages/fdc3-schema/package.json @@ -0,0 +1,50 @@ +{ + "name": "@finos/fdc3-schema", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "npx rimraf dist && npx rimraf generated", + "mkdirs": "npx mkdirp generated/api && npx mkdirp generated/bridging", + "generate-type-predicates": "ts-node code-generation/generate-type-predicates.ts", + "generate": "npm run mkdirs && npm run typegen-browser && npm run typegen-bridging && npm run generate-type-predicates && npm run lint", + "build": "npm run generate && tsc --module es2022", + "lint": "eslint generated/ --fix && npx prettier generated/ --write", + "test": "npm run generate && tsc", + "typegen-browser": "cd schemas && node ../s2tQuicktypeUtil.js api/api.schema.json api/common.schema.json ../../fdc3-context/schemas/context/context.schema.json api ../generated/api/BrowserTypes.ts", + "typegen-bridging": "cd schemas && node ../s2tQuicktypeUtil.js api/api.schema.json api/common.schema.json api/broadcastRequest.schema.json api/findInstancesRequest.schema.json api/findInstancesResponse.schema.json api/findIntentRequest.schema.json api/findIntentResponse.schema.json api/findIntentsByContextRequest.schema.json api/findIntentsByContextResponse.schema.json api/getAppMetadataRequest.schema.json api/getAppMetadataResponse.schema.json api/openRequest.schema.json api/openResponse.schema.json api/raiseIntentRequest.schema.json api/raiseIntentResponse.schema.json api/raiseIntentResultResponse.schema.json ../../fdc3-context/schemas/context/context.schema.json bridging ../generated/bridging/BridgingTypes.ts" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "message-await": "^1.1.0", + "mkdirp": "^3.0.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "ts-morph": "^24.0.0", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } +} \ No newline at end of file diff --git a/packages/fdc3-schema/s2tQuicktypeUtil.js b/packages/fdc3-schema/s2tQuicktypeUtil.js new file mode 100644 index 000000000..2008c1cc9 --- /dev/null +++ b/packages/fdc3-schema/s2tQuicktypeUtil.js @@ -0,0 +1,78 @@ +/** + * SPDX-License-Identifier: Apache-2.0 + * Copyright FINOS FDC3 contributors - see NOTICE file + */ + +/** Utility for preparing arguments to quicktype, which workaround a specific + * quicktype bug in command line argument handling (where a directory is used + * as input the source language argument is ignored which causes our schemas + * to be interpreted as JSON input, rather than JSONSchema). + * + * Individual file arguments will be interpreted as 'additional' schema files + * that will be referenced from the other schemas and may not have top-level output + * schemas generated, while folders of files w + * + * */ + +const path = require('path'); +const fs = require('fs'); +const { forEachChild } = require('typescript'); +const exec = require('child_process').exec; + +const args = process.argv.slice(2); +const outputFile = args.pop(); +const inputs = args; +const toProcess = []; + +console.log('Inputs schema files: ' + inputs.join(' | ')); +console.log('Output file argument: ' + outputFile); + +let sources = ''; +let additionalSchemaFiles = ''; + +//skip duplicate paths (we might want to specify some files to go first, and might duplicate them) +const allPaths = new Set(); + +const addAPath = (aPath, paths, sources, type) => { + if (!paths.has(aPath)) { + paths.add(aPath); + return sources + ` ${type} ${aPath}`; + } else { + console.log(`skipping duplicate path ${aPath}`); + return sources; + } +}; + +//process the content of folders to produce code for top-level types +let inputIndex = 0; +while (inputIndex < inputs.length) { + if (inputs[inputIndex].endsWith('.schema.json')) { + //add individual files with -S as additional schema files used in references (rather than ones that need a top-level output) + additionalSchemaFiles = addAPath(path.join(inputs[inputIndex]), allPaths, additionalSchemaFiles, '-S'); + } else { + fs.readdirSync(inputs[inputIndex], { withFileTypes: true }).forEach(file => { + if (file.isDirectory()) { + inputs.push(path.join(inputs[inputIndex], file.name)); + } else if (file.name.endsWith('.schema.json')) { + sources = addAPath(path.join(inputs[inputIndex], file.name), allPaths, sources, '--src'); + } + }); + } + inputIndex++; +} + +// Normalise path to local quicktype executable. +//const quicktypeExec = "node " + ["..","quicktype","dist","index.js"].join(path.sep); +const quicktypeExec = ['..', '..', '..', 'node_modules', '.bin', 'quicktype'].join(path.sep); + +const command = `${quicktypeExec} --prefer-const-values --prefer-unions -s schema -o ${outputFile} ${additionalSchemaFiles} ${sources}`; +console.log('command to run: ' + command); + +exec(command, function (error, stdout, stderr) { + if (stdout) { + console.log(stdout); + } + if (stderr) { + console.log(stderr); + } +}); diff --git a/schemas/api/README.md b/packages/fdc3-schema/schemas/api/README.md similarity index 100% rename from schemas/api/README.md rename to packages/fdc3-schema/schemas/api/README.md diff --git a/schemas/api/WCP1Hello.schema.json b/packages/fdc3-schema/schemas/api/WCP1Hello.schema.json similarity index 100% rename from schemas/api/WCP1Hello.schema.json rename to packages/fdc3-schema/schemas/api/WCP1Hello.schema.json diff --git a/schemas/api/WCP2LoadUrl.schema.json b/packages/fdc3-schema/schemas/api/WCP2LoadUrl.schema.json similarity index 100% rename from schemas/api/WCP2LoadUrl.schema.json rename to packages/fdc3-schema/schemas/api/WCP2LoadUrl.schema.json diff --git a/schemas/api/WCP3Handshake.schema.json b/packages/fdc3-schema/schemas/api/WCP3Handshake.schema.json similarity index 78% rename from schemas/api/WCP3Handshake.schema.json rename to packages/fdc3-schema/schemas/api/WCP3Handshake.schema.json index 0cd3b5b5b..fee4edb1a 100644 --- a/schemas/api/WCP3Handshake.schema.json +++ b/packages/fdc3-schema/schemas/api/WCP3Handshake.schema.json @@ -54,6 +54,18 @@ "type": "boolean" } ] + }, + "messageExchangeTimeout": { + "title": "Message Exchange Timeout", + "description": "Indicates a custom timeout (in milliseconds) that should be used for the majority of API message exchanges instead of the default 10,000 millisecond timeout.", + "type": "number", + "minimum": 100 + }, + "appLaunchTimeout": { + "title": "App Launch Timeout", + "description": "Indicates a custom timeout (in milliseconds) that should be used for API message exchanges that may involve launching an application, instead of the default 100,000 millisecond timeout.", + "type": "number", + "minimum": 15000 } }, "additionalProperties": false, diff --git a/schemas/api/WCP4ValidateAppIdentity.schema.json b/packages/fdc3-schema/schemas/api/WCP4ValidateAppIdentity.schema.json similarity index 100% rename from schemas/api/WCP4ValidateAppIdentity.schema.json rename to packages/fdc3-schema/schemas/api/WCP4ValidateAppIdentity.schema.json diff --git a/schemas/api/WCP5ValidateAppIdentityFailedResponse.schema.json b/packages/fdc3-schema/schemas/api/WCP5ValidateAppIdentityFailedResponse.schema.json similarity index 100% rename from schemas/api/WCP5ValidateAppIdentityFailedResponse.schema.json rename to packages/fdc3-schema/schemas/api/WCP5ValidateAppIdentityFailedResponse.schema.json diff --git a/schemas/api/WCP5ValidateAppIdentityResponse.schema.json b/packages/fdc3-schema/schemas/api/WCP5ValidateAppIdentityResponse.schema.json similarity index 100% rename from schemas/api/WCP5ValidateAppIdentityResponse.schema.json rename to packages/fdc3-schema/schemas/api/WCP5ValidateAppIdentityResponse.schema.json diff --git a/schemas/api/WCP6Goodbye.schema.json b/packages/fdc3-schema/schemas/api/WCP6Goodbye.schema.json similarity index 100% rename from schemas/api/WCP6Goodbye.schema.json rename to packages/fdc3-schema/schemas/api/WCP6Goodbye.schema.json diff --git a/schemas/api/WCPConnectionStep.schema.json b/packages/fdc3-schema/schemas/api/WCPConnectionStep.schema.json similarity index 100% rename from schemas/api/WCPConnectionStep.schema.json rename to packages/fdc3-schema/schemas/api/WCPConnectionStep.schema.json diff --git a/schemas/api/addContextListenerRequest.schema.json b/packages/fdc3-schema/schemas/api/addContextListenerRequest.schema.json similarity index 100% rename from schemas/api/addContextListenerRequest.schema.json rename to packages/fdc3-schema/schemas/api/addContextListenerRequest.schema.json diff --git a/schemas/api/addContextListenerResponse.schema.json b/packages/fdc3-schema/schemas/api/addContextListenerResponse.schema.json similarity index 100% rename from schemas/api/addContextListenerResponse.schema.json rename to packages/fdc3-schema/schemas/api/addContextListenerResponse.schema.json diff --git a/schemas/api/addEventListenerRequest.schema.json b/packages/fdc3-schema/schemas/api/addEventListenerRequest.schema.json similarity index 100% rename from schemas/api/addEventListenerRequest.schema.json rename to packages/fdc3-schema/schemas/api/addEventListenerRequest.schema.json diff --git a/schemas/api/addEventListenerResponse.schema.json b/packages/fdc3-schema/schemas/api/addEventListenerResponse.schema.json similarity index 100% rename from schemas/api/addEventListenerResponse.schema.json rename to packages/fdc3-schema/schemas/api/addEventListenerResponse.schema.json diff --git a/schemas/api/addIntentListenerRequest.schema.json b/packages/fdc3-schema/schemas/api/addIntentListenerRequest.schema.json similarity index 100% rename from schemas/api/addIntentListenerRequest.schema.json rename to packages/fdc3-schema/schemas/api/addIntentListenerRequest.schema.json diff --git a/schemas/api/addIntentListenerResponse.schema.json b/packages/fdc3-schema/schemas/api/addIntentListenerResponse.schema.json similarity index 100% rename from schemas/api/addIntentListenerResponse.schema.json rename to packages/fdc3-schema/schemas/api/addIntentListenerResponse.schema.json diff --git a/schemas/api/agentEvent.schema.json b/packages/fdc3-schema/schemas/api/agentEvent.schema.json similarity index 100% rename from schemas/api/agentEvent.schema.json rename to packages/fdc3-schema/schemas/api/agentEvent.schema.json diff --git a/schemas/api/agentResponse.schema.json b/packages/fdc3-schema/schemas/api/agentResponse.schema.json similarity index 100% rename from schemas/api/agentResponse.schema.json rename to packages/fdc3-schema/schemas/api/agentResponse.schema.json diff --git a/schemas/api/api.schema.json b/packages/fdc3-schema/schemas/api/api.schema.json similarity index 94% rename from schemas/api/api.schema.json rename to packages/fdc3-schema/schemas/api/api.schema.json index 7f1fcf0ad..319d28498 100644 --- a/schemas/api/api.schema.json +++ b/packages/fdc3-schema/schemas/api/api.schema.json @@ -308,7 +308,8 @@ "DesktopAgentNotFound", "ErrorOnLaunch", "MalformedContext", - "ResolverUnavailable" + "ResolverUnavailable", + "ApiTimeout" ], "type": "string" }, @@ -324,7 +325,8 @@ "ResolverUnavailable", "TargetAppUnavailable", "TargetInstanceUnavailable", - "UserCancelledResolution" + "UserCancelledResolution", + "ApiTimeout" ], "type": "string" }, @@ -332,7 +334,8 @@ "title": "ResultError", "enum": [ "IntentHandlerRejected", - "NoResultReturned" + "NoResultReturned", + "ApiTimeout" ], "type": "string" }, @@ -342,7 +345,8 @@ "AccessDenied", "CreationFailed", "MalformedContext", - "NoChannelFound" + "NoChannelFound", + "ApiTimeout" ], "type": "string" }, @@ -529,6 +533,33 @@ }, "required":["type","details"], "additionalProperties": false + }, + "PrivateChannelEventType": { + "title": "PrivateChannel Event Type", + "description": "Type defining valid type strings for Private Channel events.", + "type": "string", + "enum": [ + "addContextListener", + "unsubscribe", + "disconnect" + ] + }, + "PrivateChannelEvent": { + "description": "Type defining the format of event objects that may be received via a PrivateChannel's addEventListener function.", + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/PrivateChannelEventType" + }, + "details": { + "title": "Event details", + "description": "Additional details of the event, such as the `currentChannelId` for a CHANNEL_CHANGED event.", + "type": "object", + "additionalProperties": true + } + }, + "required":["type","details"], + "additionalProperties": false } } } \ No newline at end of file diff --git a/schemas/api/appRequest.schema.json b/packages/fdc3-schema/schemas/api/appRequest.schema.json similarity index 100% rename from schemas/api/appRequest.schema.json rename to packages/fdc3-schema/schemas/api/appRequest.schema.json diff --git a/schemas/api/broadcastEvent.schema.json b/packages/fdc3-schema/schemas/api/broadcastEvent.schema.json similarity index 100% rename from schemas/api/broadcastEvent.schema.json rename to packages/fdc3-schema/schemas/api/broadcastEvent.schema.json diff --git a/schemas/api/broadcastRequest.schema.json b/packages/fdc3-schema/schemas/api/broadcastRequest.schema.json similarity index 100% rename from schemas/api/broadcastRequest.schema.json rename to packages/fdc3-schema/schemas/api/broadcastRequest.schema.json diff --git a/schemas/api/broadcastResponse.schema.json b/packages/fdc3-schema/schemas/api/broadcastResponse.schema.json similarity index 100% rename from schemas/api/broadcastResponse.schema.json rename to packages/fdc3-schema/schemas/api/broadcastResponse.schema.json diff --git a/schemas/api/channelChangedEvent.schema.json b/packages/fdc3-schema/schemas/api/channelChangedEvent.schema.json similarity index 100% rename from schemas/api/channelChangedEvent.schema.json rename to packages/fdc3-schema/schemas/api/channelChangedEvent.schema.json diff --git a/schemas/api/common.schema.json b/packages/fdc3-schema/schemas/api/common.schema.json similarity index 87% rename from schemas/api/common.schema.json rename to packages/fdc3-schema/schemas/api/common.schema.json index ad5ec7a6f..6c35a4704 100644 --- a/schemas/api/common.schema.json +++ b/packages/fdc3-schema/schemas/api/common.schema.json @@ -54,16 +54,6 @@ "$ref": "api.schema.json#/definitions/BridgingError" } ] - }, - "PrivateChannelEventListenerTypes": { - "title": "Private Channel Event Listener Types", - "description": "Event listener type names for Private Channel events.", - "type": "string", - "enum": [ - "addContextListener", - "unsubscribe", - "disconnect" - ] } } } \ No newline at end of file diff --git a/schemas/api/contextListenerUnsubscribeRequest.schema.json b/packages/fdc3-schema/schemas/api/contextListenerUnsubscribeRequest.schema.json similarity index 100% rename from schemas/api/contextListenerUnsubscribeRequest.schema.json rename to packages/fdc3-schema/schemas/api/contextListenerUnsubscribeRequest.schema.json diff --git a/schemas/api/contextListenerUnsubscribeResponse.schema.json b/packages/fdc3-schema/schemas/api/contextListenerUnsubscribeResponse.schema.json similarity index 100% rename from schemas/api/contextListenerUnsubscribeResponse.schema.json rename to packages/fdc3-schema/schemas/api/contextListenerUnsubscribeResponse.schema.json diff --git a/schemas/api/createPrivateChannelRequest.schema.json b/packages/fdc3-schema/schemas/api/createPrivateChannelRequest.schema.json similarity index 100% rename from schemas/api/createPrivateChannelRequest.schema.json rename to packages/fdc3-schema/schemas/api/createPrivateChannelRequest.schema.json diff --git a/schemas/api/createPrivateChannelResponse.schema.json b/packages/fdc3-schema/schemas/api/createPrivateChannelResponse.schema.json similarity index 100% rename from schemas/api/createPrivateChannelResponse.schema.json rename to packages/fdc3-schema/schemas/api/createPrivateChannelResponse.schema.json diff --git a/schemas/api/eventListenerUnsubscribeRequest.schema.json b/packages/fdc3-schema/schemas/api/eventListenerUnsubscribeRequest.schema.json similarity index 100% rename from schemas/api/eventListenerUnsubscribeRequest.schema.json rename to packages/fdc3-schema/schemas/api/eventListenerUnsubscribeRequest.schema.json diff --git a/schemas/api/eventListenerUnsubscribeResponse.schema.json b/packages/fdc3-schema/schemas/api/eventListenerUnsubscribeResponse.schema.json similarity index 100% rename from schemas/api/eventListenerUnsubscribeResponse.schema.json rename to packages/fdc3-schema/schemas/api/eventListenerUnsubscribeResponse.schema.json diff --git a/schemas/api/fdc3UserInterfaceChannelSelected.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceChannelSelected.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceChannelSelected.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceChannelSelected.schema.json diff --git a/schemas/api/fdc3UserInterfaceChannels.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceChannels.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceChannels.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceChannels.schema.json diff --git a/schemas/api/fdc3UserInterfaceDrag.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceDrag.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceDrag.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceDrag.schema.json diff --git a/schemas/api/fdc3UserInterfaceHandshake.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceHandshake.schema.json similarity index 89% rename from schemas/api/fdc3UserInterfaceHandshake.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceHandshake.schema.json index 9b4fb181f..29fa74150 100644 --- a/schemas/api/fdc3UserInterfaceHandshake.schema.json +++ b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceHandshake.schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://fdc3.finos.org/schemas/next/api/fdc3UserInterfaceHandshake.schema.json", "title": "Fdc3 UserInterface Handshake", - "description": "Handshake message sent back to a user interface from the DA proxy code (setup by `getAgent()`) over the `MessagePort` provide in the preceding iFrameHello message, confirming that it is listening to the `MessagePort` for further communication.", + "description": "Handshake message sent back to a user interface from the DA proxy code (setup by `getAgent()`) over the `MessagePort` provided in the preceding Fdc3UserInterfaceHello message, confirming that it is listening to the `MessagePort` for further communication.", "type": "object", "allOf": [ { diff --git a/schemas/api/fdc3UserInterfaceHello.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceHello.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceHello.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceHello.schema.json diff --git a/schemas/api/fdc3UserInterfaceMessage.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceMessage.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceMessage.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceMessage.schema.json diff --git a/schemas/api/fdc3UserInterfaceResolve.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceResolve.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceResolve.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceResolve.schema.json diff --git a/schemas/api/fdc3UserInterfaceResolveAction.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceResolveAction.schema.json similarity index 99% rename from schemas/api/fdc3UserInterfaceResolveAction.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceResolveAction.schema.json index e543e959f..781690976 100644 --- a/schemas/api/fdc3UserInterfaceResolveAction.schema.json +++ b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceResolveAction.schema.json @@ -48,7 +48,7 @@ "$ref": "api.schema.json#/definitions/AppIdentifier" }, "action": { - "anyOf": [ + "oneOf": [ { "type": "string", "const": "hover" diff --git a/schemas/api/fdc3UserInterfaceRestyle.schema.json b/packages/fdc3-schema/schemas/api/fdc3UserInterfaceRestyle.schema.json similarity index 100% rename from schemas/api/fdc3UserInterfaceRestyle.schema.json rename to packages/fdc3-schema/schemas/api/fdc3UserInterfaceRestyle.schema.json diff --git a/schemas/api/findInstancesRequest.schema.json b/packages/fdc3-schema/schemas/api/findInstancesRequest.schema.json similarity index 100% rename from schemas/api/findInstancesRequest.schema.json rename to packages/fdc3-schema/schemas/api/findInstancesRequest.schema.json diff --git a/schemas/api/findInstancesResponse.schema.json b/packages/fdc3-schema/schemas/api/findInstancesResponse.schema.json similarity index 100% rename from schemas/api/findInstancesResponse.schema.json rename to packages/fdc3-schema/schemas/api/findInstancesResponse.schema.json diff --git a/schemas/api/findIntentRequest.schema.json b/packages/fdc3-schema/schemas/api/findIntentRequest.schema.json similarity index 100% rename from schemas/api/findIntentRequest.schema.json rename to packages/fdc3-schema/schemas/api/findIntentRequest.schema.json diff --git a/schemas/api/findIntentResponse.schema.json b/packages/fdc3-schema/schemas/api/findIntentResponse.schema.json similarity index 100% rename from schemas/api/findIntentResponse.schema.json rename to packages/fdc3-schema/schemas/api/findIntentResponse.schema.json diff --git a/schemas/api/findIntentsByContextRequest.schema.json b/packages/fdc3-schema/schemas/api/findIntentsByContextRequest.schema.json similarity index 100% rename from schemas/api/findIntentsByContextRequest.schema.json rename to packages/fdc3-schema/schemas/api/findIntentsByContextRequest.schema.json diff --git a/schemas/api/findIntentsByContextResponse.schema.json b/packages/fdc3-schema/schemas/api/findIntentsByContextResponse.schema.json similarity index 97% rename from schemas/api/findIntentsByContextResponse.schema.json rename to packages/fdc3-schema/schemas/api/findIntentsByContextResponse.schema.json index 9ccf5cce1..c74c6bda1 100644 --- a/schemas/api/findIntentsByContextResponse.schema.json +++ b/packages/fdc3-schema/schemas/api/findIntentsByContextResponse.schema.json @@ -42,8 +42,7 @@ "type": "array", "items": { "$ref": "api.schema.json#/definitions/AppIntent" - }, - "additionalProperties": false + } } }, "required": [ diff --git a/schemas/api/getAppMetadataRequest.schema.json b/packages/fdc3-schema/schemas/api/getAppMetadataRequest.schema.json similarity index 100% rename from schemas/api/getAppMetadataRequest.schema.json rename to packages/fdc3-schema/schemas/api/getAppMetadataRequest.schema.json diff --git a/schemas/api/getAppMetadataResponse.schema.json b/packages/fdc3-schema/schemas/api/getAppMetadataResponse.schema.json similarity index 100% rename from schemas/api/getAppMetadataResponse.schema.json rename to packages/fdc3-schema/schemas/api/getAppMetadataResponse.schema.json diff --git a/schemas/api/getCurrentChannelRequest.schema.json b/packages/fdc3-schema/schemas/api/getCurrentChannelRequest.schema.json similarity index 100% rename from schemas/api/getCurrentChannelRequest.schema.json rename to packages/fdc3-schema/schemas/api/getCurrentChannelRequest.schema.json diff --git a/schemas/api/getCurrentChannelResponse.schema.json b/packages/fdc3-schema/schemas/api/getCurrentChannelResponse.schema.json similarity index 100% rename from schemas/api/getCurrentChannelResponse.schema.json rename to packages/fdc3-schema/schemas/api/getCurrentChannelResponse.schema.json diff --git a/schemas/api/getCurrentContextRequest.schema.json b/packages/fdc3-schema/schemas/api/getCurrentContextRequest.schema.json similarity index 100% rename from schemas/api/getCurrentContextRequest.schema.json rename to packages/fdc3-schema/schemas/api/getCurrentContextRequest.schema.json diff --git a/schemas/api/getCurrentContextResponse.schema.json b/packages/fdc3-schema/schemas/api/getCurrentContextResponse.schema.json similarity index 100% rename from schemas/api/getCurrentContextResponse.schema.json rename to packages/fdc3-schema/schemas/api/getCurrentContextResponse.schema.json diff --git a/schemas/api/getInfoRequest.schema.json b/packages/fdc3-schema/schemas/api/getInfoRequest.schema.json similarity index 100% rename from schemas/api/getInfoRequest.schema.json rename to packages/fdc3-schema/schemas/api/getInfoRequest.schema.json diff --git a/schemas/api/getInfoResponse.schema.json b/packages/fdc3-schema/schemas/api/getInfoResponse.schema.json similarity index 96% rename from schemas/api/getInfoResponse.schema.json rename to packages/fdc3-schema/schemas/api/getInfoResponse.schema.json index a10a7749d..8c7ecc4f5 100644 --- a/schemas/api/getInfoResponse.schema.json +++ b/packages/fdc3-schema/schemas/api/getInfoResponse.schema.json @@ -35,7 +35,7 @@ "const": "getInfoResponse" }, "GetInfoSuccessResponsePayload": { - "title": "GetInfo Response Payload", + "title": "GetInfo Success Response Payload", "type": "object", "properties": { "implementationMetadata": { diff --git a/schemas/api/getOrCreateChannelRequest.schema.json b/packages/fdc3-schema/schemas/api/getOrCreateChannelRequest.schema.json similarity index 100% rename from schemas/api/getOrCreateChannelRequest.schema.json rename to packages/fdc3-schema/schemas/api/getOrCreateChannelRequest.schema.json diff --git a/schemas/api/getOrCreateChannelResponse.schema.json b/packages/fdc3-schema/schemas/api/getOrCreateChannelResponse.schema.json similarity index 100% rename from schemas/api/getOrCreateChannelResponse.schema.json rename to packages/fdc3-schema/schemas/api/getOrCreateChannelResponse.schema.json diff --git a/schemas/api/getUserChannelsRequest.schema.json b/packages/fdc3-schema/schemas/api/getUserChannelsRequest.schema.json similarity index 100% rename from schemas/api/getUserChannelsRequest.schema.json rename to packages/fdc3-schema/schemas/api/getUserChannelsRequest.schema.json diff --git a/schemas/api/getUserChannelsResponse.schema.json b/packages/fdc3-schema/schemas/api/getUserChannelsResponse.schema.json similarity index 100% rename from schemas/api/getUserChannelsResponse.schema.json rename to packages/fdc3-schema/schemas/api/getUserChannelsResponse.schema.json diff --git a/schemas/api/heartbeatAcknowledgmentRequest.schema.json b/packages/fdc3-schema/schemas/api/heartbeatAcknowledgmentRequest.schema.json similarity index 100% rename from schemas/api/heartbeatAcknowledgmentRequest.schema.json rename to packages/fdc3-schema/schemas/api/heartbeatAcknowledgmentRequest.schema.json diff --git a/schemas/api/heartbeatEvent.schema.json b/packages/fdc3-schema/schemas/api/heartbeatEvent.schema.json similarity index 100% rename from schemas/api/heartbeatEvent.schema.json rename to packages/fdc3-schema/schemas/api/heartbeatEvent.schema.json diff --git a/schemas/api/intentEvent.schema.json b/packages/fdc3-schema/schemas/api/intentEvent.schema.json similarity index 100% rename from schemas/api/intentEvent.schema.json rename to packages/fdc3-schema/schemas/api/intentEvent.schema.json diff --git a/schemas/api/intentListenerUnsubscribeRequest.schema.json b/packages/fdc3-schema/schemas/api/intentListenerUnsubscribeRequest.schema.json similarity index 100% rename from schemas/api/intentListenerUnsubscribeRequest.schema.json rename to packages/fdc3-schema/schemas/api/intentListenerUnsubscribeRequest.schema.json diff --git a/schemas/api/intentListenerUnsubscribeResponse.schema.json b/packages/fdc3-schema/schemas/api/intentListenerUnsubscribeResponse.schema.json similarity index 100% rename from schemas/api/intentListenerUnsubscribeResponse.schema.json rename to packages/fdc3-schema/schemas/api/intentListenerUnsubscribeResponse.schema.json diff --git a/schemas/api/intentResultRequest.schema.json b/packages/fdc3-schema/schemas/api/intentResultRequest.schema.json similarity index 100% rename from schemas/api/intentResultRequest.schema.json rename to packages/fdc3-schema/schemas/api/intentResultRequest.schema.json diff --git a/schemas/api/intentResultResponse.schema.json b/packages/fdc3-schema/schemas/api/intentResultResponse.schema.json similarity index 100% rename from schemas/api/intentResultResponse.schema.json rename to packages/fdc3-schema/schemas/api/intentResultResponse.schema.json diff --git a/schemas/api/joinUserChannelRequest.schema.json b/packages/fdc3-schema/schemas/api/joinUserChannelRequest.schema.json similarity index 100% rename from schemas/api/joinUserChannelRequest.schema.json rename to packages/fdc3-schema/schemas/api/joinUserChannelRequest.schema.json diff --git a/schemas/api/joinUserChannelResponse.schema.json b/packages/fdc3-schema/schemas/api/joinUserChannelResponse.schema.json similarity index 100% rename from schemas/api/joinUserChannelResponse.schema.json rename to packages/fdc3-schema/schemas/api/joinUserChannelResponse.schema.json diff --git a/schemas/api/leaveCurrentChannelRequest.schema.json b/packages/fdc3-schema/schemas/api/leaveCurrentChannelRequest.schema.json similarity index 100% rename from schemas/api/leaveCurrentChannelRequest.schema.json rename to packages/fdc3-schema/schemas/api/leaveCurrentChannelRequest.schema.json diff --git a/schemas/api/leaveCurrentChannelResponse.schema.json b/packages/fdc3-schema/schemas/api/leaveCurrentChannelResponse.schema.json similarity index 100% rename from schemas/api/leaveCurrentChannelResponse.schema.json rename to packages/fdc3-schema/schemas/api/leaveCurrentChannelResponse.schema.json diff --git a/schemas/api/openRequest.schema.json b/packages/fdc3-schema/schemas/api/openRequest.schema.json similarity index 100% rename from schemas/api/openRequest.schema.json rename to packages/fdc3-schema/schemas/api/openRequest.schema.json diff --git a/schemas/api/openResponse.schema.json b/packages/fdc3-schema/schemas/api/openResponse.schema.json similarity index 100% rename from schemas/api/openResponse.schema.json rename to packages/fdc3-schema/schemas/api/openResponse.schema.json diff --git a/schemas/api/privateChannelAddEventListenerRequest.schema.json b/packages/fdc3-schema/schemas/api/privateChannelAddEventListenerRequest.schema.json similarity index 84% rename from schemas/api/privateChannelAddEventListenerRequest.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelAddEventListenerRequest.schema.json index a57584996..7cc8a3b37 100644 --- a/schemas/api/privateChannelAddEventListenerRequest.schema.json +++ b/packages/fdc3-schema/schemas/api/privateChannelAddEventListenerRequest.schema.json @@ -28,7 +28,7 @@ "const": "privateChannelAddEventListenerRequest" }, "PrivateChannelAddEventListenerRequestPayload": { - "title": "privateChannelAddEventListener Event Payload", + "title": "PrivateChannelAddEventListener Request Payload", "type": "object", "properties": { "privateChannelId": { @@ -38,10 +38,12 @@ }, "listenerType": { "title": "Event listener type", - "description": "The type of PrivateChannel event that the listener should be applied to.", - "oneOf": [ - { "$ref": "common.schema.json#/$defs/PrivateChannelEventListenerTypes" }, - { "type": "null" } + "description": "The type of PrivateChannel event that the listener should be applied to, or null for all event types.", + "oneOf" : [ + { "$ref": "api.schema.json#/definitions/PrivateChannelEventType" }, + { + "type": "null" + } ] } }, diff --git a/schemas/api/privateChannelAddEventListenerResponse.schema.json b/packages/fdc3-schema/schemas/api/privateChannelAddEventListenerResponse.schema.json similarity index 97% rename from schemas/api/privateChannelAddEventListenerResponse.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelAddEventListenerResponse.schema.json index 45564b339..a02fc50bd 100644 --- a/schemas/api/privateChannelAddEventListenerResponse.schema.json +++ b/packages/fdc3-schema/schemas/api/privateChannelAddEventListenerResponse.schema.json @@ -44,7 +44,8 @@ }, "required": [ "listenerUUID" - ] + ], + "additionalProperties": false }, "PrivateChannelAddEventListenerErrorResponsePayload": { "title": "PrivateChannelAddEventListener Error Response Payload", diff --git a/schemas/api/privateChannelDisconnectRequest.schema.json b/packages/fdc3-schema/schemas/api/privateChannelDisconnectRequest.schema.json similarity index 100% rename from schemas/api/privateChannelDisconnectRequest.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelDisconnectRequest.schema.json diff --git a/schemas/api/privateChannelDisconnectResponse.schema.json b/packages/fdc3-schema/schemas/api/privateChannelDisconnectResponse.schema.json similarity index 100% rename from schemas/api/privateChannelDisconnectResponse.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelDisconnectResponse.schema.json diff --git a/schemas/api/privateChannelOnAddContextListenerEvent.schema.json b/packages/fdc3-schema/schemas/api/privateChannelOnAddContextListenerEvent.schema.json similarity index 100% rename from schemas/api/privateChannelOnAddContextListenerEvent.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelOnAddContextListenerEvent.schema.json diff --git a/schemas/api/privateChannelOnDisconnectEvent.schema.json b/packages/fdc3-schema/schemas/api/privateChannelOnDisconnectEvent.schema.json similarity index 100% rename from schemas/api/privateChannelOnDisconnectEvent.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelOnDisconnectEvent.schema.json diff --git a/schemas/api/privateChannelOnUnsubscribeEvent.schema.json b/packages/fdc3-schema/schemas/api/privateChannelOnUnsubscribeEvent.schema.json similarity index 100% rename from schemas/api/privateChannelOnUnsubscribeEvent.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelOnUnsubscribeEvent.schema.json diff --git a/schemas/api/privateChannelUnsubscribeEventListenerRequest.schema.json b/packages/fdc3-schema/schemas/api/privateChannelUnsubscribeEventListenerRequest.schema.json similarity index 100% rename from schemas/api/privateChannelUnsubscribeEventListenerRequest.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelUnsubscribeEventListenerRequest.schema.json diff --git a/schemas/api/privateChannelUnsubscribeEventListenerResponse.schema.json b/packages/fdc3-schema/schemas/api/privateChannelUnsubscribeEventListenerResponse.schema.json similarity index 100% rename from schemas/api/privateChannelUnsubscribeEventListenerResponse.schema.json rename to packages/fdc3-schema/schemas/api/privateChannelUnsubscribeEventListenerResponse.schema.json diff --git a/schemas/api/raiseIntentForContextRequest.schema.json b/packages/fdc3-schema/schemas/api/raiseIntentForContextRequest.schema.json similarity index 100% rename from schemas/api/raiseIntentForContextRequest.schema.json rename to packages/fdc3-schema/schemas/api/raiseIntentForContextRequest.schema.json diff --git a/schemas/api/raiseIntentForContextResponse.schema.json b/packages/fdc3-schema/schemas/api/raiseIntentForContextResponse.schema.json similarity index 97% rename from schemas/api/raiseIntentForContextResponse.schema.json rename to packages/fdc3-schema/schemas/api/raiseIntentForContextResponse.schema.json index fe38ec750..6cd74099d 100644 --- a/schemas/api/raiseIntentForContextResponse.schema.json +++ b/packages/fdc3-schema/schemas/api/raiseIntentForContextResponse.schema.json @@ -50,8 +50,7 @@ "type": "array", "items": { "$ref": "api.schema.json#/definitions/AppIntent" - }, - "additionalProperties": false + } } }, "required": [ diff --git a/schemas/api/raiseIntentRequest.schema.json b/packages/fdc3-schema/schemas/api/raiseIntentRequest.schema.json similarity index 100% rename from schemas/api/raiseIntentRequest.schema.json rename to packages/fdc3-schema/schemas/api/raiseIntentRequest.schema.json diff --git a/schemas/api/raiseIntentResponse.schema.json b/packages/fdc3-schema/schemas/api/raiseIntentResponse.schema.json similarity index 100% rename from schemas/api/raiseIntentResponse.schema.json rename to packages/fdc3-schema/schemas/api/raiseIntentResponse.schema.json diff --git a/schemas/api/raiseIntentResultResponse.schema.json b/packages/fdc3-schema/schemas/api/raiseIntentResultResponse.schema.json similarity index 100% rename from schemas/api/raiseIntentResultResponse.schema.json rename to packages/fdc3-schema/schemas/api/raiseIntentResultResponse.schema.json diff --git a/website/static/schemas/next/api/t2sQuicktypeUtil.js b/packages/fdc3-schema/schemas/api/t2sQuicktypeUtil.js similarity index 97% rename from website/static/schemas/next/api/t2sQuicktypeUtil.js rename to packages/fdc3-schema/schemas/api/t2sQuicktypeUtil.js index 54816c0e0..a00d531a6 100644 --- a/website/static/schemas/next/api/t2sQuicktypeUtil.js +++ b/packages/fdc3-schema/schemas/api/t2sQuicktypeUtil.js @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright FINOS FDC3 contributors - see NOTICE file */ - + /** Utility for preparing arguments to quicktype, which workaround a specific * quicktype bug in command line argument handling (where a directory is used * as input the source language argument is ignored which causes our schemas @@ -59,7 +59,7 @@ const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); const command = `${quicktypeExec} -l schema -o ${outputPath} ${sources}`; console.log('command to run: ' + command); -exec(command, function(error, stdout, stderr) { +exec(command, function (error, stdout, stderr) { if (stdout) { console.log(stdout); } diff --git a/schemas/bridging/agentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/agentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/agentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/agentErrorResponse.schema.json diff --git a/schemas/bridging/agentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/agentRequest.schema.json similarity index 100% rename from schemas/bridging/agentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/agentRequest.schema.json diff --git a/schemas/bridging/agentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/agentResponse.schema.json similarity index 100% rename from schemas/bridging/agentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/agentResponse.schema.json diff --git a/schemas/bridging/bridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/bridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/bridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/bridgeErrorResponse.schema.json diff --git a/schemas/bridging/bridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/bridgeRequest.schema.json similarity index 100% rename from schemas/bridging/bridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/bridgeRequest.schema.json diff --git a/schemas/bridging/bridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/bridgeResponse.schema.json similarity index 100% rename from schemas/bridging/bridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/bridgeResponse.schema.json diff --git a/schemas/bridging/broadcastAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/broadcastAgentRequest.schema.json similarity index 100% rename from schemas/bridging/broadcastAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/broadcastAgentRequest.schema.json diff --git a/schemas/bridging/broadcastBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/broadcastBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/broadcastBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/broadcastBridgeRequest.schema.json diff --git a/schemas/bridging/common.schema.json b/packages/fdc3-schema/schemas/bridging/common.schema.json similarity index 100% rename from schemas/bridging/common.schema.json rename to packages/fdc3-schema/schemas/bridging/common.schema.json diff --git a/schemas/bridging/connectionStep.schema.json b/packages/fdc3-schema/schemas/bridging/connectionStep.schema.json similarity index 100% rename from schemas/bridging/connectionStep.schema.json rename to packages/fdc3-schema/schemas/bridging/connectionStep.schema.json diff --git a/schemas/bridging/connectionStep2Hello.schema.json b/packages/fdc3-schema/schemas/bridging/connectionStep2Hello.schema.json similarity index 100% rename from schemas/bridging/connectionStep2Hello.schema.json rename to packages/fdc3-schema/schemas/bridging/connectionStep2Hello.schema.json diff --git a/schemas/bridging/connectionStep3Handshake.schema.json b/packages/fdc3-schema/schemas/bridging/connectionStep3Handshake.schema.json similarity index 100% rename from schemas/bridging/connectionStep3Handshake.schema.json rename to packages/fdc3-schema/schemas/bridging/connectionStep3Handshake.schema.json diff --git a/schemas/bridging/connectionStep4AuthenticationFailed.schema.json b/packages/fdc3-schema/schemas/bridging/connectionStep4AuthenticationFailed.schema.json similarity index 100% rename from schemas/bridging/connectionStep4AuthenticationFailed.schema.json rename to packages/fdc3-schema/schemas/bridging/connectionStep4AuthenticationFailed.schema.json diff --git a/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/packages/fdc3-schema/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json similarity index 100% rename from schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json rename to packages/fdc3-schema/schemas/bridging/connectionStep6ConnectedAgentsUpdate.schema.json diff --git a/schemas/bridging/findInstancesAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findInstancesAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesAgentErrorResponse.schema.json diff --git a/schemas/bridging/findInstancesAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesAgentRequest.schema.json similarity index 100% rename from schemas/bridging/findInstancesAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesAgentRequest.schema.json diff --git a/schemas/bridging/findInstancesAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesAgentResponse.schema.json similarity index 100% rename from schemas/bridging/findInstancesAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesAgentResponse.schema.json diff --git a/schemas/bridging/findInstancesBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findInstancesBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesBridgeErrorResponse.schema.json diff --git a/schemas/bridging/findInstancesBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/findInstancesBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesBridgeRequest.schema.json diff --git a/schemas/bridging/findInstancesBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findInstancesBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/findInstancesBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findInstancesBridgeResponse.schema.json diff --git a/schemas/bridging/findIntentAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentAgentErrorResponse.schema.json diff --git a/schemas/bridging/findIntentAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentAgentRequest.schema.json similarity index 100% rename from schemas/bridging/findIntentAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentAgentRequest.schema.json diff --git a/schemas/bridging/findIntentAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentAgentResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentAgentResponse.schema.json diff --git a/schemas/bridging/findIntentBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentBridgeErrorResponse.schema.json diff --git a/schemas/bridging/findIntentBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/findIntentBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentBridgeRequest.schema.json diff --git a/schemas/bridging/findIntentBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentBridgeResponse.schema.json diff --git a/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentErrorResponse.schema.json diff --git a/schemas/bridging/findIntentsByContextAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentRequest.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentRequest.schema.json diff --git a/schemas/bridging/findIntentsByContextAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextAgentResponse.schema.json diff --git a/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeErrorResponse.schema.json diff --git a/schemas/bridging/findIntentsByContextBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeRequest.schema.json diff --git a/schemas/bridging/findIntentsByContextBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/findIntentsByContextBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/findIntentsByContextBridgeResponse.schema.json diff --git a/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataAgentErrorResponse.schema.json diff --git a/schemas/bridging/getAppMetadataAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataAgentRequest.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataAgentRequest.schema.json diff --git a/schemas/bridging/getAppMetadataAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataAgentResponse.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataAgentResponse.schema.json diff --git a/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeErrorResponse.schema.json diff --git a/schemas/bridging/getAppMetadataBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeRequest.schema.json diff --git a/schemas/bridging/getAppMetadataBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/getAppMetadataBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/getAppMetadataBridgeResponse.schema.json diff --git a/schemas/bridging/openAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/openAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/openAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/openAgentErrorResponse.schema.json diff --git a/schemas/bridging/openAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/openAgentRequest.schema.json similarity index 100% rename from schemas/bridging/openAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/openAgentRequest.schema.json diff --git a/schemas/bridging/openAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/openAgentResponse.schema.json similarity index 100% rename from schemas/bridging/openAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/openAgentResponse.schema.json diff --git a/schemas/bridging/openBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/openBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/openBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/openBridgeErrorResponse.schema.json diff --git a/schemas/bridging/openBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/openBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/openBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/openBridgeRequest.schema.json diff --git a/schemas/bridging/openBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/openBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/openBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/openBridgeResponse.schema.json diff --git a/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelBroadcastAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelBroadcastAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelBroadcastBridgeRequest.schema.json diff --git a/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelEventListenerAddedAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json diff --git a/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json diff --git a/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json diff --git a/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnDisconnectAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnDisconnectBridgeRequest.schema.json diff --git a/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json diff --git a/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json diff --git a/schemas/bridging/raiseIntentAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentAgentErrorResponse.schema.json diff --git a/schemas/bridging/raiseIntentAgentRequest.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentAgentRequest.schema.json similarity index 100% rename from schemas/bridging/raiseIntentAgentRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentAgentRequest.schema.json diff --git a/schemas/bridging/raiseIntentAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentAgentResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentAgentResponse.schema.json diff --git a/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentBridgeErrorResponse.schema.json diff --git a/schemas/bridging/raiseIntentBridgeRequest.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentBridgeRequest.schema.json similarity index 100% rename from schemas/bridging/raiseIntentBridgeRequest.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentBridgeRequest.schema.json diff --git a/schemas/bridging/raiseIntentBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentBridgeResponse.schema.json diff --git a/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentResultAgentErrorResponse.schema.json diff --git a/schemas/bridging/raiseIntentResultAgentResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentResultAgentResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentResultAgentResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentResultAgentResponse.schema.json diff --git a/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentResultBridgeErrorResponse.schema.json diff --git a/schemas/bridging/raiseIntentResultBridgeResponse.schema.json b/packages/fdc3-schema/schemas/bridging/raiseIntentResultBridgeResponse.schema.json similarity index 100% rename from schemas/bridging/raiseIntentResultBridgeResponse.schema.json rename to packages/fdc3-schema/schemas/bridging/raiseIntentResultBridgeResponse.schema.json diff --git a/schemas/bridgingAsyncAPI/README.md b/packages/fdc3-schema/schemas/bridgingAsyncAPI/README.md similarity index 100% rename from schemas/bridgingAsyncAPI/README.md rename to packages/fdc3-schema/schemas/bridgingAsyncAPI/README.md diff --git a/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json b/packages/fdc3-schema/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json similarity index 100% rename from schemas/bridgingAsyncAPI/bridgingAsyncAPI.json rename to packages/fdc3-schema/schemas/bridgingAsyncAPI/bridgingAsyncAPI.json diff --git a/packages/fdc3-schema/src/index.ts b/packages/fdc3-schema/src/index.ts new file mode 100644 index 000000000..7d7982455 --- /dev/null +++ b/packages/fdc3-schema/src/index.ts @@ -0,0 +1,4 @@ +import * as BrowserTypes from '../generated/api/BrowserTypes'; +import * as BridgingTypes from '../generated/bridging/BridgingTypes'; + +export { BrowserTypes, BridgingTypes }; diff --git a/packages/fdc3-schema/tsconfig.json b/packages/fdc3-schema/tsconfig.json new file mode 100644 index 000000000..5273a6e11 --- /dev/null +++ b/packages/fdc3-schema/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src", + "generated" + ], + "outDir": "dist", + }, + "include": [ + "src/**/*.ts", + "generated/**/*.ts", + "schemas/**/*.json" + ], + "exclude": [ + "dist/**" + ], + "references": [] +} \ No newline at end of file diff --git a/.eslintrc.json b/packages/fdc3-standard/.eslintrc.json similarity index 78% rename from .eslintrc.json rename to packages/fdc3-standard/.eslintrc.json index caef81ccb..ba0d790d7 100644 --- a/.eslintrc.json +++ b/packages/fdc3-standard/.eslintrc.json @@ -20,6 +20,9 @@ "prettier" ], "rules": { + "@typescript-eslint/adjacent-overload-signatures": "warn", + "@typescript-eslint/no-empty-interface": "warn", + "@typescript-eslint/no-empty-function": "warn", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unused-vars": [ "error", diff --git a/packages/fdc3-standard/eslint.config.mjs b/packages/fdc3-standard/eslint.config.mjs new file mode 100644 index 000000000..fecd6dfad --- /dev/null +++ b/packages/fdc3-standard/eslint.config.mjs @@ -0,0 +1,61 @@ +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import jsxA11Y from 'eslint-plugin-jsx-a11y'; +import globals from 'globals'; +import tsParser from '@typescript-eslint/parser'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import js from '@eslint/js'; +import { FlatCompat } from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + ...compat.extends( + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier' + ), + { + files: ['**/*.ts', '**/*.tsx'], + + plugins: { + '@typescript-eslint': typescriptEslint, + 'jsx-a11y': jsxA11Y, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.jest, + }, + + parser: tsParser, + ecmaVersion: 5, + sourceType: 'script', + + parserOptions: { + project: ['./tsconfig.json'], + }, + }, + + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'warn', + '@typescript-eslint/no-empty-interface': 'warn', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-explicit-any': 'off', + + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + }, + ], + }, + }, +]; diff --git a/packages/fdc3-standard/jest.config.js b/packages/fdc3-standard/jest.config.js new file mode 100644 index 000000000..f644b42fb --- /dev/null +++ b/packages/fdc3-standard/jest.config.js @@ -0,0 +1,13 @@ +/** @type {import('jest').Config} */ +module.exports = { + moduleFileExtensions: ['js', 'ts'], + globals: {}, + transform: { + '^.+\\.ts?$': ['ts-jest', { isolatedModules: true }], + }, + testRegex: '.+\\.test\\.ts?$', + testEnvironment: 'jsdom', + reporters: ['default', 'jest-junit'], + collectCoverage: true, + coverageReporters: ['lcov', 'text', 'json'], +}; diff --git a/packages/fdc3-standard/package.json b/packages/fdc3-standard/package.json new file mode 100644 index 000000000..8441aa2af --- /dev/null +++ b/packages/fdc3-standard/package.json @@ -0,0 +1,62 @@ +{ + "name": "@finos/fdc3-standard", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "rimraf dist", + "build": "tsc --module es2022", + "test": "tsc && jest", + "lint": "eslint src/ --fix" + }, + "prettier": { + "semi": true, + "singleQuote": true, + "arrowParens": "avoid", + "trailingComma": "es5", + "endOfLine": "auto", + "printWidth": 120 + }, + "jest-junit": { + "outputName": "test-results.xml" + }, + "dependencies": { + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.16.0", + "@types/jest": "29.5.13", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-jsx-a11y": "^6.10.0", + "globals": "^15.13.0", + "jest": "29.7.0", + "jest-environment-jsdom": "29.7.0", + "jest-junit": "^16.0.0", + "jest-mock-extended": "3.0.5", + "prettier": "3.4.1", + "quicktype": "23.0.78", + "rimraf": "^6.0.1", + "ts-jest": "29.2.5", + "tslib": "^2.7.0", + "typescript": "^5.6.3" + } +} \ No newline at end of file diff --git a/src/api/AppIdentifier.ts b/packages/fdc3-standard/src/api/AppIdentifier.ts similarity index 100% rename from src/api/AppIdentifier.ts rename to packages/fdc3-standard/src/api/AppIdentifier.ts diff --git a/src/api/AppIntent.ts b/packages/fdc3-standard/src/api/AppIntent.ts similarity index 100% rename from src/api/AppIntent.ts rename to packages/fdc3-standard/src/api/AppIntent.ts diff --git a/src/api/AppMetadata.ts b/packages/fdc3-standard/src/api/AppMetadata.ts similarity index 100% rename from src/api/AppMetadata.ts rename to packages/fdc3-standard/src/api/AppMetadata.ts diff --git a/src/api/Channel.ts b/packages/fdc3-standard/src/api/Channel.ts similarity index 98% rename from src/api/Channel.ts rename to packages/fdc3-standard/src/api/Channel.ts index 9eca774b5..9e3032712 100644 --- a/src/api/Channel.ts +++ b/packages/fdc3-standard/src/api/Channel.ts @@ -3,7 +3,7 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ -import { Context } from '../context/ContextTypes'; +import { Context } from '@finos/fdc3-context'; import { ContextHandler } from './Types'; import { DisplayMetadata } from './DisplayMetadata'; import { Listener } from './Listener'; diff --git a/src/api/ContextMetadata.ts b/packages/fdc3-standard/src/api/ContextMetadata.ts similarity index 100% rename from src/api/ContextMetadata.ts rename to packages/fdc3-standard/src/api/ContextMetadata.ts diff --git a/src/api/DesktopAgent.ts b/packages/fdc3-standard/src/api/DesktopAgent.ts similarity index 98% rename from src/api/DesktopAgent.ts rename to packages/fdc3-standard/src/api/DesktopAgent.ts index 3691ae3f6..d97f99e62 100644 --- a/src/api/DesktopAgent.ts +++ b/packages/fdc3-standard/src/api/DesktopAgent.ts @@ -8,7 +8,7 @@ import { Channel } from './Channel'; import { ContextHandler, IntentHandler } from './Types'; import { IntentResolution } from './IntentResolution'; import { Listener } from './Listener'; -import { Context } from '../context/ContextTypes'; +import { Context } from '@finos/fdc3-context'; import { ImplementationMetadata } from './ImplementationMetadata'; import { PrivateChannel } from './PrivateChannel'; import { AppIdentifier } from './AppIdentifier'; @@ -376,26 +376,26 @@ export interface DesktopAgent { */ addContextListener(contextType: ContextType | null, handler: ContextHandler): Promise; - /** - * Register a handler for events from the Desktop Agent. Whenever the handler function + /** + * Register a handler for events from the Desktop Agent. Whenever the handler function * is called it will be passed an event object with details related to the event. - * + * * ```js * // any event type * const listener = await fdc3.addEventListener(null, event => { ... }); - * + * * // listener for a specific event type that logs its details - * const userChannelChangedListener = await fdc3.addEventListener("userChannelChanged", event => { + * const userChannelChangedListener = await fdc3.addEventListener("userChannelChanged", event => { * console.log(`Received event ${event.type}\n\tDetails: ${event.details}`); * //do something else with the event * }); * ``` - * - * @param {FDC3EventType|null} type If non-null, only events of the specified type will be received by the handler. - * @param {EventHandler} handler A function that events received will be passed to. - * - */ - addEventListener(type: FDC3EventTypes | null, handler: EventHandler): Promise; + * + * @param {FDC3EventType|null} type If non-null, only events of the specified type will be received by the handler. + * @param {EventHandler} handler A function that events received will be passed to. + * + */ + addEventListener(type: FDC3EventTypes | null, handler: EventHandler): Promise; /** * Retrieves a list of the User channels available for the app to join. @@ -555,6 +555,7 @@ export interface DesktopAgent { * Adds a listener for incoming context broadcasts from the Desktop Agent. * @deprecated use `addContextListener(null, handler)` instead of `addContextListener(handler)`. Provided for backwards compatibility with versions FDC3 standard <2.0. */ + // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures addContextListener(handler: ContextHandler): Promise; /** @@ -575,6 +576,7 @@ export interface DesktopAgent { * let instanceMetadata = await fdc3.open('myApp'); * ``` */ + // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures open(name: string, context?: Context): Promise; /** @@ -585,6 +587,7 @@ export interface DesktopAgent { * await fdc3.raiseIntent("StartChat", context, appIntent.apps[0].name); * ``` */ + // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures raiseIntent(intent: Intent, context: Context, name: string): Promise; /** @@ -595,5 +598,6 @@ export interface DesktopAgent { * await fdc3.raiseIntentForContext(context, targetAppName); * ``` */ + // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures raiseIntentForContext(context: Context, name: string): Promise; } diff --git a/src/api/DesktopAgentIdentifier.ts b/packages/fdc3-standard/src/api/DesktopAgentIdentifier.ts similarity index 100% rename from src/api/DesktopAgentIdentifier.ts rename to packages/fdc3-standard/src/api/DesktopAgentIdentifier.ts diff --git a/src/api/DisplayMetadata.ts b/packages/fdc3-standard/src/api/DisplayMetadata.ts similarity index 100% rename from src/api/DisplayMetadata.ts rename to packages/fdc3-standard/src/api/DisplayMetadata.ts diff --git a/src/api/Errors.ts b/packages/fdc3-standard/src/api/Errors.ts similarity index 67% rename from src/api/Errors.ts rename to packages/fdc3-standard/src/api/Errors.ts index 858f36118..2dd3545ca 100644 --- a/src/api/Errors.ts +++ b/packages/fdc3-standard/src/api/Errors.ts @@ -3,112 +3,129 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ -/** - * Contains constants representing the errors that can be encountered when trying to connect to a web-based Desktop Agent with the getAgent function. - */ -export enum AgentError { - /** Returned if no Desktop Agent was found by any means available or - * if the Agent previously connected to is not contactable on a +/** + * Contains constants representing the errors that can be encountered when trying to connect to a web-based Desktop Agent with the getAgent function. + */ +export enum AgentError { + /** Returned if no Desktop Agent was found by any means available or + * if the Agent previously connected to is not contactable on a * subsequent connection attempt.*/ - AgentNotFound = "AgentNotFound", + AgentNotFound = 'AgentNotFound', - /** Returned if validation of the app identity by the Desktop Agent - * Failed or the app is not being allowed to connect to the Desktop Agent - * for another reason. */ - AccessDenied = "AccessDenied", + /** Returned if validation of the app identity by the Desktop Agent + * Failed or the app is not being allowed to connect to the Desktop Agent + * for another reason. */ + AccessDenied = 'AccessDenied', - /** Returned if an error or exception occurs while trying to set - * up communication with a Desktop Agent. */ - ErrorOnConnect = "ErrorOnConnect", + /** Returned if an error or exception occurs while trying to set + * up communication with a Desktop Agent. */ + ErrorOnConnect = 'ErrorOnConnect', /** Returned if the failover function is not a function, or it did not - * resolve to one of the allowed types. */ - InvalidFailover = "InvalidFailover", -}; + * resolve to one of the allowed types. */ + InvalidFailover = 'InvalidFailover', + + /** Returned if an API call rejects after a timeout. Used where an API call + * is not aligned to another error enumeration. + */ + ApiTimeout = 'ApiTimeout', +} /** Constants representing the errors that can be encountered when calling the `open` method on the DesktopAgent object (`fdc3`). */ export enum OpenError { /** Returned if the specified application is not found.*/ - AppNotFound = "AppNotFound", + AppNotFound = 'AppNotFound', /** Returned if the specified application fails to launch correctly.*/ - ErrorOnLaunch = "ErrorOnLaunch", + ErrorOnLaunch = 'ErrorOnLaunch', /** Returned if the specified application launches but fails to add a context listener in order to receive the context passed to the `fdc3.open` call.*/ - AppTimeout = "AppTimeout", + AppTimeout = 'AppTimeout', /** Returned if the FDC3 desktop agent implementation is not currently able to handle the request.*/ - ResolverUnavailable = "ResolverUnavailable", + ResolverUnavailable = 'ResolverUnavailable', /** Returned if a call to the `open` function is made with an invalid context argument. Contexts should be Objects with at least a `type` field that has a `string` value.*/ - MalformedContext = "MalformedContext", + MalformedContext = 'MalformedContext', /** @experimental Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ - DesktopAgentNotFound = "DesktopAgentNotFound", + DesktopAgentNotFound = 'DesktopAgentNotFound', + + /** Returned if a timeout occurs before a call to open is resolved for any reason other than the not adding its context listener in time.*/ + ApiTimeout = 'ApiTimeout', } /** Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`). */ export enum ResolveError { /** SHOULD be returned if no apps are available that can resolve the intent and context combination.*/ - NoAppsFound = "NoAppsFound", + NoAppsFound = 'NoAppsFound', /** Returned if the FDC3 desktop agent implementation is not currently able to handle the request.*/ - ResolverUnavailable = "ResolverUnavailable", + ResolverUnavailable = 'ResolverUnavailable', /** Returned if the user cancelled the resolution request, for example by closing or cancelling a resolver UI.*/ - UserCancelled = "UserCancelledResolution", + UserCancelled = 'UserCancelledResolution', /** SHOULD be returned if a timeout cancels an intent resolution that required user interaction. Please use `ResolverUnavailable` instead for situations where a resolver UI or similar fails.*/ - ResolverTimeout = "ResolverTimeout", + ResolverTimeout = 'ResolverTimeout', /** Returned if a specified target application is not available or a new instance of it cannot be opened. */ - TargetAppUnavailable = "TargetAppUnavailable", + TargetAppUnavailable = 'TargetAppUnavailable', /** Returned if a specified target application instance is not available, for example because it has been closed. */ - TargetInstanceUnavailable = "TargetInstanceUnavailable", + TargetInstanceUnavailable = 'TargetInstanceUnavailable', /** Returned if the intent and context could not be delivered to the selected application or instance, for example because it has not added an intent handler within a timeout.*/ - IntentDeliveryFailed = "IntentDeliveryFailed", + IntentDeliveryFailed = 'IntentDeliveryFailed', /** Returned if a call to one of the `raiseIntent` functions is made with an invalid context argument. Contexts should be Objects with at least a `type` field that has a `string` value.*/ - MalformedContext = "MalformedContext", + MalformedContext = 'MalformedContext', /** @experimental Returned if the specified Desktop Agent is not found, via a connected Desktop Agent Bridge.*/ - DesktopAgentNotFound = "DesktopAgentNotFound", + DesktopAgentNotFound = 'DesktopAgentNotFound', + + /** Returned if a timeout occurs before the API call is resolved for any reason other than the resolver timing out (use ResolverTimeout) or an app launched by a raiseIntent function doesn't add its intent listener in time (use IntentDeliveryFailed).*/ + ApiTimeout = 'ApiTimeout', } export enum ResultError { /** Returned if the intent handler exited without returning a valid result (a promise resolving to a Context, Channel object or void). */ - NoResultReturned = "NoResultReturned", + NoResultReturned = 'NoResultReturned', /** Returned if the Intent handler function processing the raised intent throws an error or rejects the Promise it returned. */ - IntentHandlerRejected = "IntentHandlerRejected", + IntentHandlerRejected = 'IntentHandlerRejected', + + /** Returned if a timeout occurs before the getResult() API call is resolved.*/ + ApiTimeout = 'ApiTimeout', } export enum ChannelError { /** Returned if the specified channel is not found when attempting to join a channel via the `joinUserChannel` function of the DesktopAgent (`fdc3`).*/ - NoChannelFound = "NoChannelFound", + NoChannelFound = 'NoChannelFound', /** SHOULD be returned when a request to join a user channel or to a retrieve a Channel object via the `joinUserChannel` or `getOrCreateChannel` methods of the DesktopAgent (`fdc3`) object is denied. */ - AccessDenied = "AccessDenied", + AccessDenied = 'AccessDenied', /** SHOULD be returned when a channel cannot be created or retrieved via the `getOrCreateChannel` method of the DesktopAgent (`fdc3`).*/ - CreationFailed = "CreationFailed", + CreationFailed = 'CreationFailed', /** Returned if a call to the `broadcast` functions is made with an invalid context argument. Contexts should be Objects with at least a `type` field that has a `string` value.*/ - MalformedContext = "MalformedContext", + MalformedContext = 'MalformedContext', + + /** Returned if a timeout occurs before any Channel related API call is resolved.*/ + ApiTimeout = 'ApiTimeout', } export enum BridgingError { /** @experimental Returned if a Desktop Agent did not return a response, via Desktop Agent Bridging, within the alloted timeout. */ - ResponseTimedOut = "ResponseToBridgeTimedOut", + ResponseTimedOut = 'ResponseToBridgeTimedOut', /** @experimental Returned if a Desktop Agent that has been targeted by a particular request has been disconnected from the Bridge before a response has been received from it. */ - AgentDisconnected = "AgentDisconnected", + AgentDisconnected = 'AgentDisconnected', /** @experimental Returned for FDC3 API calls that are specified with arguments indicating that a remote Desktop agent should be targeted (e.g. raiseIntent with an app on a remote DesktopAgent targeted), when the local Desktop Agent is not connected to a bridge. */ - NotConnectedToBridge = "NotConnectedToBridge", - + NotConnectedToBridge = 'NotConnectedToBridge', + /** @experimental Returned if a message to a Bridge deviates from the schema for that message sufficiently that it could not be processed. */ - MalformedMessage = "MalformedMessage", + MalformedMessage = 'MalformedMessage', } diff --git a/src/api/Events.ts b/packages/fdc3-standard/src/api/Events.ts similarity index 79% rename from src/api/Events.ts rename to packages/fdc3-standard/src/api/Events.ts index 60dc93d95..c0c3b5c51 100644 --- a/src/api/Events.ts +++ b/packages/fdc3-standard/src/api/Events.ts @@ -6,7 +6,7 @@ /** * Type defining a basic event object that may be emitted by an FDC3 API interface * such as DesktopAgent or PrivateChannel. There are more specific event types - * defined for each interface. + * defined for each interface. */ export interface ApiEvent { readonly type: string; @@ -14,19 +14,18 @@ export interface ApiEvent { } /** Type representing a handler function for events from the Desktop Agent - * or a PrivateChannel. + * or a PrivateChannel. * @param event The handler function will be passed an `ApiEvent` (or more specifically - * an `FDC3Event` or `PrivateChannelEvent`) Object providing details of the event (such + * an `FDC3Event` or `PrivateChannelEvent`) Object providing details of the event (such * as a change of channel membership for the app, or type of context listener added) * as the only parameter. */ -export type EventHandler = (event: ApiEvent ) => void; +export type EventHandler = (event: ApiEvent) => void; /** * Type defining valid type strings for DesktopAgent interface events. */ -export type FDC3EventTypes = "userChannelChanged"; - +export type FDC3EventTypes = 'userChannelChanged'; /** * Type defining the format of event objects that may be received @@ -41,64 +40,64 @@ export interface FDC3Event extends ApiEvent { * Type defining the format of event `userChannelChanged` objects */ export interface FDC3ChannelChangedEvent extends FDC3Event { - readonly type: "userChannelChanged"; + readonly type: 'userChannelChanged'; readonly details: { - currentChannelId: string | null + currentChannelId: string | null; }; } /** * Type defining valid type strings for Private Channel events. */ -export type PrivateChannelEventTypes = "addContextListener" | "unsubscribe" | "disconnect"; +export type PrivateChannelEventTypes = 'addContextListener' | 'unsubscribe' | 'disconnect'; /** * Type defining the format of event objects that may be received * via a PrivateChannel's `addEventListener` function. */ -export interface PrivateChannelEvent extends ApiEvent{ +export interface PrivateChannelEvent extends ApiEvent { readonly type: PrivateChannelEventTypes; readonly details: any; } /** - * Type defining the format of events representing a context listener being - * added to the channel (`addContextListener`). Desktop Agents MUST fire this - * event for each invocation of `addContextListener` on the channel, including + * Type defining the format of events representing a context listener being + * added to the channel (`addContextListener`). Desktop Agents MUST fire this + * event for each invocation of `addContextListener` on the channel, including * those that occurred before this handler was registered (to prevent race * conditions). - * The context type of the listener added is provided as `details.contextType`, + * The context type of the listener added is provided as `details.contextType`, * which will be `null` if all event types are being listened to. */ export interface PrivateChannelAddContextListenerEvent extends PrivateChannelEvent { - readonly type: "addContextListener"; + readonly type: 'addContextListener'; readonly details: { - contextType: string | null + contextType: string | null; }; } /** - * Type defining the format of events representing a context listener - * removed from the channel (`Listener.unsubscribe()`). Desktop Agents MUST call - * this when `disconnect()` is called by the other party, for each listener that + * Type defining the format of events representing a context listener + * removed from the channel (`Listener.unsubscribe()`). Desktop Agents MUST call + * this when `disconnect()` is called by the other party, for each listener that * they had added. - * The context type of the listener removed is provided as `details.contextType`, + * The context type of the listener removed is provided as `details.contextType`, * which will be `null` if all event types were being listened to. */ export interface PrivateChannelUnsubscribeEvent extends PrivateChannelEvent { - readonly type: "unsubscribe"; + readonly type: 'unsubscribe'; readonly details: { - contextType: string | null + contextType: string | null; }; } /** * Type defining the format of events representing a remote app being terminated - * or otherwise disconnecting from the PrivateChannel. This event is in addition to + * or otherwise disconnecting from the PrivateChannel. This event is in addition to * unsubscribe events that will also be fired for any context listeners they had added. * No details are provided. */ export interface PrivateChannelDisconnectEvent extends PrivateChannelEvent { - readonly type: "disconnect"; + readonly type: 'disconnect'; readonly details: null | undefined; } diff --git a/src/api/GetAgent.ts b/packages/fdc3-standard/src/api/GetAgent.ts similarity index 85% rename from src/api/GetAgent.ts rename to packages/fdc3-standard/src/api/GetAgent.ts index 08e2b1378..92aea0d9f 100644 --- a/src/api/GetAgent.ts +++ b/packages/fdc3-standard/src/api/GetAgent.ts @@ -81,23 +81,58 @@ export type GetAgentType = (params?: GetAgentParams) => Promise; * or an iframe's `contentWindow`) for a window or frame in which it has loaded * a Desktop Agent or suitable proxy to one that works with FDC3 Web Connection * and Desktop Agent Communication Protocols. + * + * @property {GetAgentLogLevels} logLevels Settings that determine what should + * will logged by the getAgent() implementation and DesktopAgentProxy to the + * JavaScript console. */ -type GetAgentParams = { +export type GetAgentParams = { timeoutMs?: number; identityUrl?: string; channelSelector?: boolean; intentResolver?: boolean; dontSetWindowFdc3?: boolean; failover?: (args: GetAgentParams) => Promise; + logLevels?: GetAgentLogLevels; +}; + +/** + * @typedef {Object} GetAgentLogLevels Type representing log-level parameters \ + * passed to the getAgent function that control what is logged to the JavaScript + * console by the getAgent() implementation and any DesktopAgentProxy it creates. + * + * @property {boolean} connection Log-level for messages relating to establishing + * a connection to the Desktop Agent (default INFO). + * + * @property {boolean} proxy Log-level for messages from a DesktopAgentProxy + * created by getAgent. These include log of messages sent or received from the + * DesktopAgent at the INFO level and heartbeat messages at the DEBUG level + * (default WARN). + * + */ +export type GetAgentLogLevels = { + connection: LogLevel; + proxy: LogLevel; }; +/** + * Type representing the different log-levels that can be set. + */ +export enum LogLevel { + NONE = 0, + ERROR = 1, + WARN = 2, + INFO = 3, + DEBUG = 4, +} + /** Type representing the format of data stored by `getAgent` * in Session Storage. The `identityUrl` of each app is used * as the key. */ export type SessionStorageFormat = { /** */ - [key: string]: DesktopAgentDetails -} + [key: string]: DesktopAgentDetails; +}; /** Type representing data on the Desktop Agent that an app * connected to that is persisted by the getAgent function @@ -111,11 +146,11 @@ export type DesktopAgentDetails = { /** The URL that was previously sent to the Desktop Agent * to establish the app's identity.*/ - identityUrl?: string; + identityUrl: string; /** The current URL at the time of the last connection to * a Desktop Agent.*/ - actualUrl?: string; + actualUrl: string; /** Optional URL field that should be used to store any * URL that was used to connect to a Desktop Agent. URLs @@ -169,5 +204,3 @@ export enum WebDesktopAgentType { } export const DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX = 'fdc3-desktop-agent-details'; - -export const DEFAULT_TIMEOUT_MS = 1000; \ No newline at end of file diff --git a/src/api/Icon.ts b/packages/fdc3-standard/src/api/Icon.ts similarity index 100% rename from src/api/Icon.ts rename to packages/fdc3-standard/src/api/Icon.ts diff --git a/src/api/Image.ts b/packages/fdc3-standard/src/api/Image.ts similarity index 100% rename from src/api/Image.ts rename to packages/fdc3-standard/src/api/Image.ts diff --git a/src/api/ImplementationMetadata.ts b/packages/fdc3-standard/src/api/ImplementationMetadata.ts similarity index 100% rename from src/api/ImplementationMetadata.ts rename to packages/fdc3-standard/src/api/ImplementationMetadata.ts diff --git a/src/api/IntentMetadata.ts b/packages/fdc3-standard/src/api/IntentMetadata.ts similarity index 100% rename from src/api/IntentMetadata.ts rename to packages/fdc3-standard/src/api/IntentMetadata.ts diff --git a/src/api/IntentResolution.ts b/packages/fdc3-standard/src/api/IntentResolution.ts similarity index 100% rename from src/api/IntentResolution.ts rename to packages/fdc3-standard/src/api/IntentResolution.ts diff --git a/src/api/Listener.ts b/packages/fdc3-standard/src/api/Listener.ts similarity index 100% rename from src/api/Listener.ts rename to packages/fdc3-standard/src/api/Listener.ts diff --git a/src/api/Methods.ts b/packages/fdc3-standard/src/api/Methods.ts similarity index 68% rename from src/api/Methods.ts rename to packages/fdc3-standard/src/api/Methods.ts index 15377c915..a32357d4d 100644 --- a/src/api/Methods.ts +++ b/packages/fdc3-standard/src/api/Methods.ts @@ -6,7 +6,6 @@ import { AppIdentifier, AppIntent, Channel, - Context, ContextHandler, IntentHandler, IntentResolution, @@ -18,268 +17,231 @@ import { StandardContextType, StandardIntent, ContextType, - FDC3EventType, + FDC3EventTypes, EventHandler, + DesktopAgent, } from '..'; import { StandardContextsSet } from '../internal/contextConfiguration'; import { StandardIntentsSet } from '../internal/intentConfiguration'; - -const DEFAULT_TIMEOUT = 5000; +import { Context } from '@finos/fdc3-context'; const UnavailableError = new Error('FDC3 DesktopAgent not available at `window.fdc3`.'); -const TimeoutError = new Error('Timed out waiting for `fdc3Ready` event.'); -const UnexpectedError = new Error('`fdc3Ready` event fired, but `window.fdc3` not set to DesktopAgent.'); /** - * @deprecated This function depends on window.fdc3 (which may not be set for web-based Desktop Agents) + * @deprecated This function depends on window.fdc3 (which may not be set for web-based Desktop Agents) * and does not wait on the fdc3Ready event, so it may return errors on container-based Desktop Agents. * Use `const fdc3 = getAgent()` to retrieve (and wait for) a reference to the FDC3 API instead. */ -function rejectIfNoGlobal(f: () => Promise) { - return window.fdc3 ? f() : Promise.reject(UnavailableError); +function rejectIfNoGlobal(f: (fdc3: DesktopAgent) => Promise) { + return window.fdc3 ? f(window.fdc3) : Promise.reject(UnavailableError); } -/** - * Utility function that returns a promise that will resolve immediately - * if the DesktopAgent API is found at `window.fdc3`. If the API is found, - * the promise will resolve when the `fdc3Ready` event is received or if it - * is found at the end of the specified timeout. If the API is not found, it - * will reject with an error. - * - * ```javascript - * await fdc3Ready(); - * const intentListener = await addIntentListener("ViewChart", intentHandlerFn); - * ``` - * - * There is no need to use this function if you are using `await getAgent()` to - * retrieve a Desktop Agent as it already waits for the Desktop Agent to be ready. - * - * @param waitForMs The number of milliseconds to wait for the FDC3 API to be - * ready. Defaults to 5 seconds. - * - * @deprecated This function depends on window.fdc3 (which may not be set for - * web-based Desktop Agents). Use `const fdc3 = getAgent()` to retrieve (and - * wait for) a reference to the FDC3 API instead. - */ -export const fdc3Ready = async (waitForMs = DEFAULT_TIMEOUT): Promise => { - return new Promise((resolve, reject) => { - // if the global is already available resolve immediately - if (window.fdc3) { - resolve(); - } else { - // if its not available setup a timeout to return a rejected promise - const timeout = setTimeout(() => (window.fdc3 ? resolve() : reject(TimeoutError)), waitForMs); - // listen for the fdc3Ready event - window.addEventListener( - 'fdc3Ready', - () => { - clearTimeout(timeout); - window.fdc3 ? resolve() : reject(UnexpectedError); - }, - { once: true } - ); - } - }); -}; - function isString(app: AppIdentifier | string | undefined): app is string { return !!app && typeof app === 'string'; } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function open(app: AppIdentifier | string, context?: Context): Promise { if (isString(app)) { - return rejectIfNoGlobal(() => window.fdc3.open(app, context)); + return window.fdc3 ? window.fdc3.open(app, context) : Promise.reject(UnavailableError); } else { - return rejectIfNoGlobal(() => window.fdc3.open(app, context)); + return window.fdc3 ? window.fdc3.open(app, context) : Promise.reject(UnavailableError); } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function findIntent(intent: Intent, context?: Context, resultType?: string): Promise { - return rejectIfNoGlobal(() => window.fdc3.findIntent(intent, context, resultType)); + return window.fdc3 ? window.fdc3.findIntent(intent, context, resultType) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function findIntentsByContext(context: Context, resultType?: string): Promise { - return rejectIfNoGlobal(() => window.fdc3.findIntentsByContext(context, resultType)); + return window.fdc3 ? window.fdc3.findIntentsByContext(context, resultType) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function broadcast(context: Context): Promise { - return rejectIfNoGlobal(() => window.fdc3.broadcast(context)); + return window.fdc3 ? window.fdc3.broadcast(context) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function raiseIntent(intent: Intent, context: Context, app?: AppIdentifier | string): Promise { if (isString(app)) { - return rejectIfNoGlobal(() => window.fdc3.raiseIntent(intent, context, app)); + return window.fdc3 ? window.fdc3.raiseIntent(intent, context, app) : Promise.reject(UnavailableError); } else { - return rejectIfNoGlobal(() => window.fdc3.raiseIntent(intent, context, app)); + return window.fdc3 ? window.fdc3.raiseIntent(intent, context, app) : Promise.reject(UnavailableError); } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function raiseIntentForContext(context: Context, app?: AppIdentifier | string): Promise { if (isString(app)) { - return rejectIfNoGlobal(() => window.fdc3.raiseIntentForContext(context, app)); + return window.fdc3 ? window.fdc3.raiseIntentForContext(context, app) : Promise.reject(UnavailableError); } else { - return rejectIfNoGlobal(() => window.fdc3.raiseIntentForContext(context, app)); + return window.fdc3 ? window.fdc3.raiseIntentForContext(context, app) : Promise.reject(UnavailableError); } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function addIntentListener(intent: Intent, handler: IntentHandler): Promise { - return rejectIfNoGlobal(() => window.fdc3.addIntentListener(intent, handler)); + return window.fdc3 ? window.fdc3.addIntentListener(intent, handler) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function addContextListener( contextTypeOrHandler: ContextType | null | ContextHandler, handler?: ContextHandler ): Promise { //Handle (deprecated) function signature that allowed contextType argument to be omitted if (typeof contextTypeOrHandler !== 'function') { - return rejectIfNoGlobal(() => window.fdc3.addContextListener(contextTypeOrHandler, handler as ContextHandler)); + return window.fdc3 + ? window.fdc3.addContextListener(contextTypeOrHandler, handler as ContextHandler) + : Promise.reject(UnavailableError); } else { - return rejectIfNoGlobal(() => window.fdc3.addContextListener(null, contextTypeOrHandler as ContextHandler)); + return window.fdc3 + ? window.fdc3.addContextListener(null, contextTypeOrHandler as ContextHandler) + : Promise.reject(UnavailableError); } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ -export function addEventListener(eventType: FDC3EventType, handler: EventHandler): Promise { - return rejectIfNoGlobal(() => window.fdc3.addEventListener(eventType, handler)); + */ +export function addEventListener(eventType: FDC3EventTypes, handler: EventHandler): Promise { + return rejectIfNoGlobal(fdc3 => fdc3.addEventListener(eventType, handler)); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getUserChannels(): Promise { - return rejectIfNoGlobal(() => { + if (window.fdc3) { //fallback to getSystemChannels for FDC3 <2.0 implementations if (window.fdc3.getUserChannels) { return window.fdc3.getUserChannels(); } else { return window.fdc3.getSystemChannels(); } - }); + } else { + return Promise.reject(UnavailableError); + } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getSystemChannels(): Promise { - //fallforward to getUserChannels for FDC3 2.0+ implementations + //fall-forward to getUserChannels for FDC3 2.0+ implementations return getUserChannels(); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function joinUserChannel(channelId: string): Promise { - return rejectIfNoGlobal(() => { + if (window.fdc3) { //fallback to joinChannel for FDC3 <2.0 implementations if (window.fdc3.joinUserChannel) { return window.fdc3.joinUserChannel(channelId); } else { return window.fdc3.joinChannel(channelId); } - }); + } else { + return Promise.reject(UnavailableError); + } } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function joinChannel(channelId: string): Promise { - //fallforward to joinUserChannel for FDC3 2.0+ implementations + //fall-forward to joinUserChannel for FDC3 2.0+ implementations return joinUserChannel(channelId); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getOrCreateChannel(channelId: string): Promise { - return rejectIfNoGlobal(() => window.fdc3.getOrCreateChannel(channelId)); + return window.fdc3 ? window.fdc3.getOrCreateChannel(channelId) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getCurrentChannel(): Promise { - return rejectIfNoGlobal(() => window.fdc3.getCurrentChannel()); + return window.fdc3 ? window.fdc3.getCurrentChannel() : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function leaveCurrentChannel(): Promise { - return rejectIfNoGlobal(() => window.fdc3.leaveCurrentChannel()); + return window.fdc3 ? window.fdc3.leaveCurrentChannel() : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function createPrivateChannel(): Promise { - return rejectIfNoGlobal(() => window.fdc3.createPrivateChannel()); + return window.fdc3 ? window.fdc3.createPrivateChannel() : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getInfo(): Promise { - return rejectIfNoGlobal(() => window.fdc3.getInfo()); + return window.fdc3 ? window.fdc3.getInfo() : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function getAppMetadata(app: AppIdentifier): Promise { - return rejectIfNoGlobal(() => window.fdc3.getAppMetadata(app)); + return window.fdc3 ? window.fdc3.getAppMetadata(app) : Promise.reject(UnavailableError); } -/** +/** * @deprecated Importing individual FDC3 API calls is deprecated. Use `getAgent` to retrieve * an FDC3 API reference and use the functions that it provides instead. -*/ + */ export function findInstances(app: AppIdentifier): Promise { - return rejectIfNoGlobal(() => window.fdc3.findInstances(app)); + return window.fdc3 ? window.fdc3.findInstances(app) : Promise.reject(UnavailableError); } /** diff --git a/src/api/PrivateChannel.ts b/packages/fdc3-standard/src/api/PrivateChannel.ts similarity index 92% rename from src/api/PrivateChannel.ts rename to packages/fdc3-standard/src/api/PrivateChannel.ts index f9a15fa09..922411466 100644 --- a/src/api/PrivateChannel.ts +++ b/packages/fdc3-standard/src/api/PrivateChannel.ts @@ -21,30 +21,29 @@ import { EventHandler, PrivateChannelEventTypes } from './Events'; * - MUST provide the `id` value for the channel as required by the Channel interface. */ export interface PrivateChannel extends Channel { - - /** - * Register a handler for events from the PrivateChannel. Whenever the handler function + /** + * Register a handler for events from the PrivateChannel. Whenever the handler function * is called it will be passed an event object with details related to the event. - * + * * ```js * // any event type * const listener = await myPrivateChannel.addEventListener(null, event => { * console.log(`Received event ${event.type}\n\tDetails: ${event.details}`); * }); - * - * // listener for a specific event type + * + * // listener for a specific event type * const channelChangedListener = await myPrivateChannel.addEventListener( - * "addContextListener", + * "addContextListener", * event => { ... } * ); * ``` - * - * @param {PrivateChannelEventType | null} type If non-null, only events of the specified type will be received by the handler. - * @param {EventHandler} handler A function that events received will be passed to. - * - */ - addEventListener(type: PrivateChannelEventTypes | null, handler: EventHandler): Promise; - + * + * @param {PrivateChannelEventType | null} type If non-null, only events of the specified type will be received by the handler. + * @param {EventHandler} handler A function that events received will be passed to. + * + */ + addEventListener(type: PrivateChannelEventTypes | null, handler: EventHandler): Promise; + /** * May be called to indicate that a participant will no longer interact with this channel. * @@ -61,7 +60,7 @@ export interface PrivateChannel extends Channel { /** * @deprecated use `addEventListener("addContextListener", handler)` instead. - * + * * Adds a listener that will be called each time that the remote app invokes * addContextListener on this channel. * @@ -73,7 +72,7 @@ export interface PrivateChannel extends Channel { /** * @deprecated use `addEventListener("unsubscribe", handler)` instead. - * + * * Adds a listener that will be called whenever the remote app invokes * Listener.unsubscribe() on a context listener that it previously added. * @@ -84,7 +83,7 @@ export interface PrivateChannel extends Channel { /** * @deprecated use `addEventListener("disconnect", handler)` instead. - * + * * Adds a listener that will be called when the remote app terminates, for example * when its window is closed or because disconnect was called. This is in addition * to calls that will be made to onUnsubscribe listeners. diff --git a/src/api/RecommendedChannels.ts b/packages/fdc3-standard/src/api/RecommendedChannels.ts similarity index 100% rename from src/api/RecommendedChannels.ts rename to packages/fdc3-standard/src/api/RecommendedChannels.ts diff --git a/src/api/Types.ts b/packages/fdc3-standard/src/api/Types.ts similarity index 89% rename from src/api/Types.ts rename to packages/fdc3-standard/src/api/Types.ts index 0ff1a7830..ac6bf6e2c 100644 --- a/src/api/Types.ts +++ b/packages/fdc3-standard/src/api/Types.ts @@ -3,8 +3,9 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ -import { Channel, ContextMetadata } from '..'; -import { Context } from '../context/ContextTypes'; +import { Context } from '@finos/fdc3-context'; +import { Channel } from './Channel'; +import { ContextMetadata } from './ContextMetadata'; /** * Describes a callback that handles a context event. diff --git a/src/app-directory/specification/appd.schema.json b/packages/fdc3-standard/src/app-directory/specification/appd.schema.json similarity index 99% rename from src/app-directory/specification/appd.schema.json rename to packages/fdc3-standard/src/app-directory/specification/appd.schema.json index cd8987624..b4348c4be 100644 --- a/src/app-directory/specification/appd.schema.json +++ b/packages/fdc3-standard/src/app-directory/specification/appd.schema.json @@ -656,7 +656,7 @@ }, "LaunchDetails": { "description": "The type specific launch details of the application. These details are intended to be vendor-agnostic and MAY be duplicated or overridden by details provided in the hostManifests object for a specific host.", - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/WebAppDetails" }, @@ -675,6 +675,7 @@ ] }, "WebAppDetails": { + "type": "object", "description": "Properties used to launch apps with `type: web`.", "required": [ "url" @@ -689,6 +690,7 @@ "additionalProperties": false }, "NativeAppDetails": { + "type": "object", "description": "Properties used to launch apps with `type: native` that are already installed on the device.", "required": [ "path" @@ -706,6 +708,7 @@ "additionalProperties": false }, "CitrixAppDetails": { + "type": "object", "description": "Properties used to launch apps virtualized apps with `type: citrix`.", "required": [ "alias" @@ -723,6 +726,7 @@ "additionalProperties": false }, "OnlineNativeAppDetails": { + "type": "object", "description": "Properties used to launch a native apps with `type: onlineNative` that have an online launcher, e.g. online ClickOnce app deployments.", "required": [ "url" @@ -737,7 +741,9 @@ "additionalProperties": false }, "OtherAppDetails": { + "type": "object", "description": "Apps with `type: other` are defined by a hostManifest and do not require other details.", + "properties": {}, "additionalProperties": false }, "HostManifests": { diff --git a/src/app-directory/specification/examples/application/fdc3-workbench.json b/packages/fdc3-standard/src/app-directory/specification/examples/application/fdc3-workbench.json similarity index 100% rename from src/app-directory/specification/examples/application/fdc3-workbench.json rename to packages/fdc3-standard/src/app-directory/specification/examples/application/fdc3-workbench.json diff --git a/src/app-directory/specification/examples/application/myApplication.json b/packages/fdc3-standard/src/app-directory/specification/examples/application/myApplication.json similarity index 100% rename from src/app-directory/specification/examples/application/myApplication.json rename to packages/fdc3-standard/src/app-directory/specification/examples/application/myApplication.json diff --git a/src/app-directory/specification/test/index.js b/packages/fdc3-standard/src/app-directory/specification/test/index.js similarity index 78% rename from src/app-directory/specification/test/index.js rename to packages/fdc3-standard/src/app-directory/specification/test/index.js index 3727b52bc..dd035292e 100644 --- a/src/app-directory/specification/test/index.js +++ b/packages/fdc3-standard/src/app-directory/specification/test/index.js @@ -1,8 +1,8 @@ -const SwaggerParser = require('@apidevtools/swagger-parser'); -const { Validator } = require('jsonschema'); -const assert = require('assert'); -const exampleApplication1 = require('../examples/application/myApplication.json'); -const exampleApplication2 = require('../examples/application/fdc3-workbench.json'); +import SwaggerParser from '@apidevtools/swagger-parser'; +import { Validator } from 'jsonschema'; +import exampleApplication1 from '../examples/application/myApplication.json' with { type: 'json' }; +import exampleApplication2 from '../examples/application/fdc3-workbench.json' with { type: 'json' }; +import { strict as assert } from 'assert'; (async () => { try { diff --git a/src/app-directory/specification/test/package-lock.json b/packages/fdc3-standard/src/app-directory/specification/test/package-lock.json similarity index 100% rename from src/app-directory/specification/test/package-lock.json rename to packages/fdc3-standard/src/app-directory/specification/test/package-lock.json diff --git a/src/app-directory/specification/test/package.json b/packages/fdc3-standard/src/app-directory/specification/test/package.json similarity index 96% rename from src/app-directory/specification/test/package.json rename to packages/fdc3-standard/src/app-directory/specification/test/package.json index 5c233774e..e22beec29 100644 --- a/src/app-directory/specification/test/package.json +++ b/packages/fdc3-standard/src/app-directory/specification/test/package.json @@ -10,6 +10,7 @@ "publishConfig": { "tag": "latest" }, + "type": "module", "license": "Apache-2.0", "main": "index.js", "files": [ diff --git a/src/context/ContextType.ts b/packages/fdc3-standard/src/context/ContextType.ts similarity index 91% rename from src/context/ContextType.ts rename to packages/fdc3-standard/src/context/ContextType.ts index 4364058bf..68c24ff77 100644 --- a/src/context/ContextType.ts +++ b/packages/fdc3-standard/src/context/ContextType.ts @@ -43,8 +43,6 @@ export type ExperimentalContextType = /** * @see https://fdc3.finos.org/docs/context/spec */ -// disable linter rule that dislikes {} - its necessary here to stop the TS compiler reducing this type to string -// eslint-disable-next-line @typescript-eslint/ban-types export type ContextType = StandardContextType | ExperimentalContextType | (string & {}); /** diff --git a/src/index.ts b/packages/fdc3-standard/src/index.ts similarity index 63% rename from src/index.ts rename to packages/fdc3-standard/src/index.ts index 26aca3e69..8450f5ebc 100644 --- a/src/index.ts +++ b/packages/fdc3-standard/src/index.ts @@ -4,14 +4,9 @@ */ import { DesktopAgent } from './api/DesktopAgent'; -import * as BridgingTypes from './bridging/BridgingTypes'; -import * as BrowserTypes from './api/BrowserTypes'; -//import in order to create a local export that overwrites type exported via ContextTypes -import * as AppIdentifier from './api/AppIdentifier'; -export * from './context/ContextTypes'; - -export { AppIdentifier }; +//explicit overwrite of conflicting & equivalent export from ContextTypes +export { AppIdentifier } from './api/AppIdentifier'; export * from './api/AppIntent'; export * from './api/AppMetadata'; export * from './api/Channel'; @@ -30,16 +25,15 @@ export * from './api/Methods'; export * from './api/PrivateChannel'; export * from './api/RecommendedChannels'; export * from './api/Types'; -export * from './api/Events' - +export * from './api/Events'; +export * from './api/GetAgent'; export * from './context/ContextType'; - export * from './intents/Intents'; +export * from './ui/IntentResolver'; +export * from './ui/ChannelSelector'; +export * from './ui/Connectable'; -/* Workaround for conflicts between bridging types, browser type and API types - and prettier issue with `export * as`. */ -export { BridgingTypes }; -export { BrowserTypes }; +export const FDC3_VERSION = '2.2'; declare global { interface Window { diff --git a/src/intents/Intents.ts b/packages/fdc3-standard/src/intents/Intents.ts similarity index 88% rename from src/intents/Intents.ts rename to packages/fdc3-standard/src/intents/Intents.ts index 281ec2ebc..10229dfc4 100644 --- a/src/intents/Intents.ts +++ b/packages/fdc3-standard/src/intents/Intents.ts @@ -30,8 +30,6 @@ export type StandardIntent = /** * @see https://fdc3.finos.org/docs/intents/spec */ -// disable linter rule that dislikes {} - its necessary here to stop the TS compiler reducing this type to string -// eslint-disable-next-line @typescript-eslint/ban-types export type Intent = StandardIntent | (string & {}); /** diff --git a/src/intents/standard intents.json b/packages/fdc3-standard/src/intents/standard intents.json similarity index 100% rename from src/intents/standard intents.json rename to packages/fdc3-standard/src/intents/standard intents.json diff --git a/src/internal/contextConfiguration.ts b/packages/fdc3-standard/src/internal/contextConfiguration.ts similarity index 100% rename from src/internal/contextConfiguration.ts rename to packages/fdc3-standard/src/internal/contextConfiguration.ts diff --git a/src/internal/intentConfiguration.ts b/packages/fdc3-standard/src/internal/intentConfiguration.ts similarity index 100% rename from src/internal/intentConfiguration.ts rename to packages/fdc3-standard/src/internal/intentConfiguration.ts diff --git a/packages/fdc3-standard/src/internal/typeHelpers.ts b/packages/fdc3-standard/src/internal/typeHelpers.ts new file mode 100644 index 000000000..f30fd507a --- /dev/null +++ b/packages/fdc3-standard/src/internal/typeHelpers.ts @@ -0,0 +1,15 @@ +type AtLeastOne = [T, ...T[]]; + +/** + * Ensures at compile time that the given string tuple is exhaustive on a given union type, i.e. contains ALL possible values of the given UNION_TYPE. + */ +export const exhaustiveStringTuple = + () => + >( + ...tuple: L extends any + ? Exclude extends never + ? L + : Exclude[] + : never + ) => + tuple; diff --git a/packages/fdc3-standard/src/ui/ChannelSelector.ts b/packages/fdc3-standard/src/ui/ChannelSelector.ts new file mode 100644 index 000000000..d5e95caa0 --- /dev/null +++ b/packages/fdc3-standard/src/ui/ChannelSelector.ts @@ -0,0 +1,18 @@ +import { Channel } from '../api/Channel'; +import { Connectable } from '../ui/Connectable'; + +/** + * Interface used by the desktop agent proxy to handle the channel selection process. + */ +export interface ChannelSelector extends Connectable { + /** + * Called when the list of user channels is updated, or the selected channel changes. + */ + updateChannel(channelId: string | null, availableChannels: Channel[]): Promise; + + /** + * Called on initialization. The channel selector will invoke the callback after the + * channel is changed. + */ + setChannelChangeCallback(callback: (channelId: string | null) => void): void; +} diff --git a/packages/fdc3-standard/src/ui/Connectable.ts b/packages/fdc3-standard/src/ui/Connectable.ts new file mode 100644 index 000000000..b1baf2180 --- /dev/null +++ b/packages/fdc3-standard/src/ui/Connectable.ts @@ -0,0 +1,6 @@ +//TODO: move this out of fdc3-standard into another package - its an implementation detail of GetAgent and used in fdc3-get-agent and fdc3-agent-proxy +export interface Connectable { + connect(): Promise; + + disconnect(): Promise; +} diff --git a/packages/fdc3-standard/src/ui/IntentResolver.ts b/packages/fdc3-standard/src/ui/IntentResolver.ts new file mode 100644 index 000000000..6c4ff2b58 --- /dev/null +++ b/packages/fdc3-standard/src/ui/IntentResolver.ts @@ -0,0 +1,20 @@ +import { Context } from '@finos/fdc3-context'; +import { AppIdentifier } from '../api/AppIdentifier'; +import { AppIntent } from '../api/AppIntent'; +import { Connectable } from './Connectable'; + +export type IntentResolutionChoice = { + intent: string; + appId: AppIdentifier; +}; + +/** + * Interface used by the desktop agent proxy to handle the intent resolution process. + */ +export interface IntentResolver extends Connectable { + /** + * Called when the user needs to resolve an intent. Returns either the app chosen to + * resolve the intent or void if the operation was cancelled. + */ + chooseIntent(appIntents: AppIntent[], context: Context): Promise; +} diff --git a/test/ContextTypes.test.ts b/packages/fdc3-standard/test/ContextTypes.test.ts similarity index 89% rename from test/ContextTypes.test.ts rename to packages/fdc3-standard/test/ContextTypes.test.ts index 0c274de02..65b6a9f4d 100644 --- a/test/ContextTypes.test.ts +++ b/packages/fdc3-standard/test/ContextTypes.test.ts @@ -1,4 +1,4 @@ -import { Convert, Contact } from '../src'; +import { Convert, Contact } from '@finos/fdc3-context'; const json = '{ "type": "fdc3.contact", "id": { "email": "joe@mail.com" } }'; const contact: Contact = { diff --git a/test/Methods.test.ts b/packages/fdc3-standard/test/Methods.test.ts similarity index 84% rename from test/Methods.test.ts rename to packages/fdc3-standard/test/Methods.test.ts index 83d538f34..33ba75733 100644 --- a/test/Methods.test.ts +++ b/packages/fdc3-standard/test/Methods.test.ts @@ -7,7 +7,6 @@ import { compareVersionNumbers, ContextHandler, DesktopAgent, - fdc3Ready, findIntent, findIntentsByContext, getCurrentChannel, @@ -98,7 +97,6 @@ describe('test ES6 module', () => { await expect(getUserChannels()).rejects.toEqual(UnavailableError); }); - test('addEventListener should reject', async () => { await expect(addEventListener(expect.any(String), expect.any(Object))).rejects.toEqual(UnavailableError); }); @@ -146,7 +144,7 @@ describe('test ES6 module', () => { }); afterAll(() => { - window.fdc3 = (undefined as unknown) as DesktopAgent; + window.fdc3 = undefined as unknown as DesktopAgent; }); test('open should delegate to window.fdc3.open', async () => { @@ -323,96 +321,6 @@ describe('test ES6 module', () => { expect(window.fdc3.findInstances).toHaveBeenCalledWith(dummyApp); }); }); - - describe('fdc3Ready', () => { - let eventListeners: any; - - beforeEach(() => { - jest.useFakeTimers({ - legacyFakeTimers: true - }); - - eventListeners = {}; - - window.addEventListener = jest.fn((event, callback) => { - eventListeners[event] = callback; - }); - }); - - afterEach(() => { - window.fdc3 = (undefined as unknown) as DesktopAgent; - }); - - afterAll(() => { - jest.useRealTimers(); - }) - - test('resolves immediately if `window.fdc3` is already defined', async () => { - // set fdc3 object and call fdc3Ready - window.fdc3 = mock(); - const promise = fdc3Ready(); - - expect(setTimeout).not.toHaveBeenCalled(); - expect(clearTimeout).not.toHaveBeenCalled(); - expect(eventListeners).not.toHaveProperty('fdc3Ready'); - await expect(promise).resolves.toBe(undefined); - }); - - test('waits for specified milliseconds', async () => { - const waitForMs = 1000; - - const promise = fdc3Ready(waitForMs); - - expect(setTimeout).toHaveBeenCalledTimes(1); - expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), waitForMs); - - jest.advanceTimersByTime(waitForMs); - - await expect(promise).rejects.toEqual(TimeoutError); - }); - - test('waits for 5000 milliseconds by default', async () => { - const defaultWaitForMs = 5000; - - const promise = fdc3Ready(); - - expect(setTimeout).toHaveBeenCalledTimes(1); - expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), defaultWaitForMs); - - jest.advanceTimersByTime(defaultWaitForMs); - - await expect(promise).rejects.toEqual(TimeoutError); - }); - - test('`fdc3Ready` event cancels timeout and rejects if `window.fdc3` is not defined', () => { - const promise = fdc3Ready(); - - expect(setTimeout).toHaveBeenCalledTimes(1); - expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 5000); - expect(eventListeners).toHaveProperty('fdc3Ready'); - - // trigger fdc3Ready event without setting fdc3 object - eventListeners['fdc3Ready'](); - - expect(clearTimeout).toHaveBeenCalledTimes(1); - return expect(promise).rejects.toEqual(UnexpectedError); - }); - - test('`fdc3Ready` event cancels timeout and resolves if `window.fdc3` is defined', async () => { - const promise = fdc3Ready(); - - expect(setTimeout).toHaveBeenCalledTimes(1); - expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 5000); - expect(eventListeners).toHaveProperty('fdc3Ready'); - - // set fdc3 object and trigger fdc3 ready event - window.fdc3 = mock(); - eventListeners['fdc3Ready'](); - - expect(clearTimeout).toHaveBeenCalledTimes(1); - await expect(promise).resolves.toBe(undefined); - }); - }); }); describe('test version comparison functions', () => { diff --git a/test/window.test.ts b/packages/fdc3-standard/test/window.test.ts similarity index 100% rename from test/window.test.ts rename to packages/fdc3-standard/test/window.test.ts diff --git a/packages/fdc3-standard/tsconfig.json b/packages/fdc3-standard/tsconfig.json new file mode 100644 index 000000000..d5ed268be --- /dev/null +++ b/packages/fdc3-standard/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src" + ], + "outDir": "dist", + }, + "include": [ + "src", + ], + "exclude": [ + "test/**", + "dist/**" + ], + "references": [ + { + "path": "../fdc3-schema" + }, + { + "path": "../fdc3-context" + } + ] +} \ No newline at end of file diff --git a/packages/fdc3/README.md b/packages/fdc3/README.md new file mode 100644 index 000000000..41add5d48 --- /dev/null +++ b/packages/fdc3/README.md @@ -0,0 +1,54 @@ +# FDC3 + +This npm module is the main entry point for the Financial Desktop Connectivity and Collaboration Consortium (FDC3) JavaScript API. + +Since version 2.2.0 this module only provides an ES6 module. Applications requiring a CommonJS module should either update to ES6 or switch to the [@finos/fdc3-commonjs module](https://npmjs.com/package/@finos/fdc3-commonjs) (provided for backwards compatibility). + +## Installation + +To install the FDC3 module, use npm: + +```bash +npm install @finos/fdc3 +``` + +## Usage + +To use the FDC3 module in your project, import it as follows: + +```javascript +import { getAgent } from '@finos/fdc3'; +// getAgent() returns the FDC3 Desktop Agent +const fdc3 = getAgent(); + +// Example usage +const contact = { + type: 'fdc3.contact', + name: 'Jane Doe', + id: { + email: 'jane@mail.com' + } +}; + +fdc3.raiseIntent('ViewProfile', contact); +``` + +## Documentation + +For detailed documentation and API reference, please visit the [official FDC3 documentation](https://fdc3.finos.org/docs/api/spec). + +## Contributing + +We welcome contributions to the FDC3 project. Please see our [contributing guidelines](https://github.com/finos/FDC3/blob/main/CONTRIBUTING.md) for more information. + +## License + +This project is licensed under the [Apache 2.0 License](LICENSE). + +## Contact + +For any questions or support, please reach out to the FDC3 community on our [Slack channel](https://finos-lf.slack.com/archives/CJ8Q8H4Q1) or [mailing list](mailto:fdc3@finos.org). + +## Further Details + +Further details are avilable in the main [FDC3 Project README](https://github.com/finos/FDC3) diff --git a/packages/fdc3/package.json b/packages/fdc3/package.json new file mode 100644 index 000000000..efbc116d0 --- /dev/null +++ b/packages/fdc3/package.json @@ -0,0 +1,29 @@ +{ + "name": "@finos/fdc3", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "clean": "npx rimraf dist", + "build": "tsc --module es2022" + }, + "dependencies": { + "@finos/fdc3-context": "2.2.0-alpha.3", + "@finos/fdc3-get-agent": "2.2.0-alpha.3", + "@finos/fdc3-schema": "2.2.0-alpha.3", + "@finos/fdc3-standard": "2.2.0-alpha.3" + } +} \ No newline at end of file diff --git a/packages/fdc3/src/index.ts b/packages/fdc3/src/index.ts new file mode 100644 index 000000000..8ae2de3fa --- /dev/null +++ b/packages/fdc3/src/index.ts @@ -0,0 +1,17 @@ +export * from '@finos/fdc3-context'; + +import { BrowserTypes, BridgingTypes } from '@finos/fdc3-schema'; +export { BridgingTypes, BrowserTypes }; + +import { DesktopAgent, AppIdentifier } from '@finos/fdc3-standard'; +export * from '@finos/fdc3-standard'; +export { AppIdentifier }; + +import { getAgent, fdc3Ready } from '@finos/fdc3-get-agent'; +export { getAgent, fdc3Ready }; + +declare global { + interface Window { + fdc3?: DesktopAgent; + } +} diff --git a/packages/fdc3/tsconfig.json b/packages/fdc3/tsconfig.json new file mode 100644 index 000000000..50306f4bc --- /dev/null +++ b/packages/fdc3/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src" + ], + "outDir": "dist", + }, + "include": [ + "src", + ], + "exclude": [], + "references": [ + { + "path": "../fdc3-schema" + }, + { + "path": "../fdc3-context" + }, + { + "path": "../fdc3-get-agent" + }, + { + "path": "../fdc3-standard" + } + ] +} \ No newline at end of file diff --git a/packages/testing/package.json b/packages/testing/package.json new file mode 100644 index 000000000..c911432b6 --- /dev/null +++ b/packages/testing/package.json @@ -0,0 +1,54 @@ +{ + "name": "@finos/testing", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "private": true, + "files": [ + "dist" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "scripts": { + "build": "tsc --module es2022", + "clean": "rimraf dist", + "test": "tsc" + }, + "dependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1" + } +} \ No newline at end of file diff --git a/packages/testing/src/agent/index.ts b/packages/testing/src/agent/index.ts new file mode 100644 index 000000000..d324268b2 --- /dev/null +++ b/packages/testing/src/agent/index.ts @@ -0,0 +1,63 @@ +import { AppIntent, Channel, IntentResult } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { IntentResolver, IntentResolutionChoice, ChannelSelector } from '@finos/fdc3-standard'; +import { PropsWorld } from '../world'; + +/** + * This super-simple intent resolver just resolves to the first + * intent / app in the list, unless the context is fdc3.cancel-me and then it just cancels. + */ +export class SimpleIntentResolver implements IntentResolver { + cw: PropsWorld; + + constructor(cw: PropsWorld) { + this.cw = cw; + } + + async connect(): Promise { } + + async disconnect(): Promise { } + + async intentChosen(ir: IntentResult): Promise { + this.cw.props['intent-result'] = ir; + return ir; + } + + async chooseIntent(appIntents: AppIntent[], ctx: Context): Promise { + if (ctx.type == 'fdc3.cancel-me') { + return; + } + + const out = { + intent: appIntents[0].intent, + chosenApp: appIntents[0].apps[0], + }; + + this.cw.props['intent-resolution'] = out; + return { + appId: appIntents[0].apps[0], + intent: appIntents[0].intent.name, + }; + } +} + +export const CHANNEL_STATE = 'CHANNEL_STATE'; + +export class SimpleChannelSelector implements ChannelSelector { + cw: PropsWorld; + + constructor(cw: PropsWorld) { + this.cw = cw; + } + + async updateChannel(channelId: string | null, availableChannels: Channel[]): Promise { + this.cw.props['channelId'] = channelId; + this.cw.props['channels'] = availableChannels; + } + + setChannelChangeCallback(_callback: (channelId: string | null) => void): void { } + + async connect(): Promise { } + + async disconnect(): Promise { } +} diff --git a/packages/testing/src/index.ts b/packages/testing/src/index.ts new file mode 100644 index 000000000..5c99d48c6 --- /dev/null +++ b/packages/testing/src/index.ts @@ -0,0 +1,19 @@ +import { setupGenericSteps } from './steps/generic.steps'; +import { doesRowMatch, handleResolve, indexOf, matchData } from './support/matching'; +import { PropsWorld } from './world'; +import Ajv2019 from 'ajv/dist/2019'; +import addFormats from 'ajv-formats'; +import { SimpleIntentResolver, CHANNEL_STATE } from './agent'; + +export { + PropsWorld, + doesRowMatch, + handleResolve, + indexOf, + matchData, + setupGenericSteps, + SimpleIntentResolver, + addFormats, + Ajv2019, + CHANNEL_STATE, +}; diff --git a/packages/testing/src/steps/generic.steps.ts b/packages/testing/src/steps/generic.steps.ts new file mode 100644 index 000000000..957758c26 --- /dev/null +++ b/packages/testing/src/steps/generic.steps.ts @@ -0,0 +1,230 @@ +import { DataTable, Given, Then, When } from '@cucumber/cucumber'; +import Ajv2019 from 'ajv/dist/2019'; +import * as draft7MetaSchema from 'ajv/dist/refs/json-schema-draft-07.json'; +import addFormats from 'ajv-formats'; +import { expect } from 'expect'; +import { doesRowMatch, handleResolve, matchData } from '../support/matching'; +import { PropsWorld } from '../world'; +import fs from 'fs'; +import path from 'path'; + +export function setupGenericSteps() { + Then('the promise {string} should resolve', async function (this: PropsWorld, field: string) { + try { + const promise = handleResolve(field, this); + const object = await promise; + this.props['result'] = object; + } catch (error) { + this.props['result'] = error; + } + }); + + Then( + 'the promise {string} should resolve within 10 seconds', + { timeout: 10 * 1000 }, + async function (this: PropsWorld, field: string) { + try { + const promise = handleResolve(field, this); + const object = await promise; + this.props['result'] = object; + } catch (error) { + this.props['result'] = error; + } + } + ); + + When('I call {string} with {string}', async function (this: PropsWorld, field: string, fnName: string) { + try { + const object = handleResolve(field, this); + const fn = object[fnName]; + const result = await fn.call(object); + this.props['result'] = result; + } catch (error) { + this.props['result'] = error; + } + }); + + When( + 'I call {string} with {string} with parameter {string}', + async function (this: PropsWorld, field: string, fnName: string, param: string) { + try { + const object = handleResolve(field, this); + const fn = object[fnName]; + const result = await fn.call(object, handleResolve(param, this)); + this.props['result'] = result; + } catch (error) { + this.props['result'] = error; + } + } + ); + + When( + 'I call {string} with {string} with parameters {string} and {string}', + async function (this: PropsWorld, field: string, fnName: string, param1: string, param2: string) { + try { + const object = handleResolve(field, this); + const fn = object[fnName]; + const result = await fn.call(object, handleResolve(param1, this), handleResolve(param2, this)); + this.props['result'] = result; + } catch (error) { + this.props['result'] = error; + } + } + ); + + When( + 'I call {string} with {string} with parameters {string} and {string} and {string}', + async function (this: PropsWorld, field: string, fnName: string, param1: string, param2: string, param3: string) { + try { + const object = handleResolve(field, this); + const fn = object[fnName]; + const result = await fn.call( + object, + handleResolve(param1, this), + handleResolve(param2, this), + handleResolve(param3, this) + ); + this.props['result'] = result; + } catch (error) { + this.props['result'] = error; + } + } + ); + + When('I refer to {string} as {string}', async function (this: PropsWorld, from: string, to: string) { + this.props[to] = handleResolve(from, this); + }); + + Then( + '{string} is an array of objects with the following contents', + function (this: PropsWorld, field: string, dt: DataTable) { + matchData(this, handleResolve(field, this), dt); + } + ); + + Then( + '{string} is an array of objects with length {string}', + function (this: PropsWorld, field: string, field2: string) { + expect(handleResolve(field, this).length).toEqual(Number.parseInt(handleResolve(field2, this))); + } + ); + + Then( + '{string} is an array of strings with the following values', + function (this: PropsWorld, field: string, dt: DataTable) { + const values = handleResolve(field, this).map((s: string) => { + return { value: s }; + }); + matchData(this, values, dt); + } + ); + + Then( + '{string} is an object with the following contents', + function (this: PropsWorld, field: string, params: DataTable) { + const table = params.hashes(); + expect(doesRowMatch(this, table[0], handleResolve(field, this))).toBeTruthy(); + } + ); + + Then('{string} is null', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeNull(); + }); + + Then('{string} is not null', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeDefined(); + }); + + Then('{string} is true', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeTruthy(); + }); + + Then('{string} is false', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeFalsy(); + }); + + Then('{string} is undefined', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeUndefined(); + }); + + Then('{string} is empty', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toHaveLength(0); + }); + + Then('{string} is {string}', function (this: PropsWorld, field: string, expected: string) { + const fVal = handleResolve(field, this); + const eVal = handleResolve(expected, this); + expect('' + fVal).toEqual('' + eVal); + }); + + Then('{string} is an error with message {string}', function (this: PropsWorld, field: string, errorType: string) { + expect(handleResolve(field, this)['message']).toBe(errorType); + }); + + Then('{string} is an error', function (this: PropsWorld, field: string) { + expect(handleResolve(field, this)).toBeInstanceOf(Error); + }); + + Given( + '{string} is a invocation counter into {string}', + function (this: PropsWorld, handlerName: string, field: string) { + this.props[handlerName] = () => { + var amount: number = this.props[field]; + amount++; + this.props[field] = amount; + }; + this.props[field] = 0; + } + ); + + Given( + '{string} is a function which returns a promise of {string}', + function (this: PropsWorld, fnName: string, field: string) { + const value = handleResolve(field, this); + this.props[fnName] = async () => { + return value; + }; + } + ); + + Given('we wait for a period of {string} ms', function (this: PropsWorld, ms: string) { + return new Promise((resolve, _reject) => { + setTimeout(() => resolve(), parseInt(ms)); + }); + }); + + Given('schemas loaded', async function (this: PropsWorld) { + const ajv = new Ajv2019(); + ajv.addMetaSchema(draft7MetaSchema); + addFormats(ajv); + + const f2 = fs; + const p = path; + + const schemaDir = p.join(__dirname, '../../../../fdc3-schema/schemas'); + const contextDir = p.join(__dirname, '../../../../fdc3-context/schemas'); + + const abspath = p.join(schemaDir, 'api'); + + try { + f2.readdirSync(abspath).forEach(file => { + if (file.endsWith('.json')) { + const filePath = p.join(abspath, file); + const contents = fs.readFileSync(filePath, 'utf8'); + const schema = JSON.parse(contents); + ajv.addSchema(schema); + //console.log(`Content of ${file}: ${contents}`); + } + }); + } catch (error) { + console.log(error); + } + + const contextPath = p.join(contextDir, 'context/context.schema.json'); + const contents = fs.readFileSync(contextPath, 'utf8'); + const schema = JSON.parse(contents); + ajv.addSchema(schema); + + this.props['ajv'] = ajv; + }); +} diff --git a/packages/testing/src/support/matching.ts b/packages/testing/src/support/matching.ts new file mode 100644 index 000000000..c4b772372 --- /dev/null +++ b/packages/testing/src/support/matching.ts @@ -0,0 +1,108 @@ +import { JSONPath } from 'jsonpath-plus'; +import { PropsWorld } from '../world'; +import expect from 'expect'; +import { DataTable } from '@cucumber/cucumber'; +import Ajv from 'ajv/dist/2019'; + +export function doesRowMatch(cw: PropsWorld, t: Record, data: any): boolean { + for (const [field, actual] of Object.entries(t)) { + if (field.endsWith('matches_type')) { + // validation mode + var valdata = data; + + if (field.length > 'matches_type'.length) { + // deals with the case where we're validating part of the object + const path = field.substring(0, field.length - 'matches_type'.length - 1); + valdata = JSONPath({ path: path, json: data })[0]; + } + + const validator: Ajv = cw.props['ajv']; + const validate = validator.getSchema('https://fdc3.finos.org/schemas/next/api/' + actual + '.schema.json'); + if (validate == undefined) { + throw Error('No schema found for ' + actual); + } + const valid = validate(valdata); + if (!valid) { + try { + cw.log(`Comparing Validation failed: ${JSON.stringify(data, null, 2)} \n ${JSON.stringify(validate.errors)}`); + } catch (e) { + cw.log(`Comparing Validation failed: ${JSON.stringify(validate.errors)}`); + } + return false; + } + } else { + const found = JSONPath({ path: field, json: data })[0]; + const resolved = handleResolve(actual, cw); + + if (found != resolved) { + try { + cw.log( + `Comparing Validation failed: ${JSON.stringify(data, null, 2)} \n Match failed on ${field} '${found}' vs '${resolved}'` + ); + } catch (e) { + cw.log('Match failed on ' + field + " '" + found + "' vs '" + resolved + "'"); + } + return false; + } + } + } + + return true; +} + +export function indexOf(cw: PropsWorld, rows: Record[], data: any): number { + for (var i = 0; i < rows.length; i++) { + if (doesRowMatch(cw, rows[i], data)) { + return i; + } + } + + return -1; +} + +function isNumeric(n: string) { + return !isNaN(parseFloat(n)) && isFinite(n as unknown as number); +} + +export function handleResolve(name: string, on: PropsWorld): any { + if (name.startsWith('{') && name.endsWith('}')) { + const stripped = name.substring(1, name.length - 1); + if (stripped == 'null') { + return null; + } else if (stripped == 'true') { + return true; + } else if (stripped == 'false') { + return false; + } else if (isNumeric(stripped)) { + return Number.parseFloat(stripped); + } else { + const out = JSONPath({ path: stripped, json: on.props })[0]; + return out; + } + } else { + return name; + } +} + +export function matchData(cw: PropsWorld, actual: any[], dt: DataTable) { + const tableData = dt.hashes(); + const rowCount = tableData.length; + + var resultCopy = JSON.parse(JSON.stringify(actual)) as any[]; + cw.log(`result ${JSON.stringify(resultCopy, null, 2)} length ${resultCopy.length}`); + expect(resultCopy).toHaveLength(rowCount); + var row = 0; + + resultCopy = resultCopy.filter(rr => { + const matchingRow = tableData[row]; + row++; + if (doesRowMatch(cw, matchingRow, rr)) { + return false; + } else { + cw.log(`Couldn't match row: ${JSON.stringify(rr, null, 2)}`); + return true; + } + }); + + expect(resultCopy).toHaveLength(0); +} diff --git a/packages/testing/src/world/index.ts b/packages/testing/src/world/index.ts new file mode 100644 index 000000000..f4794a3ad --- /dev/null +++ b/packages/testing/src/world/index.ts @@ -0,0 +1,5 @@ +import { World } from '@cucumber/cucumber'; + +export class PropsWorld extends World { + props: Record = {}; +} diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json new file mode 100644 index 000000000..54616824d --- /dev/null +++ b/packages/testing/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src" + ], + "outDir": "dist", + }, + "include": [ + "src" + ], + "exclude": [ + "test/**", + "dist/**" + ], + "references": [ + { + "path": "../fdc3-standard" + } + ] +} \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index a9a27828a..000000000 --- a/rollup.config.js +++ /dev/null @@ -1,167 +0,0 @@ -import typescript from "@rollup/plugin-typescript"; -import resolve, {DEFAULTS as RESOLVE_DEFAULTS} from '@rollup/plugin-node-resolve'; -import commonjs from "@rollup/plugin-commonjs"; -import json from "@rollup/plugin-json"; -import replace from "@rollup/plugin-replace"; -import terser from "@rollup/plugin-terser"; - -const devProdGlue = `if (process.env.NODE_ENV === 'production') { - module.exports = require('./fdc3.cjs.production.min.js'); -} else { - module.exports = require('./fdc3.cjs.development.js'); -}`; - -export default [ - - // Development CJS files - { - input: "src/index.ts", - - // Property inherited from TSDX. To understand what this is doing, see comments: - // https://github.com/jaredpalmer/tsdx/blob/master/src/createRollupConfig.ts#L77 - treeshake: { - propertyReadSideEffects: false - }, - - output: { - file: "dist/fdc3.cjs.development.js", - format: "cjs", - freeze: false, - esModule: true, - name: "@finos/fdc3", - sourcemap: true, - globals: { - react: "React", - "react-native": "ReactNative" - }, - exports: "named", - }, - - plugins: [ - resolve({ - mainFields: ['module', 'main', "browser"], - extensions: [...RESOLVE_DEFAULTS.extensions, '.cjs', '.mjs', '.jsx'], - }), - // all bundled external modules need to be converted from CJS to ESM - commonjs({ - // use a regex to make sure to include eventual hoisted packages - include: /\/regenerator-runtime\//, - }), - json(), - typescript(), - ] - }, - - // Production CJS files - { - input: "src/index.ts", - - // Property inherited from TSDX. To understand what this is doing, see comments: - // https://github.com/jaredpalmer/tsdx/blob/master/src/createRollupConfig.ts#L77 - treeshake: { - propertyReadSideEffects: false - }, - - output: { - file: "dist/fdc3.cjs.production.min.js", - format: "cjs", - freeze: false, - esModule: true, - name: "@finos/fdc3", - sourcemap: true, - globals: { - react: "React", - "react-native": "ReactNative" - }, - exports: "named", - }, - - plugins: [ - resolve({ - mainFields: ['module', 'main', "browser"], - extensions: [...RESOLVE_DEFAULTS.extensions, '.cjs', '.mjs', '.jsx'], - }), - // all bundled external modules need to be converted from CJS to ESM - commonjs({ - // use a regex to make sure to include eventual hoisted packages - include: /\/regenerator-runtime\//, - }), - json(), - typescript(), - replace({ - preventAssignment: true, - "process.env.NODE_ENV": "production" - }), - terser({ - output: { - comments: false - }, - compress: { - keep_infinity: true, - pure_getters: true, - passes: 10 - }, - ecma: 2020, - module: false, - toplevel: true, - warnings: true - }) - ] - }, - - // ESM files - { - input: "src/index.ts", - - // Property inherited from TSDX. To understand what this is doing, see comments: - // https://github.com/jaredpalmer/tsdx/blob/master/src/createRollupConfig.ts#L77 - treeshake: { - propertyReadSideEffects: false - }, - - output: { - file: "dist/fdc3.esm.js", - format: "esm", - freeze: false, - esModule: true, - name: "@finos/fdc3", - sourcemap: true, - globals: { - react: "React", - "react-native": "ReactNative" - }, - exports: "named", - }, - - plugins: [ - resolve({ - mainFields: ['module', 'main', "browser"], - extensions: [...RESOLVE_DEFAULTS.extensions, '.cjs', '.mjs', '.jsx'], - }), - // all bundled external modules need to be converted from CJS to ESM - commonjs({ - // use a regex to make sure to include eventual hoisted packages - include: /\/regenerator-runtime\//, - }), - json(), - typescript(), - ] - }, - - // Glue for Dev v Prod environments - { - input: "src/index.ts", // We don't use the input string, but rollup requires that an `input` be specified - output: { - file: "dist/index.js", - format: "cjs" // This adds `"use strict"` to the top of index.js - }, - plugins: [ - { - name: "dev-prod-glue", - load(){ - return devProdGlue; - } - } - ] - } -]; \ No newline at end of file diff --git a/schemas/api/t2sQuicktypeUtil.js b/schemas/api/t2sQuicktypeUtil.js deleted file mode 100644 index 54816c0e0..000000000 --- a/schemas/api/t2sQuicktypeUtil.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * SPDX-License-Identifier: Apache-2.0 - * Copyright FINOS FDC3 contributors - see NOTICE file - */ - -/** Utility for preparing arguments to quicktype, which workaround a specific - * quicktype bug in command line argument handling (where a directory is used - * as input the source language argument is ignored which causes our schemas - * to be interpreted as JSON input, rather than JSONSchema). - * Bug issue: - * */ - -const path = require('path'); -const fs = require('fs'); -const exec = require('child_process').exec; - -const args = process.argv.slice(2); -const outputPath = args.pop(); -const inputs = args; - -console.log('Inputs: ' + inputs.join(' | ')); -console.log('Output path argument: ' + outputPath); - -let source = ''; - -let dirIndex = 0; - -const excludedTypes = [ - 'DesktopAgent.ts', - 'Listener.ts', - 'Methods.ts', - 'PrivateChannel.ts', - 'Types.ts', - 'RecommendedChannels.ts', -]; - -let sources = ''; - -while (dirIndex < inputs.length) { - if (inputs[dirIndex].endsWith('.ts')) { - sources += `--src ${path.join(inputs[dirIndex])} `; - } else { - fs.readdirSync(inputs[dirIndex], { withFileTypes: true }).forEach(file => { - if (file.isDirectory()) { - inputs.push(path.join(inputs[dirIndex], file.name)); - } else { - if (!excludedTypes.includes(file.name)) { - sources += `--src ${path.join(inputs[dirIndex], file.name)} `; - } - } - }); - } - dirIndex++; -} - -// Normalise path to local quicktype executable. -const quicktypeExec = ['.', 'node_modules', '.bin', 'quicktype'].join(path.sep); - -const command = `${quicktypeExec} -l schema -o ${outputPath} ${sources}`; -console.log('command to run: ' + command); - -exec(command, function(error, stdout, stderr) { - if (stdout) { - console.log(stdout); - } - if (stderr) { - console.log(stderr); - } -}); diff --git a/src/api/BrowserTypes.ts b/src/api/BrowserTypes.ts deleted file mode 100644 index ecad63e15..000000000 --- a/src/api/BrowserTypes.ts +++ /dev/null @@ -1,5857 +0,0 @@ -// To parse this data: -// -// import { Convert, AddContextListenerRequest, AddContextListenerResponse, AddEventListenerRequest, AddEventListenerResponse, AddIntentListenerRequest, AddIntentListenerResponse, AgentEventMessage, AgentResponseMessage, AppRequestMessage, BroadcastEvent, BroadcastRequest, BroadcastResponse, ChannelChangedEvent, ContextListenerUnsubscribeRequest, ContextListenerUnsubscribeResponse, CreatePrivateChannelRequest, CreatePrivateChannelResponse, EventListenerUnsubscribeRequest, EventListenerUnsubscribeResponse, Fdc3UserInterfaceChannels, Fdc3UserInterfaceChannelSelected, Fdc3UserInterfaceDrag, Fdc3UserInterfaceHandshake, Fdc3UserInterfaceHello, Fdc3UserInterfaceMessage, Fdc3UserInterfaceResolve, Fdc3UserInterfaceResolveAction, Fdc3UserInterfaceRestyle, FindInstancesRequest, FindInstancesResponse, FindIntentRequest, FindIntentResponse, FindIntentsByContextRequest, FindIntentsByContextResponse, GetAppMetadataRequest, GetAppMetadataResponse, GetCurrentChannelRequest, GetCurrentChannelResponse, GetCurrentContextRequest, GetCurrentContextResponse, GetInfoRequest, GetInfoResponse, GetOrCreateChannelRequest, GetOrCreateChannelResponse, GetUserChannelsRequest, GetUserChannelsResponse, HeartbeatAcknowledgementRequest, HeartbeatEvent, IntentEvent, IntentListenerUnsubscribeRequest, IntentListenerUnsubscribeResponse, IntentResultRequest, IntentResultResponse, JoinUserChannelRequest, JoinUserChannelResponse, LeaveCurrentChannelRequest, LeaveCurrentChannelResponse, OpenRequest, OpenResponse, PrivateChannelAddEventListenerRequest, PrivateChannelAddEventListenerResponse, PrivateChannelDisconnectRequest, PrivateChannelDisconnectResponse, PrivateChannelOnAddContextListenerEvent, PrivateChannelOnDisconnectEvent, PrivateChannelOnUnsubscribeEvent, PrivateChannelUnsubscribeEventListenerRequest, PrivateChannelUnsubscribeEventListenerResponse, RaiseIntentForContextRequest, RaiseIntentForContextResponse, RaiseIntentRequest, RaiseIntentResponse, RaiseIntentResultResponse, WebConnectionProtocol1Hello, WebConnectionProtocol2LoadURL, WebConnectionProtocol3Handshake, WebConnectionProtocol4ValidateAppIdentity, WebConnectionProtocol5ValidateAppIdentityFailedResponse, WebConnectionProtocol5ValidateAppIdentitySuccessResponse, WebConnectionProtocol6Goodbye, WebConnectionProtocolMessage } from "./file"; -// -// const addContextListenerRequest = Convert.toAddContextListenerRequest(json); -// const addContextListenerResponse = Convert.toAddContextListenerResponse(json); -// const addEventListenerRequest = Convert.toAddEventListenerRequest(json); -// const addEventListenerResponse = Convert.toAddEventListenerResponse(json); -// const addIntentListenerRequest = Convert.toAddIntentListenerRequest(json); -// const addIntentListenerResponse = Convert.toAddIntentListenerResponse(json); -// const agentEventMessage = Convert.toAgentEventMessage(json); -// const agentResponseMessage = Convert.toAgentResponseMessage(json); -// const appRequestMessage = Convert.toAppRequestMessage(json); -// const broadcastEvent = Convert.toBroadcastEvent(json); -// const broadcastRequest = Convert.toBroadcastRequest(json); -// const broadcastResponse = Convert.toBroadcastResponse(json); -// const channelChangedEvent = Convert.toChannelChangedEvent(json); -// const contextListenerUnsubscribeRequest = Convert.toContextListenerUnsubscribeRequest(json); -// const contextListenerUnsubscribeResponse = Convert.toContextListenerUnsubscribeResponse(json); -// const createPrivateChannelRequest = Convert.toCreatePrivateChannelRequest(json); -// const createPrivateChannelResponse = Convert.toCreatePrivateChannelResponse(json); -// const eventListenerUnsubscribeRequest = Convert.toEventListenerUnsubscribeRequest(json); -// const eventListenerUnsubscribeResponse = Convert.toEventListenerUnsubscribeResponse(json); -// const fdc3UserInterfaceChannels = Convert.toFdc3UserInterfaceChannels(json); -// const fdc3UserInterfaceChannelSelected = Convert.toFdc3UserInterfaceChannelSelected(json); -// const fdc3UserInterfaceDrag = Convert.toFdc3UserInterfaceDrag(json); -// const fdc3UserInterfaceHandshake = Convert.toFdc3UserInterfaceHandshake(json); -// const fdc3UserInterfaceHello = Convert.toFdc3UserInterfaceHello(json); -// const fdc3UserInterfaceMessage = Convert.toFdc3UserInterfaceMessage(json); -// const fdc3UserInterfaceResolve = Convert.toFdc3UserInterfaceResolve(json); -// const fdc3UserInterfaceResolveAction = Convert.toFdc3UserInterfaceResolveAction(json); -// const fdc3UserInterfaceRestyle = Convert.toFdc3UserInterfaceRestyle(json); -// const findInstancesRequest = Convert.toFindInstancesRequest(json); -// const findInstancesResponse = Convert.toFindInstancesResponse(json); -// const findIntentRequest = Convert.toFindIntentRequest(json); -// const findIntentResponse = Convert.toFindIntentResponse(json); -// const findIntentsByContextRequest = Convert.toFindIntentsByContextRequest(json); -// const findIntentsByContextResponse = Convert.toFindIntentsByContextResponse(json); -// const getAppMetadataRequest = Convert.toGetAppMetadataRequest(json); -// const getAppMetadataResponse = Convert.toGetAppMetadataResponse(json); -// const getCurrentChannelRequest = Convert.toGetCurrentChannelRequest(json); -// const getCurrentChannelResponse = Convert.toGetCurrentChannelResponse(json); -// const getCurrentContextRequest = Convert.toGetCurrentContextRequest(json); -// const getCurrentContextResponse = Convert.toGetCurrentContextResponse(json); -// const getInfoRequest = Convert.toGetInfoRequest(json); -// const getInfoResponse = Convert.toGetInfoResponse(json); -// const getOrCreateChannelRequest = Convert.toGetOrCreateChannelRequest(json); -// const getOrCreateChannelResponse = Convert.toGetOrCreateChannelResponse(json); -// const getUserChannelsRequest = Convert.toGetUserChannelsRequest(json); -// const getUserChannelsResponse = Convert.toGetUserChannelsResponse(json); -// const heartbeatAcknowledgementRequest = Convert.toHeartbeatAcknowledgementRequest(json); -// const heartbeatEvent = Convert.toHeartbeatEvent(json); -// const intentEvent = Convert.toIntentEvent(json); -// const intentListenerUnsubscribeRequest = Convert.toIntentListenerUnsubscribeRequest(json); -// const intentListenerUnsubscribeResponse = Convert.toIntentListenerUnsubscribeResponse(json); -// const intentResultRequest = Convert.toIntentResultRequest(json); -// const intentResultResponse = Convert.toIntentResultResponse(json); -// const joinUserChannelRequest = Convert.toJoinUserChannelRequest(json); -// const joinUserChannelResponse = Convert.toJoinUserChannelResponse(json); -// const leaveCurrentChannelRequest = Convert.toLeaveCurrentChannelRequest(json); -// const leaveCurrentChannelResponse = Convert.toLeaveCurrentChannelResponse(json); -// const openRequest = Convert.toOpenRequest(json); -// const openResponse = Convert.toOpenResponse(json); -// const privateChannelAddEventListenerRequest = Convert.toPrivateChannelAddEventListenerRequest(json); -// const privateChannelAddEventListenerResponse = Convert.toPrivateChannelAddEventListenerResponse(json); -// const privateChannelDisconnectRequest = Convert.toPrivateChannelDisconnectRequest(json); -// const privateChannelDisconnectResponse = Convert.toPrivateChannelDisconnectResponse(json); -// const privateChannelOnAddContextListenerEvent = Convert.toPrivateChannelOnAddContextListenerEvent(json); -// const privateChannelOnDisconnectEvent = Convert.toPrivateChannelOnDisconnectEvent(json); -// const privateChannelOnUnsubscribeEvent = Convert.toPrivateChannelOnUnsubscribeEvent(json); -// const privateChannelUnsubscribeEventListenerRequest = Convert.toPrivateChannelUnsubscribeEventListenerRequest(json); -// const privateChannelUnsubscribeEventListenerResponse = Convert.toPrivateChannelUnsubscribeEventListenerResponse(json); -// const raiseIntentForContextRequest = Convert.toRaiseIntentForContextRequest(json); -// const raiseIntentForContextResponse = Convert.toRaiseIntentForContextResponse(json); -// const raiseIntentRequest = Convert.toRaiseIntentRequest(json); -// const raiseIntentResponse = Convert.toRaiseIntentResponse(json); -// const raiseIntentResultResponse = Convert.toRaiseIntentResultResponse(json); -// const webConnectionProtocol1Hello = Convert.toWebConnectionProtocol1Hello(json); -// const webConnectionProtocol2LoadURL = Convert.toWebConnectionProtocol2LoadURL(json); -// const webConnectionProtocol3Handshake = Convert.toWebConnectionProtocol3Handshake(json); -// const webConnectionProtocol4ValidateAppIdentity = Convert.toWebConnectionProtocol4ValidateAppIdentity(json); -// const webConnectionProtocol5ValidateAppIdentityFailedResponse = Convert.toWebConnectionProtocol5ValidateAppIdentityFailedResponse(json); -// const webConnectionProtocol5ValidateAppIdentitySuccessResponse = Convert.toWebConnectionProtocol5ValidateAppIdentitySuccessResponse(json); -// const webConnectionProtocol6Goodbye = Convert.toWebConnectionProtocol6Goodbye(json); -// const webConnectionProtocolMessage = Convert.toWebConnectionProtocolMessage(json); -// -// These functions will throw an error if the JSON doesn't -// match the expected interface, even if the JSON is valid. - -/** - * A request to add a context listener to a specified Channel OR to the current user - * channel. Where the listener is added to the current user channel (channelId == null), and - * this app has already been added to a user channel, client code should make a subsequent - * request to get the current context of that channel for this listener and then call its - * handler with it. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface AddContextListenerRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: AddContextListenerRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "addContextListenerRequest"; -} - -/** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ -export interface AddContextListenerRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that a request or response was received - * from. Please note that this may be set by an app or Desktop Agent proxy for debugging - * purposes but a Desktop Agent should make its own determination of the source of a message - * to avoid spoofing. - */ - source?: AppIdentifier; - timestamp: Date; -} - -/** - * Field that represents the source application that a request or response was received - * from. Please note that this may be set by an app or Desktop Agent proxy for debugging - * purposes but a Desktop Agent should make its own determination of the source of a message - * to avoid spoofing. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that the request being responded to was - * received from, for debugging purposes. - * - * Details of the application instance that broadcast the context. - * - * The App resolution option chosen. - * - * Details of the application instance that raised the intent. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppIdentifier { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface AddContextListenerRequestPayload { - /** - * The id of the channel to add the listener to or `null` indicating that it should listen - * to the current user channel (at the time of broadcast). - */ - channelId: null | string; - /** - * The type of context to listen for OR `null` indicating that it should listen to all - * context types. - */ - contextType: null | string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a addContextListener request. Where the listener was added to the current - * user channel (channelId == null), and this app has already been added to a user channel, - * client code should make a subsequent request to get the current context of that channel - * for this listener and then call its handler with it. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface AddContextListenerResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: AddContextListenerResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "addContextListenerResponse"; -} - -/** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ -export interface AddContextListenerResponseMeta { - requestUuid: string; - responseUuid: string; - /** - * Field that represents the source application that the request being responded to was - * received from, for debugging purposes. - */ - source?: AppIdentifier; - timestamp: Date; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface AddContextListenerResponsePayload { - error?: PurpleError; - listenerUUID?: string; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type PurpleError = "AccessDenied" | "CreationFailed" | "MalformedContext" | "NoChannelFound"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to add an event listener for a specified event type to the Desktop Agent. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface AddEventListenerRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: AddEventListenerRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "addEventListenerRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface AddEventListenerRequestPayload { - /** - * The type of the event to be listened to or `null` to listen to all event types. - */ - type: "USER_CHANNEL_CHANGED" | null; -} - -/** - * The type of a (non-context and non-intent) event that may be received via the FDC3 API's - * addEventListener function. - */ - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to an addEventListener request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface AddEventListenerResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: AddEventListenerResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "addEventListenerResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface AddEventListenerResponsePayload { - error?: ResponsePayloadError; - listenerUUID?: string; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type ResponsePayloadError = "AccessDenied" | "CreationFailed" | "MalformedContext" | "NoChannelFound" | "AppNotFound" | "AppTimeout" | "DesktopAgentNotFound" | "ErrorOnLaunch" | "ResolverUnavailable" | "IntentDeliveryFailed" | "NoAppsFound" | "ResolverTimeout" | "TargetAppUnavailable" | "TargetInstanceUnavailable" | "UserCancelledResolution" | "IntentHandlerRejected" | "NoResultReturned" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to add an Intent listener for a specified intent type. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface AddIntentListenerRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: AddIntentListenerRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "addIntentListenerRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface AddIntentListenerRequestPayload { - /** - * The name of the intent to listen for. - */ - intent: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a addIntentListener request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface AddIntentListenerResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: AddIntentListenerResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "addIntentListenerResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface AddIntentListenerResponsePayload { - error?: FluffyError; - listenerUUID?: string; - [property: string]: any; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type FluffyError = "MalformedContext" | "DesktopAgentNotFound" | "ResolverUnavailable" | "IntentDeliveryFailed" | "NoAppsFound" | "ResolverTimeout" | "TargetAppUnavailable" | "TargetInstanceUnavailable" | "UserCancelledResolution"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface AgentEventMessage { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: AgentEventMessageMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: EventMessageType; -} - -/** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ -export interface AgentEventMessageMeta { - eventUuid: string; - timestamp: Date; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ -export type EventMessageType = "addEventListenerEvent" | "broadcastEvent" | "channelChangedEvent" | "heartbeatEvent" | "intentEvent" | "privateChannelOnAddContextListenerEvent" | "privateChannelOnDisconnectEvent" | "privateChannelOnUnsubscribeEvent"; - -/** - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface AgentResponseMessage { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AgentResponseMessageMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: AgentResponseMessageResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: ResponseMessageType; -} - -/** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ -export interface AgentResponseMessageMeta { - requestUuid: string; - responseUuid: string; - /** - * Field that represents the source application that the request being responded to was - * received from, for debugging purposes. - */ - source?: AppIdentifier; - timestamp: Date; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface AgentResponseMessageResponsePayload { - error?: ResponsePayloadError; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ -export type ResponseMessageType = "addContextListenerResponse" | "addEventListenerResponse" | "addIntentListenerResponse" | "broadcastResponse" | "contextListenerUnsubscribeResponse" | "createPrivateChannelResponse" | "eventListenerUnsubscribeResponse" | "findInstancesResponse" | "findIntentResponse" | "findIntentsByContextResponse" | "getAppMetadataResponse" | "getCurrentChannelResponse" | "getCurrentContextResponse" | "getInfoResponse" | "getOrCreateChannelResponse" | "getUserChannelsResponse" | "intentListenerUnsubscribeResponse" | "intentResultResponse" | "joinUserChannelResponse" | "leaveCurrentChannelResponse" | "openResponse" | "privateChannelAddEventListenerResponse" | "privateChannelDisconnectResponse" | "privateChannelUnsubscribeEventListenerResponse" | "raiseIntentForContextResponse" | "raiseIntentResponse" | "raiseIntentResultResponse"; - -/** - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface AppRequestMessage { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AppRequestMessageMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: RequestMessageType; -} - -/** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ -export interface AppRequestMessageMeta { - requestUuid: string; - /** - * Field that represents the source application that a request or response was received - * from. Please note that this may be set by an app or Desktop Agent proxy for debugging - * purposes but a Desktop Agent should make its own determination of the source of a message - * to avoid spoofing. - */ - source?: AppIdentifier; - timestamp: Date; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ -export type RequestMessageType = "addContextListenerRequest" | "addEventListenerRequest" | "addIntentListenerRequest" | "broadcastRequest" | "contextListenerUnsubscribeRequest" | "createPrivateChannelRequest" | "eventListenerUnsubscribeRequest" | "findInstancesRequest" | "findIntentRequest" | "findIntentsByContextRequest" | "getAppMetadataRequest" | "getCurrentChannelRequest" | "getCurrentContextRequest" | "getInfoRequest" | "getOrCreateChannelRequest" | "getUserChannelsRequest" | "heartbeatAcknowledgementRequest" | "intentListenerUnsubscribeRequest" | "intentResultRequest" | "joinUserChannelRequest" | "leaveCurrentChannelRequest" | "openRequest" | "privateChannelAddEventListenerRequest" | "privateChannelDisconnectRequest" | "privateChannelUnsubscribeEventListenerRequest" | "raiseIntentForContextRequest" | "raiseIntentRequest"; - -/** - * An event message from the Desktop Agent to an app indicating that context has been - * broadcast on a channel it is listening to, or specifically to this app instance if it was - * launched via `fdc3.open` and context was passed. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface BroadcastEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: BroadcastEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "broadcastEvent"; -} - -/** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ -export interface BroadcastEventMeta { - eventUuid: string; - timestamp: Date; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface BroadcastEventPayload { - /** - * The Id of the channel that the broadcast was sent on. May be `null` if the context is - * being broadcast due to a call `fdc3.open` that passed context. - */ - channelId: null | string; - /** - * The context object that was broadcast. - */ - context: Context; - /** - * Details of the application instance that broadcast the context. - */ - originatingApp?: AppIdentifier; -} - -/** - * The context object that was broadcast. - * - * The context object that is to be broadcast. - * - * The context object passed with the raised intent. - * - * If a Context object is passed in, this object will be provided to the opened application - * via a contextListener. The Context argument is functionally equivalent to opening the - * target app with no context and broadcasting the context directly to it. - * - * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by - * FDC3 operations. As such, it is not really meant to be used on its own, but is imported - * by more specific type definitions (standardized or custom) to provide the structure and - * properties shared by all FDC3 context data types. - * - * The key element of FDC3 context types is their mandatory `type` property, which is used - * to identify what type of data the object represents, and what shape it has. - * - * The FDC3 context type, and all derived types, define the minimum set of fields a context - * data object of a particular type can be expected to have, but this can always be extended - * with custom fields as appropriate. - */ -export interface Context { - /** - * Context data objects may include a set of equivalent key-value pairs that can be used to - * help applications identify and look up the context type they receive in their own domain. - * The idea behind this design is that applications can provide as many equivalent - * identifiers to a target application as possible, e.g. an instrument may be represented by - * an ISIN, CUSIP or Bloomberg identifier. - * - * Identifiers do not make sense for all types of data, so the `id` property is therefore - * optional, but some derived types may choose to require at least one identifier. - * Identifier values SHOULD always be of type string. - */ - id?: { [key: string]: any }; - /** - * Context data objects may include a name property that can be used for more information, - * or display purposes. Some derived types may require the name object as mandatory, - * depending on use case. - */ - name?: string; - /** - * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 - * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present - * to route shared context data appropriately. - * - * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data - * types they support in an FDC3 [App - * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery - * and routing. - * - * Standardized FDC3 context types have well-known `type` properties prefixed with the - * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and - * used by a particular organization, the convention is to prefix them with an - * organization-specific namespace, e.g. `blackrock.fund`. - * - * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more - * information about context data types. - */ - type: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to broadcast context on a channel. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface BroadcastRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: BroadcastRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "broadcastRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface BroadcastRequestPayload { - /** - * The Id of the Channel that the broadcast was sent on. - */ - channelId: string; - /** - * The context object that is to be broadcast. - */ - context: Context; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a request to broadcast context on a channel. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface BroadcastResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "broadcastResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface BroadcastResponseResponsePayload { - error?: ResponsePayloadError; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * An event message from the Desktop Agent to an app indicating that its current user - * channel has changed. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface ChannelChangedEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: ChannelChangedEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "channelChangedEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface ChannelChangedEventPayload { - /** - * The Id of the channel that the app was added to or `null` if it was removed from a - * channel. - */ - newChannelId: null | string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to unsubscribe a context listener. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface ContextListenerUnsubscribeRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: ContextListenerUnsubscribeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "contextListenerUnsubscribeRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface ContextListenerUnsubscribeRequestPayload { - listenerUUID: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a contextListenerUnsubscribe request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface ContextListenerUnsubscribeResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "contextListenerUnsubscribeResponse"; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to return a Channel with an auto-generated identity that is intended for private - * communication between applications. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface CreatePrivateChannelRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: CreatePrivateChannelRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "createPrivateChannelRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface CreatePrivateChannelRequestPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a createPrivateChannel request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface CreatePrivateChannelResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: CreatePrivateChannelResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "createPrivateChannelResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface CreatePrivateChannelResponsePayload { - error?: PurpleError; - privateChannel?: Channel; -} - -/** - * Represents a context channel that applications can use to send and receive - * context data. - * - * Please note that There are differences in behavior when you interact with a - * User channel via the `DesktopAgent` interface and the `Channel` interface. - * Specifically, when 'joining' a User channel or adding a context listener - * when already joined to a channel via the `DesktopAgent` interface, existing - * context (matching the type of the context listener) on the channel is - * received by the context listener immediately. Whereas, when a context - * listener is added via the Channel interface, context is not received - * automatically, but may be retrieved manually via the `getCurrentContext()` - * function. - */ -export interface Channel { - /** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - */ - displayMetadata?: DisplayMetadata; - /** - * Constant that uniquely identifies this channel. - */ - id: string; - /** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". - */ - type: Type; -} - -/** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - * - * A system channel will be global enough to have a presence across many apps. This gives us - * some hints - * to render them in a standard way. It is assumed it may have other properties too, but if - * it has these, - * this is their meaning. - */ -export interface DisplayMetadata { - /** - * The color that should be associated within this channel when displaying this channel in a - * UI, e.g: `0xFF0000`. - */ - color?: string; - /** - * A URL of an image that can be used to display this channel. - */ - glyph?: string; - /** - * A user-readable name for this channel, e.g: `"Red"`. - */ - name?: string; -} - -/** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". - */ -export type Type = "app" | "private" | "user"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to unsubscribe an event listener. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface EventListenerUnsubscribeRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: EventListenerUnsubscribeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "eventListenerUnsubscribeRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface EventListenerUnsubscribeRequestPayload { - listenerUUID: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to an eventListenerUnsubscribe request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface EventListenerUnsubscribeResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "eventListenerUnsubscribeResponse"; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Setup message sent by the DA proxy code in getAgent() to a channel selector UI in an - * iframe with the channel definitions and current channel selection. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceChannels { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceChannelsPayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceChannels"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceChannelsPayload { - /** - * The id of the channel that should be currently selected, or `null` if none should be - * selected. - */ - selected: null | string; - /** - * User Channel definitions.```````s - */ - userChannels: Channel[]; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Message from a channel selector UI to the DA proxy sent when the channel selection - * changes. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceChannelSelected { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceChannelSelectedPayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceChannelSelected"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceChannelSelectedPayload { - /** - * The id of the channel that should be currently selected, or `null` if none should be - * selected. - */ - selected: null | string; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Message from a UI iframe to the DA proxy (setup by `getAgent()`) indicating that the user - * is dragging the UI to a new location and providing the offset to apply to the location. - * The DA proxy implementation should limit the location to the current bounds of the - * window's viewport. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceDrag { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceDragPayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceDrag"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceDragPayload { - /** - * The offset to move the frame by. - */ - mouseOffsets: MouseOffsets; -} - -/** - * The offset to move the frame by. - */ -export interface MouseOffsets { - x: number; - y: number; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Handshake message sent back to a user interface from the DA proxy code (setup by - * `getAgent()`) over the `MessagePort` provide in the preceding iFrameHello message, - * confirming that it is listening to the `MessagePort` for further communication. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceHandshake { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceHandshakePayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceHandshake"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceHandshakePayload { - /** - * The version of FDC3 API that the Desktop Agent will provide support for. - */ - fdc3Version: string; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Hello message sent by a UI to the Desktop Agent proxy setup by `getAgent()` to indicate - * it is ready to communicate, containing initial CSS to set on the iframe, and including an - * appended `MessagePort` to be used for further communication. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceHello { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceHelloPayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceHello"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceHelloPayload { - /** - * Details about the UI implementation, such as vendor and version, for logging purposes. - */ - implementationDetails: string; - /** - * A constrained set of styling properties that should be set on the user interface before - * it is displayed. Note `position` cannot be specified and should always be set to `fixed`. - */ - initialCSS: InitialCSS; -} - -/** - * A constrained set of styling properties that should be set on the user interface before - * it is displayed. Note `position` cannot be specified and should always be set to `fixed`. - */ -export interface InitialCSS { - /** - * The initial bottom property to apply to the iframe. - */ - bottom?: string; - /** - * The initial height of the iframe. - */ - height?: string; - /** - * The initial left property to apply to the iframe. - */ - left?: string; - /** - * The maximum height to apply to the iframe. - */ - maxHeight?: string; - /** - * The maximum with to apply to the iframe. - */ - maxWidth?: string; - /** - * The initial right property to apply to the iframe. - */ - right?: string; - /** - * The initial top property to apply to the iframe. - */ - top?: string; - /** - * The transition property to apply to the iframe. - */ - transition?: string; - /** - * The initial width of the iframe. - */ - width?: string; - /** - * The initial zindex to apply to the iframe. - */ - zIndex?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceMessage { - /** - * The message payload. - */ - payload?: { [key: string]: any }; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: Fdc3UserInterfaceMessageType; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ -export type Fdc3UserInterfaceMessageType = "Fdc3UserInterfaceHello" | "Fdc3UserInterfaceHandshake" | "Fdc3UserInterfaceRestyle" | "Fdc3UserInterfaceDrag" | "Fdc3UserInterfaceResolve" | "Fdc3UserInterfaceResolveAction" | "Fdc3UserInterfaceChannels" | "Fdc3UserInterfaceChannelSelected"; - -/** - * Setup message sent by the DA proxy code in getAgent() to an intent resolver UI with the - * resolver data to setup the UI. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceResolve { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceResolvePayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceResolve"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceResolvePayload { - /** - * An array of AppIntent objects defining the resolution options. - */ - appIntents: AppIntent[]; - context: Context; -} - -/** - * An interface that relates an intent to apps. - * - * Used if a raiseIntent request requires additional resolution (e.g. by showing an intent - * resolver) before it can be handled. - */ -export interface AppIntent { - /** - * Details of applications that can resolve the intent. - */ - apps: AppMetadata[]; - /** - * Details of the intent whose relationship to resolving applications is being described. - */ - intent: IntentMetadata; -} - -/** - * Extends an `AppIdentifier`, describing an application or instance of an application, with - * additional descriptive metadata that is usually provided by an FDC3 App Directory that - * the Desktop Agent connects to. - * - * The additional information from an app directory can aid in rendering UI elements, such - * as a launcher menu or resolver UI. This includes a title, description, tooltip and icon - * and screenshot URLs. - * - * Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the - * `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc. - * - * The calling application instance's own metadata, according to the Desktop Agent (MUST - * include at least the `appId` and `instanceId`). - */ -export interface AppMetadata { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * A longer, multi-paragraph description for the application that could include markup. - */ - description?: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent?: string; - /** - * A list of icon URLs for the application that can be used to render UI elements. - */ - icons?: Icon[]; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - /** - * An optional set of, implementation specific, metadata fields that can be used to - * disambiguate instances, such as a window title or screen position. Must only be set if - * `instanceId` is set. - */ - instanceMetadata?: { [key: string]: any }; - /** - * The 'friendly' app name. - * This field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now - * require an `AppIdentifier` wth `appId` set. - * Note that for display purposes the `title` field should be used, if set, in preference to - * this field. - */ - name?: string; - /** - * The type of output returned for any intent specified during resolution. May express a - * particular context type (e.g. "fdc3.instrument"), channel (e.g. "channel") or a channel - * that will receive a specified type (e.g. "channel"). - */ - resultType?: null | string; - /** - * Images representing the app in common usage scenarios that can be used to render UI - * elements. - */ - screenshots?: Image[]; - /** - * A more user-friendly application title that can be used to render UI elements. - */ - title?: string; - /** - * A tooltip for the application that can be used to render UI elements. - */ - tooltip?: string; - /** - * The Version of the application. - */ - version?: string; -} - -/** - * Describes an Icon image that may be used to represent the application. - */ -export interface Icon { - /** - * The icon dimension, formatted as `x`. - */ - size?: string; - /** - * The icon url. - */ - src: string; - /** - * Icon media type. If not present the Desktop Agent may use the src file extension. - */ - type?: string; -} - -/** - * Describes an image file, typically a screenshot, that often represents the application in - * a common usage scenario. - */ -export interface Image { - /** - * Caption for the image. - */ - label?: string; - /** - * The image dimension, formatted as `x`. - */ - size?: string; - /** - * The image url. - */ - src: string; - /** - * Image media type. If not present the Desktop Agent may use the src file extension. - */ - type?: string; -} - -/** - * Details of the intent whose relationship to resolving applications is being described. - * - * Metadata describing an Intent. - */ -export interface IntentMetadata { - /** - * Display name for the intent. - */ - displayName?: string; - /** - * The unique name of the intent that can be invoked by the raiseIntent call. - */ - name: string; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Message from an intent resolver UI to DA proxy code in getAgent() reporting a user - * action. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceResolveAction { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceResolveActionPayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceResolveAction"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceResolveActionPayload { - action: Action; - /** - * The App resolution option chosen. - */ - appIdentifier?: AppIdentifier; - /** - * The intent resolved. - */ - intent?: string; -} - -export type Action = "hover" | "click" | "cancel"; - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * Message from a UI frame to the DA proxy code (setup by `getAgent()`) with updated styling - * information to apply to it. Can be used to implement a pop-open or close interaction or - * other transition needed by a UI implementation. - * - * A message used to communicate with user interface frames injected by `getAgent()` for - * displaying UI elements such as the intent resolver or channel selector. Used for messages - * sent in either direction. - */ -export interface Fdc3UserInterfaceRestyle { - /** - * The message payload. - */ - payload: Fdc3UserInterfaceRestylePayload; - /** - * Identifies the type of the message to or from the user interface frame. - */ - type: "Fdc3UserInterfaceRestyle"; -} - -/** - * The message payload. - */ -export interface Fdc3UserInterfaceRestylePayload { - /** - * A constrained set of styling properties that should be applied to the frame. Note - * `position` cannot be set, and should always be `fixed`. - */ - updatedCSS: UpdatedCSS; -} - -/** - * A constrained set of styling properties that should be applied to the frame. Note - * `position` cannot be set, and should always be `fixed`. - */ -export interface UpdatedCSS { - /** - * The initial bottom property to apply to the iframe. - */ - bottom?: string; - /** - * The updated height of the iframe. - */ - height?: string; - /** - * The initial left property to apply to the iframe. - */ - left?: string; - /** - * The updated maximum height to apply to the iframe. - */ - maxHeight?: string; - /** - * The updated maximum with to apply to the iframe. - */ - maxWidth?: string; - /** - * The initial right property to apply to the iframe. - */ - right?: string; - /** - * The initial top property to apply to the iframe. - */ - top?: string; - /** - * The updated transition property to apply to the iframe. - */ - transition?: string; - /** - * The updated width of the iframe. - */ - width?: string; - /** - * The updated zIndex to apply to the iframe. - */ - zIndex?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message to or from the user interface frame. - */ - -/** - * A request for details of instances of a particular app. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface FindInstancesRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindInstancesRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findInstancesRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindInstancesRequestPayload { - app: AppIdentifier; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a findInstances request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface FindInstancesResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: FindInstancesResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findInstancesResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - * - * The message payload contains a flag indicating whether the API call was successful, plus - * any return values for the FDC3 API function called, or indicating that the request - * resulted in an error and including a standardized error message. - */ -export interface FindInstancesResponsePayload { - error?: FindInstancesErrors; - appIdentifiers?: AppMetadata[]; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - * - * Unique identifier for a `listener` object returned by a Desktop Agent to an app in - * response to addContextListener, addIntentListener or one of the PrivateChannel event - * listeners and used to identify it in messages (e.g. when unsubscribing). - * - * Unique identifier for an event message sent from a Desktop Agent to an app. - * - * Unique identifier for a for an attempt to connect to a Desktop Agent. A Unique UUID - * should be used in the first (WCP1Hello) message and should be quoted in all subsequent - * messages to link them to the same connection attempt. - * - * Should be set if the raiseIntent request returned an error. - */ -export type FindInstancesErrors = "MalformedContext" | "DesktopAgentNotFound" | "ResolverUnavailable" | "IntentDeliveryFailed" | "NoAppsFound" | "ResolverTimeout" | "TargetAppUnavailable" | "TargetInstanceUnavailable" | "UserCancelledResolution" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request for details of apps available to resolve a particular intent and context pair. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface FindIntentRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentRequestPayload { - context?: Context; - intent: string; - resultType?: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a findIntent request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface FindIntentResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: FindIntentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface FindIntentResponsePayload { - error?: FindInstancesErrors; - appIntent?: AppIntent; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request for details of intents and apps available to resolve them for a particular - * context. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface FindIntentsByContextRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentsByContextRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentsByContextRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentsByContextRequestPayload { - context: Context; - resultType?: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a findIntentsByContext request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface FindIntentsByContextResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: FindIntentsByContextResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentsByContextResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface FindIntentsByContextResponsePayload { - error?: FindInstancesErrors; - appIntents?: AppIntent[]; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request for metadata about an app. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetAppMetadataRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetAppMetadataRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getAppMetadataRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetAppMetadataRequestPayload { - app: AppIdentifier; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getAppMetadata request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetAppMetadataResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetAppMetadataResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getAppMetadataResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetAppMetadataResponsePayload { - error?: FindInstancesErrors; - appMetadata?: AppMetadata; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to return the Channel object for the current User channel membership. Returns - * `null` if the app is not joined to a channel. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetCurrentChannelRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetCurrentChannelRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getCurrentChannelRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetCurrentChannelRequestPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getCurrentChannel request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetCurrentChannelResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetCurrentChannelResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getCurrentChannelResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetCurrentChannelResponsePayload { - error?: ResponsePayloadError; - channel?: Channel | null; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to return the current context (either of a specified type or most recent - * broadcast) of a specified Channel. Returns `null` if no context (of the requested type if - * one was specified) is available in the channel. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetCurrentContextRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetCurrentContextRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getCurrentContextRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetCurrentContextRequestPayload { - /** - * The id of the channel to return the current context of. - */ - channelId: string; - /** - * The type of context to return for OR `null` indicating that the most recently broadcast - * context on the channel should be returned. - */ - contextType: null | string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getCurrentContext request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetCurrentContextResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetCurrentContextResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getCurrentContextResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetCurrentContextResponsePayload { - error?: PurpleError; - /** - * The most recently broadcast context object (of the specified type, if one was specified), - * or `null` if none was available in the channel. - */ - context?: null | Context; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to retrieve information about the FDC3 Desktop Agent implementation and the - * metadata of the calling application according to the Desktop Agent. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetInfoRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetInfoRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getInfoRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetInfoRequestPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getInfo request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetInfoResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetInfoResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getInfoResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetInfoResponsePayload { - error?: ResponsePayloadError; - implementationMetadata?: ImplementationMetadata; -} - -/** - * Implementation metadata for the Desktop Agent, which includes an appMetadata element - * containing a copy of the app's own metadata. - * - * Includes Metadata for the current application. - * - * Metadata relating to the FDC3 Desktop Agent implementation and its provider. - */ -export interface ImplementationMetadata { - /** - * The calling application instance's own metadata, according to the Desktop Agent (MUST - * include at least the `appId` and `instanceId`). - */ - appMetadata: AppMetadata; - /** - * The version number of the FDC3 specification that the implementation provides. - * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. - */ - fdc3Version: string; - /** - * Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. - */ - optionalFeatures: OptionalFeatures; - /** - * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, - * OpenFin etc.). - */ - provider: string; - /** - * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). - */ - providerVersion?: string; -} - -/** - * Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. - */ -export interface OptionalFeatures { - /** - * Used to indicate whether the experimental Desktop Agent Bridging - * feature is implemented by the Desktop Agent. - */ - DesktopAgentBridging: boolean; - /** - * Used to indicate whether the exposure of 'originating app metadata' for - * context and intent messages is supported by the Desktop Agent. - */ - OriginatingAppMetadata: boolean; - /** - * Used to indicate whether the optional `fdc3.joinUserChannel`, - * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by - * the Desktop Agent. - */ - UserChannelMembershipAPIs: boolean; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to return a Channel with an auto-generated identity that is intended for private - * communication between applications. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetOrCreateChannelRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetOrCreateChannelRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getOrCreateChannelRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetOrCreateChannelRequestPayload { - /** - * The id of the channel to return - */ - channelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getOrCreateChannel request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetOrCreateChannelResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetOrCreateChannelResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getOrCreateChannelResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetOrCreateChannelResponsePayload { - error?: PurpleError; - channel?: Channel; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to retrieve a list of the User Channels available for the app to join. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface GetUserChannelsRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetUserChannelsRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getUserChannelsRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetUserChannelsRequestPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a getUserChannels request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface GetUserChannelsResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: GetUserChannelsResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getUserChannelsResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface GetUserChannelsResponsePayload { - error?: PurpleError; - userChannels?: Channel[]; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request that serves as an acknowledgement of a heartbeat event from the Desktop Agent - * and indicates that an application window or frame is still alive. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface HeartbeatAcknowledgementRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: HeartbeatAcknowledgementRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "heartbeatAcknowledgementRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface HeartbeatAcknowledgementRequestPayload { - /** - * The eventUuid value of the HeartbeatEvent that the acknowledgement being sent relates to. - */ - heartbeatEventUuid: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A heartbeat message from the Desktop Agent to an app indicating that the Desktop Agent is - * alive and that the application should send a heartbeatResponseRequest to the agent in - * response. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface HeartbeatEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: HeartbeatEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "heartbeatEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface HeartbeatEventPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * An event message from the Desktop Agent to an app indicating that it has been selected to - * resolve a raised intent and context. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface IntentEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: IntentEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "intentEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface IntentEventPayload { - /** - * The context object passed with the raised intent. - */ - context: Context; - /** - * The intent that was raised. - */ - intent: string; - /** - * Details of the application instance that raised the intent. - */ - originatingApp?: AppIdentifier; - /** - * The requestUuid value of the raiseIntentRequest that the intentEvent being sent relates - * to. - */ - raiseIntentRequestUuid: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to unsubscribe a context listener. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface IntentListenerUnsubscribeRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: IntentListenerUnsubscribeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "intentListenerUnsubscribeRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface IntentListenerUnsubscribeRequestPayload { - listenerUUID: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a intentListenerUnsubscribe request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface IntentListenerUnsubscribeResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "intentListenerUnsubscribeResponse"; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to deliver a result for an intent (which may include a `void` result that just - * indicates that the handler has run, returning no result). The result is tied to the - * intentEvent it relates to by quoting the `eventUuid` of the intentEvent in its payload. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface IntentResultRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: IntentResultRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "intentResultRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface IntentResultRequestPayload { - /** - * The eventUuid value of the intentEvent that the result being sent relates to. - */ - intentEventUuid: string; - intentResult: IntentResult; - /** - * The requestUuid value of the raiseIntentRequest that the result being sent relates to. - */ - raiseIntentRequestUuid: string; -} - -export interface IntentResult { - context?: Context; - channel?: Channel; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a request to deliver an intent result. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface IntentResultResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "intentResultResponse"; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to join the app to the specified User channel. On successfully joining a channel, - * client code should make subsequent requests to get the current context of that channel - * for all registered context listeners and then call their handlers with it. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface JoinUserChannelRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: JoinUserChannelRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "joinUserChannelRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface JoinUserChannelRequestPayload { - /** - * The id of the channel to join. - */ - channelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a joinUserChannel request. On receipt of this response, client code should - * make subsequent requests to get the current context of that channel for all registered - * context listeners and then call their handlers with it. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface JoinUserChannelResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: JoinUserChannelResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "joinUserChannelResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface JoinUserChannelResponsePayload { - error?: PurpleError; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request to remove the app from any User channel membership. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface LeaveCurrentChannelRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: LeaveCurrentChannelRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "leaveCurrentChannelRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface LeaveCurrentChannelRequestPayload { -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a leaveCurrentChannel request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface LeaveCurrentChannelResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: LeaveCurrentChannelResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "leaveCurrentChannelResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface LeaveCurrentChannelResponsePayload { - error?: PurpleError; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to open an application. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface OpenRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: OpenRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "openRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface OpenRequestPayload { - app: AppIdentifier; - /** - * If a Context object is passed in, this object will be provided to the opened application - * via a contextListener. The Context argument is functionally equivalent to opening the - * target app with no context and broadcasting the context directly to it. - */ - context?: Context; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a open request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface OpenResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: OpenResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "openResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface OpenResponsePayload { - error?: OpenErrorResponsePayload; - appIdentifier?: AppIdentifier; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type OpenErrorResponsePayload = "MalformedContext" | "AppNotFound" | "AppTimeout" | "DesktopAgentNotFound" | "ErrorOnLaunch" | "ResolverUnavailable" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to add an event listener to a specific PrivateChannel. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface PrivateChannelAddEventListenerRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: TPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "privateChannelAddEventListenerRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface TPayload { - /** - * The type of PrivateChannel event that the listener should be applied to. - */ - listenerType: PrivateChannelEventListenerTypes | null; - /** - * The Id of the PrivateChannel that the listener should be added to. - */ - privateChannelId: string; -} - -/** - * Event listener type names for Private Channel events. - */ -export type PrivateChannelEventListenerTypes = "addContextListener" | "unsubscribe" | "disconnect"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a privateChannelAddEventListener request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface PrivateChannelAddEventListenerResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: PrivateChannelAddEventListenerResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelAddEventListenerResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface PrivateChannelAddEventListenerResponsePayload { - error?: PurpleError; - listenerUUID?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Request that indicates that a participant will no longer interact with a specified - * `PrivateChannel`. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface PrivateChannelDisconnectRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelDisconnectRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "privateChannelDisconnectRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelDisconnectRequestPayload { - /** - * The Id of the Channel that should be disconnected from - */ - channelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a privateChannelDisconnect request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface PrivateChannelDisconnectResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: PrivateChannelDisconnectResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelDisconnectResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface PrivateChannelDisconnectResponsePayload { - error?: PurpleError; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * An event message from the Desktop Agent to an app indicating that another app has added a - * context listener to a specific PrivateChannel. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface PrivateChannelOnAddContextListenerEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: PrivateChannelOnAddContextListenerEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelOnAddContextListenerEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface PrivateChannelOnAddContextListenerEventPayload { - /** - * The type of the context listener added to the channel by another app, or null if it will - * listen to all types. - */ - contextType: null | string; - /** - * The Id of the PrivateChannel that the listener was added to. - */ - privateChannelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * An event message from the Desktop Agent to an app indicating that another app has - * disconnected from a specific PrivateChannel and will no longer interact with it. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface PrivateChannelOnDisconnectEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: PrivateChannelOnDisconnectEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelOnDisconnectEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface PrivateChannelOnDisconnectEventPayload { - /** - * The Id of the PrivateChannel that the app has disconnected from. - */ - privateChannelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * An event message from the Desktop Agent to an app indicating that another app has - * unsubscribed a context listener from a specific PrivateChannel. - * - * A message from a Desktop Agent to an FDC3-enabled app representing an event. - */ -export interface PrivateChannelOnUnsubscribeEvent { - /** - * Metadata for messages sent by a Desktop Agent to an app notifying it of an event. - */ - meta: BroadcastEventMeta; - /** - * The message payload contains details of the event that the app is being notified about. - */ - payload: PrivateChannelOnUnsubscribeEventPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelOnUnsubscribeEvent"; -} - -/** - * The message payload contains details of the event that the app is being notified about. - */ -export interface PrivateChannelOnUnsubscribeEventPayload { - /** - * The type of the context listener unsubscribed from the channel by another app, or null if - * it was listening to all types. - */ - contextType: null | string; - /** - * The Id of the PrivateChannel that the listener was unsubscribed from. - */ - privateChannelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to unsubscribe a context listener. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface PrivateChannelUnsubscribeEventListenerRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelUnsubscribeEventListenerRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "privateChannelUnsubscribeEventListenerRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelUnsubscribeEventListenerRequestPayload { - listenerUUID: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a privateChannelUnsubscribeEventListener request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface PrivateChannelUnsubscribeEventListenerResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: BroadcastResponseResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "privateChannelUnsubscribeEventListenerResponse"; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to raise an unspecified intent for a specified context. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface RaiseIntentForContextRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: RaiseIntentForContextRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "raiseIntentForContextRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface RaiseIntentForContextRequestPayload { - app?: AppIdentifier; - context: Context; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a raiseIntentForContext request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface RaiseIntentForContextResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - * - * There are 3 possible responses to a raiseIntentForContext request, each of which sets a - * single property in the payload: Success (`intentResolution`), Needs further resolution - * (`appIntents`) or Error (`error`). - */ - payload: RaiseIntentForContextResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentForContextResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - * - * There are 3 possible responses to a raiseIntentForContext request, each of which sets a - * single property in the payload: Success (`intentResolution`), Needs further resolution - * (`appIntents`) or Error (`error`). - * - * Response to a raiseIntentForContext request that needs additional resolution (i.e. show - * an intent resolver UI). - * - * Used if a raiseIntent request resulted in an error. - */ -export interface RaiseIntentForContextResponsePayload { - /** - * Should be set if the raiseIntent request returned an error. - */ - error?: FindInstancesErrors; - /** - * Used if the raiseIntent request was successfully resolved. - */ - intentResolution?: IntentResolution; - /** - * Used if a raiseIntentForContext request requires additional resolution (e.g. by showing - * an intent resolver) before it can be handled. - */ - appIntents?: AppIntent[]; -} - -/** - * Used if the raiseIntent request was successfully resolved. - * - * IntentResolution provides a standard format for data returned upon resolving an intent. - * - * ```javascript - * //resolve a "Chain" type intent - * let resolution = await agent.raiseIntent("intentName", context); - * - * //resolve a "Client-Service" type intent with a data response or a Channel - * let resolution = await agent.raiseIntent("intentName", context); - * try { - * const result = await resolution.getResult(); - * if (result && result.broadcast) { - * console.log(`${resolution.source} returned a channel with id ${result.id}`); - * } else if (result){ - * console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`); - * } else { - * console.error(`${resolution.source} didn't return data` - * } - * } catch(error) { - * console.error(`${resolution.source} returned an error: ${error}`); - * } - * - * // Use metadata about the resolving app instance to target a further intent - * await agent.raiseIntent("intentName", context, resolution.source); - * ``` - */ -export interface IntentResolution { - /** - * The intent that was raised. May be used to determine which intent the user - * chose in response to `fdc3.raiseIntentForContext()`. - */ - intent: string; - /** - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ - source: AppIdentifier; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A request to raise an intent for a context. - * - * A request message from an FDC3-enabled app to a Desktop Agent. - */ -export interface RaiseIntentRequest { - /** - * Metadata for a request message sent by an FDC3-enabled app to a Desktop Agent. - */ - meta: AddContextListenerRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: RaiseIntentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "raiseIntentRequest"; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface RaiseIntentRequestPayload { - app?: AppIdentifier; - context: Context; - intent: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - -/** - * A response to a raiseIntent request. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface RaiseIntentResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - * - * There are 3 possible responses to a raiseIntent request, each of which sets a single - * property in the payload: Success (`intentResolution`), Needs further resolution - * (`appIntent`) or Error (`error`). - */ - payload: RaiseIntentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - * - * There are 3 possible responses to a raiseIntent request, each of which sets a single - * property in the payload: Success (`intentResolution`), Needs further resolution - * (`appIntent`) or Error (`error`). - * - * Response to a raiseIntent request that needs additional resolution (i.e. show an intent - * resolver UI). - * - * Used if a raiseIntent request resulted in an error. - */ -export interface RaiseIntentResponsePayload { - /** - * Should be set if the raiseIntent request returned an error. - */ - error?: FindInstancesErrors; - /** - * Used if the raiseIntent request was successfully resolved. - */ - intentResolution?: IntentResolution; - /** - * Used if a raiseIntent request requires additional resolution (e.g. by showing an intent - * resolver) before it can be handled. - */ - appIntent?: AppIntent; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * A secondary response to a request to raise an intent used to deliver the intent result. - * This message should quote the original requestUuid of the raiseIntentRequest message in - * its `meta.requestUuid` field. - * - * A message from a Desktop Agent to an FDC3-enabled app responding to an API call. If the - * payload contains an `error` property, the request was unsuccessful. - */ -export interface RaiseIntentResultResponse { - /** - * Metadata for messages sent by a Desktop Agent to an app in response to an API call. - */ - meta: AddContextListenerResponseMeta; - /** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ - payload: RaiseIntentResultResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResultResponse"; -} - -/** - * A payload for a response to an API call that will contain any return values or an `error` - * property containing a standardized error message indicating that the request was - * unsuccessful. - */ -export interface RaiseIntentResultResponsePayload { - error?: ResponsePayloadError; - intentResult?: IntentResult; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - -/** - * Hello message sent by an application to a parent window or frame when attempting to - * establish connectivity to a Desktop Agent. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol1Hello { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol1HelloPayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP1Hello"; -} - -/** - * Metadata for a Web Connection Protocol message. - */ -export interface WebConnectionProtocol1HelloMeta { - connectionAttemptUuid: string; - timestamp: Date; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol1HelloPayload { - /** - * The current URL of the page attempting to connect. This may differ from the identityUrl, - * but the origins MUST match. - */ - actualUrl: string; - /** - * A flag that may be used to indicate that a channel selector user interface is or is not - * required. Set to `false` if the app includes its own interface for selecting channels or - * does not work with user channels. - */ - channelSelector?: boolean; - /** - * The version of FDC3 API that the app supports. - */ - fdc3Version: string; - /** - * URL to use for the identity of the application. Desktop Agents MUST validate that the - * origin of the message matches the URL, but MAY implement custom comparison logic. - */ - identityUrl: string; - /** - * A flag that may be used to indicate that an intent resolver is or is not required. Set to - * `false` if no intents, or only targeted intents, are raised. - */ - intentResolver?: boolean; - [property: string]: any; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Response from a Desktop Agent to an application requesting access to it indicating that - * it should load a specified URL into a hidden iframe in order to establish connectivity to - * a Desktop Agent. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol2LoadURL { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol2LoadURLPayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP2LoadUrl"; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol2LoadURLPayload { - /** - * A URL which can be used to establish communication with the Desktop Agent, via loading - * the URL into an iframe and restarting the Web Connection protocol with the iframe as the - * target. - */ - iframeUrl: string; - [property: string]: any; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Handshake message sent by the Desktop Agent to the app (with a MessagePort appended) that - * should be used for subsequent communication steps. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol3Handshake { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol3HandshakePayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP3Handshake"; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol3HandshakePayload { - /** - * Indicates whether a channel selector user interface is required and the URL to use to do - * so. Set to `true` to use the default or `false` to disable the channel selector (as the - * Desktop Agent will handle it another way). - */ - channelSelectorUrl: boolean | string; - /** - * The version of FDC3 API that the Desktop Agent will provide support for. - */ - fdc3Version: string; - /** - * Indicates whether an intent resolver user interface is required and the URL to use to do - * so. Set to `true` to use the default or `false` to disable the intent resolver (as the - * Desktop Agent will handle it another way). - */ - intentResolverUrl: boolean | string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Identity Validation request from an app attempting to connect to a Desktop Agent. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol4ValidateAppIdentity { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol4ValidateAppIdentityPayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP4ValidateAppIdentity"; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol4ValidateAppIdentityPayload { - /** - * The current URL of the page attempting to connect. This may differ from the identityUrl, - * but the origins MUST match. - */ - actualUrl: string; - /** - * URL to use for the identity of the application. Desktop Agents MUST validate that the - * origin of the message matches the URL, but MAY implement custom comparison logic. - */ - identityUrl: string; - /** - * If an application has previously connected to the Desktop Agent, it may specify its prior - * instance id and associated instance UUID to request the same same instance Id be assigned. - */ - instanceId?: string; - /** - * Instance UUID associated with the requested instanceId. - */ - instanceUuid?: string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Message sent by the Desktop Agent to an app if their identity validation fails. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol5ValidateAppIdentityFailedResponse { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP5ValidateAppIdentityFailedResponse"; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload { - message?: string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Message sent by the Desktop Agent to an app after successful identity validation. - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol5ValidateAppIdentitySuccessResponse { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol1HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload; - /** - * Identifies the type of the connection step message. - */ - type: "WCP5ValidateAppIdentityResponse"; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload { - /** - * The appId that the app's identity was validated against. - */ - appId: string; - /** - * Implementation metadata for the Desktop Agent, which includes an appMetadata element - * containing a copy of the app's own metadata. - */ - implementationMetadata: ImplementationMetadata; - /** - * The instance Id granted to the application by the Desktop Agent. - */ - instanceId: string; - /** - * Instance UUID associated with the instanceId granted, which may be used to retrieve the - * same instanceId if the app is reloaded or navigates. - */ - instanceUuid: string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Goodbye message to be sent to the Desktop Agent when disconnecting (e.g. when closing the - * window or navigating). Desktop Agents should close the MessagePort after receiving this - * message, but retain instance details in case the application reconnects (e.g. after a - * navigation event). - * - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocol6Goodbye { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: WebConnectionProtocol6GoodbyeMeta; - /** - * Identifies the type of the connection step message. - */ - type: "WCP6Goodbye"; -} - -/** - * Metadata for a Web Connection Protocol message. - */ -export interface WebConnectionProtocol6GoodbyeMeta { - timestamp: Date; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * A message used during the connection flow for an application to a Desktop Agent in a - * browser window. Used for messages sent in either direction. - */ -export interface WebConnectionProtocolMessage { - /** - * Metadata for a Web Connection Protocol message. - */ - meta: ConnectionStepMetadata; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload?: { [key: string]: any }; - /** - * Identifies the type of the connection step message. - */ - type: ConnectionStepMessageType; -} - -/** - * Metadata for a Web Connection Protocol message. - */ -export interface ConnectionStepMetadata { - timestamp: Date; - connectionAttemptUuid?: string; -} - -/** - * Identifies the type of the connection step message. - */ -export type ConnectionStepMessageType = "WCP1Hello" | "WCP2LoadUrl" | "WCP3Handshake" | "WCP4ValidateAppIdentity" | "WCP5ValidateAppIdentityFailedResponse" | "WCP5ValidateAppIdentityResponse" | "WCP6Goodbye"; - -// Converts JSON strings to/from your types -// and asserts the results of JSON.parse at runtime -export class Convert { - public static toAddContextListenerRequest(json: string): AddContextListenerRequest { - return cast(JSON.parse(json), r("AddContextListenerRequest")); - } - - public static addContextListenerRequestToJson(value: AddContextListenerRequest): string { - return JSON.stringify(uncast(value, r("AddContextListenerRequest")), null, 2); - } - - public static toAddContextListenerResponse(json: string): AddContextListenerResponse { - return cast(JSON.parse(json), r("AddContextListenerResponse")); - } - - public static addContextListenerResponseToJson(value: AddContextListenerResponse): string { - return JSON.stringify(uncast(value, r("AddContextListenerResponse")), null, 2); - } - - public static toAddEventListenerRequest(json: string): AddEventListenerRequest { - return cast(JSON.parse(json), r("AddEventListenerRequest")); - } - - public static addEventListenerRequestToJson(value: AddEventListenerRequest): string { - return JSON.stringify(uncast(value, r("AddEventListenerRequest")), null, 2); - } - - public static toAddEventListenerResponse(json: string): AddEventListenerResponse { - return cast(JSON.parse(json), r("AddEventListenerResponse")); - } - - public static addEventListenerResponseToJson(value: AddEventListenerResponse): string { - return JSON.stringify(uncast(value, r("AddEventListenerResponse")), null, 2); - } - - public static toAddIntentListenerRequest(json: string): AddIntentListenerRequest { - return cast(JSON.parse(json), r("AddIntentListenerRequest")); - } - - public static addIntentListenerRequestToJson(value: AddIntentListenerRequest): string { - return JSON.stringify(uncast(value, r("AddIntentListenerRequest")), null, 2); - } - - public static toAddIntentListenerResponse(json: string): AddIntentListenerResponse { - return cast(JSON.parse(json), r("AddIntentListenerResponse")); - } - - public static addIntentListenerResponseToJson(value: AddIntentListenerResponse): string { - return JSON.stringify(uncast(value, r("AddIntentListenerResponse")), null, 2); - } - - public static toAgentEventMessage(json: string): AgentEventMessage { - return cast(JSON.parse(json), r("AgentEventMessage")); - } - - public static agentEventMessageToJson(value: AgentEventMessage): string { - return JSON.stringify(uncast(value, r("AgentEventMessage")), null, 2); - } - - public static toAgentResponseMessage(json: string): AgentResponseMessage { - return cast(JSON.parse(json), r("AgentResponseMessage")); - } - - public static agentResponseMessageToJson(value: AgentResponseMessage): string { - return JSON.stringify(uncast(value, r("AgentResponseMessage")), null, 2); - } - - public static toAppRequestMessage(json: string): AppRequestMessage { - return cast(JSON.parse(json), r("AppRequestMessage")); - } - - public static appRequestMessageToJson(value: AppRequestMessage): string { - return JSON.stringify(uncast(value, r("AppRequestMessage")), null, 2); - } - - public static toBroadcastEvent(json: string): BroadcastEvent { - return cast(JSON.parse(json), r("BroadcastEvent")); - } - - public static broadcastEventToJson(value: BroadcastEvent): string { - return JSON.stringify(uncast(value, r("BroadcastEvent")), null, 2); - } - - public static toBroadcastRequest(json: string): BroadcastRequest { - return cast(JSON.parse(json), r("BroadcastRequest")); - } - - public static broadcastRequestToJson(value: BroadcastRequest): string { - return JSON.stringify(uncast(value, r("BroadcastRequest")), null, 2); - } - - public static toBroadcastResponse(json: string): BroadcastResponse { - return cast(JSON.parse(json), r("BroadcastResponse")); - } - - public static broadcastResponseToJson(value: BroadcastResponse): string { - return JSON.stringify(uncast(value, r("BroadcastResponse")), null, 2); - } - - public static toChannelChangedEvent(json: string): ChannelChangedEvent { - return cast(JSON.parse(json), r("ChannelChangedEvent")); - } - - public static channelChangedEventToJson(value: ChannelChangedEvent): string { - return JSON.stringify(uncast(value, r("ChannelChangedEvent")), null, 2); - } - - public static toContextListenerUnsubscribeRequest(json: string): ContextListenerUnsubscribeRequest { - return cast(JSON.parse(json), r("ContextListenerUnsubscribeRequest")); - } - - public static contextListenerUnsubscribeRequestToJson(value: ContextListenerUnsubscribeRequest): string { - return JSON.stringify(uncast(value, r("ContextListenerUnsubscribeRequest")), null, 2); - } - - public static toContextListenerUnsubscribeResponse(json: string): ContextListenerUnsubscribeResponse { - return cast(JSON.parse(json), r("ContextListenerUnsubscribeResponse")); - } - - public static contextListenerUnsubscribeResponseToJson(value: ContextListenerUnsubscribeResponse): string { - return JSON.stringify(uncast(value, r("ContextListenerUnsubscribeResponse")), null, 2); - } - - public static toCreatePrivateChannelRequest(json: string): CreatePrivateChannelRequest { - return cast(JSON.parse(json), r("CreatePrivateChannelRequest")); - } - - public static createPrivateChannelRequestToJson(value: CreatePrivateChannelRequest): string { - return JSON.stringify(uncast(value, r("CreatePrivateChannelRequest")), null, 2); - } - - public static toCreatePrivateChannelResponse(json: string): CreatePrivateChannelResponse { - return cast(JSON.parse(json), r("CreatePrivateChannelResponse")); - } - - public static createPrivateChannelResponseToJson(value: CreatePrivateChannelResponse): string { - return JSON.stringify(uncast(value, r("CreatePrivateChannelResponse")), null, 2); - } - - public static toEventListenerUnsubscribeRequest(json: string): EventListenerUnsubscribeRequest { - return cast(JSON.parse(json), r("EventListenerUnsubscribeRequest")); - } - - public static eventListenerUnsubscribeRequestToJson(value: EventListenerUnsubscribeRequest): string { - return JSON.stringify(uncast(value, r("EventListenerUnsubscribeRequest")), null, 2); - } - - public static toEventListenerUnsubscribeResponse(json: string): EventListenerUnsubscribeResponse { - return cast(JSON.parse(json), r("EventListenerUnsubscribeResponse")); - } - - public static eventListenerUnsubscribeResponseToJson(value: EventListenerUnsubscribeResponse): string { - return JSON.stringify(uncast(value, r("EventListenerUnsubscribeResponse")), null, 2); - } - - public static toFdc3UserInterfaceChannels(json: string): Fdc3UserInterfaceChannels { - return cast(JSON.parse(json), r("Fdc3UserInterfaceChannels")); - } - - public static fdc3UserInterfaceChannelsToJson(value: Fdc3UserInterfaceChannels): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceChannels")), null, 2); - } - - public static toFdc3UserInterfaceChannelSelected(json: string): Fdc3UserInterfaceChannelSelected { - return cast(JSON.parse(json), r("Fdc3UserInterfaceChannelSelected")); - } - - public static fdc3UserInterfaceChannelSelectedToJson(value: Fdc3UserInterfaceChannelSelected): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceChannelSelected")), null, 2); - } - - public static toFdc3UserInterfaceDrag(json: string): Fdc3UserInterfaceDrag { - return cast(JSON.parse(json), r("Fdc3UserInterfaceDrag")); - } - - public static fdc3UserInterfaceDragToJson(value: Fdc3UserInterfaceDrag): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceDrag")), null, 2); - } - - public static toFdc3UserInterfaceHandshake(json: string): Fdc3UserInterfaceHandshake { - return cast(JSON.parse(json), r("Fdc3UserInterfaceHandshake")); - } - - public static fdc3UserInterfaceHandshakeToJson(value: Fdc3UserInterfaceHandshake): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceHandshake")), null, 2); - } - - public static toFdc3UserInterfaceHello(json: string): Fdc3UserInterfaceHello { - return cast(JSON.parse(json), r("Fdc3UserInterfaceHello")); - } - - public static fdc3UserInterfaceHelloToJson(value: Fdc3UserInterfaceHello): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceHello")), null, 2); - } - - public static toFdc3UserInterfaceMessage(json: string): Fdc3UserInterfaceMessage { - return cast(JSON.parse(json), r("Fdc3UserInterfaceMessage")); - } - - public static fdc3UserInterfaceMessageToJson(value: Fdc3UserInterfaceMessage): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceMessage")), null, 2); - } - - public static toFdc3UserInterfaceResolve(json: string): Fdc3UserInterfaceResolve { - return cast(JSON.parse(json), r("Fdc3UserInterfaceResolve")); - } - - public static fdc3UserInterfaceResolveToJson(value: Fdc3UserInterfaceResolve): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceResolve")), null, 2); - } - - public static toFdc3UserInterfaceResolveAction(json: string): Fdc3UserInterfaceResolveAction { - return cast(JSON.parse(json), r("Fdc3UserInterfaceResolveAction")); - } - - public static fdc3UserInterfaceResolveActionToJson(value: Fdc3UserInterfaceResolveAction): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceResolveAction")), null, 2); - } - - public static toFdc3UserInterfaceRestyle(json: string): Fdc3UserInterfaceRestyle { - return cast(JSON.parse(json), r("Fdc3UserInterfaceRestyle")); - } - - public static fdc3UserInterfaceRestyleToJson(value: Fdc3UserInterfaceRestyle): string { - return JSON.stringify(uncast(value, r("Fdc3UserInterfaceRestyle")), null, 2); - } - - public static toFindInstancesRequest(json: string): FindInstancesRequest { - return cast(JSON.parse(json), r("FindInstancesRequest")); - } - - public static findInstancesRequestToJson(value: FindInstancesRequest): string { - return JSON.stringify(uncast(value, r("FindInstancesRequest")), null, 2); - } - - public static toFindInstancesResponse(json: string): FindInstancesResponse { - return cast(JSON.parse(json), r("FindInstancesResponse")); - } - - public static findInstancesResponseToJson(value: FindInstancesResponse): string { - return JSON.stringify(uncast(value, r("FindInstancesResponse")), null, 2); - } - - public static toFindIntentRequest(json: string): FindIntentRequest { - return cast(JSON.parse(json), r("FindIntentRequest")); - } - - public static findIntentRequestToJson(value: FindIntentRequest): string { - return JSON.stringify(uncast(value, r("FindIntentRequest")), null, 2); - } - - public static toFindIntentResponse(json: string): FindIntentResponse { - return cast(JSON.parse(json), r("FindIntentResponse")); - } - - public static findIntentResponseToJson(value: FindIntentResponse): string { - return JSON.stringify(uncast(value, r("FindIntentResponse")), null, 2); - } - - public static toFindIntentsByContextRequest(json: string): FindIntentsByContextRequest { - return cast(JSON.parse(json), r("FindIntentsByContextRequest")); - } - - public static findIntentsByContextRequestToJson(value: FindIntentsByContextRequest): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextRequest")), null, 2); - } - - public static toFindIntentsByContextResponse(json: string): FindIntentsByContextResponse { - return cast(JSON.parse(json), r("FindIntentsByContextResponse")); - } - - public static findIntentsByContextResponseToJson(value: FindIntentsByContextResponse): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextResponse")), null, 2); - } - - public static toGetAppMetadataRequest(json: string): GetAppMetadataRequest { - return cast(JSON.parse(json), r("GetAppMetadataRequest")); - } - - public static getAppMetadataRequestToJson(value: GetAppMetadataRequest): string { - return JSON.stringify(uncast(value, r("GetAppMetadataRequest")), null, 2); - } - - public static toGetAppMetadataResponse(json: string): GetAppMetadataResponse { - return cast(JSON.parse(json), r("GetAppMetadataResponse")); - } - - public static getAppMetadataResponseToJson(value: GetAppMetadataResponse): string { - return JSON.stringify(uncast(value, r("GetAppMetadataResponse")), null, 2); - } - - public static toGetCurrentChannelRequest(json: string): GetCurrentChannelRequest { - return cast(JSON.parse(json), r("GetCurrentChannelRequest")); - } - - public static getCurrentChannelRequestToJson(value: GetCurrentChannelRequest): string { - return JSON.stringify(uncast(value, r("GetCurrentChannelRequest")), null, 2); - } - - public static toGetCurrentChannelResponse(json: string): GetCurrentChannelResponse { - return cast(JSON.parse(json), r("GetCurrentChannelResponse")); - } - - public static getCurrentChannelResponseToJson(value: GetCurrentChannelResponse): string { - return JSON.stringify(uncast(value, r("GetCurrentChannelResponse")), null, 2); - } - - public static toGetCurrentContextRequest(json: string): GetCurrentContextRequest { - return cast(JSON.parse(json), r("GetCurrentContextRequest")); - } - - public static getCurrentContextRequestToJson(value: GetCurrentContextRequest): string { - return JSON.stringify(uncast(value, r("GetCurrentContextRequest")), null, 2); - } - - public static toGetCurrentContextResponse(json: string): GetCurrentContextResponse { - return cast(JSON.parse(json), r("GetCurrentContextResponse")); - } - - public static getCurrentContextResponseToJson(value: GetCurrentContextResponse): string { - return JSON.stringify(uncast(value, r("GetCurrentContextResponse")), null, 2); - } - - public static toGetInfoRequest(json: string): GetInfoRequest { - return cast(JSON.parse(json), r("GetInfoRequest")); - } - - public static getInfoRequestToJson(value: GetInfoRequest): string { - return JSON.stringify(uncast(value, r("GetInfoRequest")), null, 2); - } - - public static toGetInfoResponse(json: string): GetInfoResponse { - return cast(JSON.parse(json), r("GetInfoResponse")); - } - - public static getInfoResponseToJson(value: GetInfoResponse): string { - return JSON.stringify(uncast(value, r("GetInfoResponse")), null, 2); - } - - public static toGetOrCreateChannelRequest(json: string): GetOrCreateChannelRequest { - return cast(JSON.parse(json), r("GetOrCreateChannelRequest")); - } - - public static getOrCreateChannelRequestToJson(value: GetOrCreateChannelRequest): string { - return JSON.stringify(uncast(value, r("GetOrCreateChannelRequest")), null, 2); - } - - public static toGetOrCreateChannelResponse(json: string): GetOrCreateChannelResponse { - return cast(JSON.parse(json), r("GetOrCreateChannelResponse")); - } - - public static getOrCreateChannelResponseToJson(value: GetOrCreateChannelResponse): string { - return JSON.stringify(uncast(value, r("GetOrCreateChannelResponse")), null, 2); - } - - public static toGetUserChannelsRequest(json: string): GetUserChannelsRequest { - return cast(JSON.parse(json), r("GetUserChannelsRequest")); - } - - public static getUserChannelsRequestToJson(value: GetUserChannelsRequest): string { - return JSON.stringify(uncast(value, r("GetUserChannelsRequest")), null, 2); - } - - public static toGetUserChannelsResponse(json: string): GetUserChannelsResponse { - return cast(JSON.parse(json), r("GetUserChannelsResponse")); - } - - public static getUserChannelsResponseToJson(value: GetUserChannelsResponse): string { - return JSON.stringify(uncast(value, r("GetUserChannelsResponse")), null, 2); - } - - public static toHeartbeatAcknowledgementRequest(json: string): HeartbeatAcknowledgementRequest { - return cast(JSON.parse(json), r("HeartbeatAcknowledgementRequest")); - } - - public static heartbeatAcknowledgementRequestToJson(value: HeartbeatAcknowledgementRequest): string { - return JSON.stringify(uncast(value, r("HeartbeatAcknowledgementRequest")), null, 2); - } - - public static toHeartbeatEvent(json: string): HeartbeatEvent { - return cast(JSON.parse(json), r("HeartbeatEvent")); - } - - public static heartbeatEventToJson(value: HeartbeatEvent): string { - return JSON.stringify(uncast(value, r("HeartbeatEvent")), null, 2); - } - - public static toIntentEvent(json: string): IntentEvent { - return cast(JSON.parse(json), r("IntentEvent")); - } - - public static intentEventToJson(value: IntentEvent): string { - return JSON.stringify(uncast(value, r("IntentEvent")), null, 2); - } - - public static toIntentListenerUnsubscribeRequest(json: string): IntentListenerUnsubscribeRequest { - return cast(JSON.parse(json), r("IntentListenerUnsubscribeRequest")); - } - - public static intentListenerUnsubscribeRequestToJson(value: IntentListenerUnsubscribeRequest): string { - return JSON.stringify(uncast(value, r("IntentListenerUnsubscribeRequest")), null, 2); - } - - public static toIntentListenerUnsubscribeResponse(json: string): IntentListenerUnsubscribeResponse { - return cast(JSON.parse(json), r("IntentListenerUnsubscribeResponse")); - } - - public static intentListenerUnsubscribeResponseToJson(value: IntentListenerUnsubscribeResponse): string { - return JSON.stringify(uncast(value, r("IntentListenerUnsubscribeResponse")), null, 2); - } - - public static toIntentResultRequest(json: string): IntentResultRequest { - return cast(JSON.parse(json), r("IntentResultRequest")); - } - - public static intentResultRequestToJson(value: IntentResultRequest): string { - return JSON.stringify(uncast(value, r("IntentResultRequest")), null, 2); - } - - public static toIntentResultResponse(json: string): IntentResultResponse { - return cast(JSON.parse(json), r("IntentResultResponse")); - } - - public static intentResultResponseToJson(value: IntentResultResponse): string { - return JSON.stringify(uncast(value, r("IntentResultResponse")), null, 2); - } - - public static toJoinUserChannelRequest(json: string): JoinUserChannelRequest { - return cast(JSON.parse(json), r("JoinUserChannelRequest")); - } - - public static joinUserChannelRequestToJson(value: JoinUserChannelRequest): string { - return JSON.stringify(uncast(value, r("JoinUserChannelRequest")), null, 2); - } - - public static toJoinUserChannelResponse(json: string): JoinUserChannelResponse { - return cast(JSON.parse(json), r("JoinUserChannelResponse")); - } - - public static joinUserChannelResponseToJson(value: JoinUserChannelResponse): string { - return JSON.stringify(uncast(value, r("JoinUserChannelResponse")), null, 2); - } - - public static toLeaveCurrentChannelRequest(json: string): LeaveCurrentChannelRequest { - return cast(JSON.parse(json), r("LeaveCurrentChannelRequest")); - } - - public static leaveCurrentChannelRequestToJson(value: LeaveCurrentChannelRequest): string { - return JSON.stringify(uncast(value, r("LeaveCurrentChannelRequest")), null, 2); - } - - public static toLeaveCurrentChannelResponse(json: string): LeaveCurrentChannelResponse { - return cast(JSON.parse(json), r("LeaveCurrentChannelResponse")); - } - - public static leaveCurrentChannelResponseToJson(value: LeaveCurrentChannelResponse): string { - return JSON.stringify(uncast(value, r("LeaveCurrentChannelResponse")), null, 2); - } - - public static toOpenRequest(json: string): OpenRequest { - return cast(JSON.parse(json), r("OpenRequest")); - } - - public static openRequestToJson(value: OpenRequest): string { - return JSON.stringify(uncast(value, r("OpenRequest")), null, 2); - } - - public static toOpenResponse(json: string): OpenResponse { - return cast(JSON.parse(json), r("OpenResponse")); - } - - public static openResponseToJson(value: OpenResponse): string { - return JSON.stringify(uncast(value, r("OpenResponse")), null, 2); - } - - public static toPrivateChannelAddEventListenerRequest(json: string): PrivateChannelAddEventListenerRequest { - return cast(JSON.parse(json), r("PrivateChannelAddEventListenerRequest")); - } - - public static privateChannelAddEventListenerRequestToJson(value: PrivateChannelAddEventListenerRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelAddEventListenerRequest")), null, 2); - } - - public static toPrivateChannelAddEventListenerResponse(json: string): PrivateChannelAddEventListenerResponse { - return cast(JSON.parse(json), r("PrivateChannelAddEventListenerResponse")); - } - - public static privateChannelAddEventListenerResponseToJson(value: PrivateChannelAddEventListenerResponse): string { - return JSON.stringify(uncast(value, r("PrivateChannelAddEventListenerResponse")), null, 2); - } - - public static toPrivateChannelDisconnectRequest(json: string): PrivateChannelDisconnectRequest { - return cast(JSON.parse(json), r("PrivateChannelDisconnectRequest")); - } - - public static privateChannelDisconnectRequestToJson(value: PrivateChannelDisconnectRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelDisconnectRequest")), null, 2); - } - - public static toPrivateChannelDisconnectResponse(json: string): PrivateChannelDisconnectResponse { - return cast(JSON.parse(json), r("PrivateChannelDisconnectResponse")); - } - - public static privateChannelDisconnectResponseToJson(value: PrivateChannelDisconnectResponse): string { - return JSON.stringify(uncast(value, r("PrivateChannelDisconnectResponse")), null, 2); - } - - public static toPrivateChannelOnAddContextListenerEvent(json: string): PrivateChannelOnAddContextListenerEvent { - return cast(JSON.parse(json), r("PrivateChannelOnAddContextListenerEvent")); - } - - public static privateChannelOnAddContextListenerEventToJson(value: PrivateChannelOnAddContextListenerEvent): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnAddContextListenerEvent")), null, 2); - } - - public static toPrivateChannelOnDisconnectEvent(json: string): PrivateChannelOnDisconnectEvent { - return cast(JSON.parse(json), r("PrivateChannelOnDisconnectEvent")); - } - - public static privateChannelOnDisconnectEventToJson(value: PrivateChannelOnDisconnectEvent): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnDisconnectEvent")), null, 2); - } - - public static toPrivateChannelOnUnsubscribeEvent(json: string): PrivateChannelOnUnsubscribeEvent { - return cast(JSON.parse(json), r("PrivateChannelOnUnsubscribeEvent")); - } - - public static privateChannelOnUnsubscribeEventToJson(value: PrivateChannelOnUnsubscribeEvent): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnUnsubscribeEvent")), null, 2); - } - - public static toPrivateChannelUnsubscribeEventListenerRequest(json: string): PrivateChannelUnsubscribeEventListenerRequest { - return cast(JSON.parse(json), r("PrivateChannelUnsubscribeEventListenerRequest")); - } - - public static privateChannelUnsubscribeEventListenerRequestToJson(value: PrivateChannelUnsubscribeEventListenerRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelUnsubscribeEventListenerRequest")), null, 2); - } - - public static toPrivateChannelUnsubscribeEventListenerResponse(json: string): PrivateChannelUnsubscribeEventListenerResponse { - return cast(JSON.parse(json), r("PrivateChannelUnsubscribeEventListenerResponse")); - } - - public static privateChannelUnsubscribeEventListenerResponseToJson(value: PrivateChannelUnsubscribeEventListenerResponse): string { - return JSON.stringify(uncast(value, r("PrivateChannelUnsubscribeEventListenerResponse")), null, 2); - } - - public static toRaiseIntentForContextRequest(json: string): RaiseIntentForContextRequest { - return cast(JSON.parse(json), r("RaiseIntentForContextRequest")); - } - - public static raiseIntentForContextRequestToJson(value: RaiseIntentForContextRequest): string { - return JSON.stringify(uncast(value, r("RaiseIntentForContextRequest")), null, 2); - } - - public static toRaiseIntentForContextResponse(json: string): RaiseIntentForContextResponse { - return cast(JSON.parse(json), r("RaiseIntentForContextResponse")); - } - - public static raiseIntentForContextResponseToJson(value: RaiseIntentForContextResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentForContextResponse")), null, 2); - } - - public static toRaiseIntentRequest(json: string): RaiseIntentRequest { - return cast(JSON.parse(json), r("RaiseIntentRequest")); - } - - public static raiseIntentRequestToJson(value: RaiseIntentRequest): string { - return JSON.stringify(uncast(value, r("RaiseIntentRequest")), null, 2); - } - - public static toRaiseIntentResponse(json: string): RaiseIntentResponse { - return cast(JSON.parse(json), r("RaiseIntentResponse")); - } - - public static raiseIntentResponseToJson(value: RaiseIntentResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResponse")), null, 2); - } - - public static toRaiseIntentResultResponse(json: string): RaiseIntentResultResponse { - return cast(JSON.parse(json), r("RaiseIntentResultResponse")); - } - - public static raiseIntentResultResponseToJson(value: RaiseIntentResultResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResultResponse")), null, 2); - } - - public static toWebConnectionProtocol1Hello(json: string): WebConnectionProtocol1Hello { - return cast(JSON.parse(json), r("WebConnectionProtocol1Hello")); - } - - public static webConnectionProtocol1HelloToJson(value: WebConnectionProtocol1Hello): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol1Hello")), null, 2); - } - - public static toWebConnectionProtocol2LoadURL(json: string): WebConnectionProtocol2LoadURL { - return cast(JSON.parse(json), r("WebConnectionProtocol2LoadURL")); - } - - public static webConnectionProtocol2LoadURLToJson(value: WebConnectionProtocol2LoadURL): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol2LoadURL")), null, 2); - } - - public static toWebConnectionProtocol3Handshake(json: string): WebConnectionProtocol3Handshake { - return cast(JSON.parse(json), r("WebConnectionProtocol3Handshake")); - } - - public static webConnectionProtocol3HandshakeToJson(value: WebConnectionProtocol3Handshake): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol3Handshake")), null, 2); - } - - public static toWebConnectionProtocol4ValidateAppIdentity(json: string): WebConnectionProtocol4ValidateAppIdentity { - return cast(JSON.parse(json), r("WebConnectionProtocol4ValidateAppIdentity")); - } - - public static webConnectionProtocol4ValidateAppIdentityToJson(value: WebConnectionProtocol4ValidateAppIdentity): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol4ValidateAppIdentity")), null, 2); - } - - public static toWebConnectionProtocol5ValidateAppIdentityFailedResponse(json: string): WebConnectionProtocol5ValidateAppIdentityFailedResponse { - return cast(JSON.parse(json), r("WebConnectionProtocol5ValidateAppIdentityFailedResponse")); - } - - public static webConnectionProtocol5ValidateAppIdentityFailedResponseToJson(value: WebConnectionProtocol5ValidateAppIdentityFailedResponse): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol5ValidateAppIdentityFailedResponse")), null, 2); - } - - public static toWebConnectionProtocol5ValidateAppIdentitySuccessResponse(json: string): WebConnectionProtocol5ValidateAppIdentitySuccessResponse { - return cast(JSON.parse(json), r("WebConnectionProtocol5ValidateAppIdentitySuccessResponse")); - } - - public static webConnectionProtocol5ValidateAppIdentitySuccessResponseToJson(value: WebConnectionProtocol5ValidateAppIdentitySuccessResponse): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol5ValidateAppIdentitySuccessResponse")), null, 2); - } - - public static toWebConnectionProtocol6Goodbye(json: string): WebConnectionProtocol6Goodbye { - return cast(JSON.parse(json), r("WebConnectionProtocol6Goodbye")); - } - - public static webConnectionProtocol6GoodbyeToJson(value: WebConnectionProtocol6Goodbye): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocol6Goodbye")), null, 2); - } - - public static toWebConnectionProtocolMessage(json: string): WebConnectionProtocolMessage { - return cast(JSON.parse(json), r("WebConnectionProtocolMessage")); - } - - public static webConnectionProtocolMessageToJson(value: WebConnectionProtocolMessage): string { - return JSON.stringify(uncast(value, r("WebConnectionProtocolMessage")), null, 2); - } -} - -function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { - const prettyTyp = prettyTypeName(typ); - const parentText = parent ? ` on ${parent}` : ''; - const keyText = key ? ` for key "${key}"` : ''; - throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); -} - -function prettyTypeName(typ: any): string { - if (Array.isArray(typ)) { - if (typ.length === 2 && typ[0] === undefined) { - return `an optional ${prettyTypeName(typ[1])}`; - } else { - return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`; - } - } else if (typeof typ === "object" && typ.literal !== undefined) { - return typ.literal; - } else { - return typeof typ; - } -} - -function jsonToJSProps(typ: any): any { - if (typ.jsonToJS === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ }); - typ.jsonToJS = map; - } - return typ.jsonToJS; -} - -function jsToJSONProps(typ: any): any { - if (typ.jsToJSON === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ }); - typ.jsToJSON = map; - } - return typ.jsToJSON; -} - -function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { - function transformPrimitive(typ: string, val: any): any { - if (typeof typ === typeof val) return val; - return invalidValue(typ, val, key, parent); - } - - function transformUnion(typs: any[], val: any): any { - // val must validate against one typ in typs - const l = typs.length; - for (let i = 0; i < l; i++) { - const typ = typs[i]; - try { - return transform(val, typ, getProps); - } catch (_) {} - } - return invalidValue(typs, val, key, parent); - } - - function transformEnum(cases: string[], val: any): any { - if (cases.indexOf(val) !== -1) return val; - return invalidValue(cases.map(a => { return l(a); }), val, key, parent); - } - - function transformArray(typ: any, val: any): any { - // val must be an array with no invalid elements - if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent); - return val.map(el => transform(el, typ, getProps)); - } - - function transformDate(val: any): any { - if (val === null) { - return null; - } - const d = new Date(val); - if (isNaN(d.valueOf())) { - return invalidValue(l("Date"), val, key, parent); - } - return d; - } - - function transformObject(props: { [k: string]: any }, additional: any, val: any): any { - if (val === null || typeof val !== "object" || Array.isArray(val)) { - return invalidValue(l(ref || "object"), val, key, parent); - } - const result: any = {}; - Object.getOwnPropertyNames(props).forEach(key => { - const prop = props[key]; - const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; - result[prop.key] = transform(v, prop.typ, getProps, key, ref); - }); - Object.getOwnPropertyNames(val).forEach(key => { - if (!Object.prototype.hasOwnProperty.call(props, key)) { - result[key] = transform(val[key], additional, getProps, key, ref); - } - }); - return result; - } - - if (typ === "any") return val; - if (typ === null) { - if (val === null) return val; - return invalidValue(typ, val, key, parent); - } - if (typ === false) return invalidValue(typ, val, key, parent); - let ref: any = undefined; - while (typeof typ === "object" && typ.ref !== undefined) { - ref = typ.ref; - typ = typeMap[typ.ref]; - } - if (Array.isArray(typ)) return transformEnum(typ, val); - if (typeof typ === "object") { - return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) - : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) - : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) - : invalidValue(typ, val, key, parent); - } - // Numbers can be parsed by Date but shouldn't be. - if (typ === Date && typeof val !== "number") return transformDate(val); - return transformPrimitive(typ, val); -} - -function cast(val: any, typ: any): T { - return transform(val, typ, jsonToJSProps); -} - -function uncast(val: T, typ: any): any { - return transform(val, typ, jsToJSONProps); -} - -function l(typ: any) { - return { literal: typ }; -} - -function a(typ: any) { - return { arrayItems: typ }; -} - -function u(...typs: any[]) { - return { unionMembers: typs }; -} - -function o(props: any[], additional: any) { - return { props, additional }; -} - -function m(additional: any) { - return { props: [], additional }; -} - -function r(name: string) { - return { ref: name }; -} - -const typeMap: any = { - "AddContextListenerRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("AddContextListenerRequestPayload") }, - { json: "type", js: "type", typ: r("AddContextListenerRequestType") }, - ], false), - "AddContextListenerRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("AppIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "AppIdentifier": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "AddContextListenerRequestPayload": o([ - { json: "channelId", js: "channelId", typ: u(null, "") }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "AddContextListenerResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("AddContextListenerResponsePayload") }, - { json: "type", js: "type", typ: r("AddContextListenerResponseType") }, - ], false), - "AddContextListenerResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("AppIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "AddContextListenerResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "listenerUUID", js: "listenerUUID", typ: u(undefined, "") }, - ], false), - "AddEventListenerRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("AddEventListenerRequestPayload") }, - { json: "type", js: "type", typ: r("AddEventListenerRequestType") }, - ], false), - "AddEventListenerRequestPayload": o([ - { json: "type", js: "type", typ: u(r("FDC3EventType"), null) }, - ], false), - "AddEventListenerResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("AddEventListenerResponsePayload") }, - { json: "type", js: "type", typ: r("AddEventListenerResponseType") }, - ], false), - "AddEventListenerResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - { json: "listenerUUID", js: "listenerUUID", typ: u(undefined, "") }, - ], false), - "AddIntentListenerRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("AddIntentListenerRequestPayload") }, - { json: "type", js: "type", typ: r("AddIntentListenerRequestType") }, - ], false), - "AddIntentListenerRequestPayload": o([ - { json: "intent", js: "intent", typ: "" }, - ], false), - "AddIntentListenerResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("AddIntentListenerResponsePayload") }, - { json: "type", js: "type", typ: r("AddIntentListenerResponseType") }, - ], false), - "AddIntentListenerResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FluffyError")) }, - { json: "listenerUUID", js: "listenerUUID", typ: u(undefined, "") }, - ], "any"), - "AgentEventMessage": o([ - { json: "meta", js: "meta", typ: r("AgentEventMessageMeta") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: r("EventMessageType") }, - ], false), - "AgentEventMessageMeta": o([ - { json: "eventUuid", js: "eventUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "AgentResponseMessage": o([ - { json: "meta", js: "meta", typ: r("AgentResponseMessageMeta") }, - { json: "payload", js: "payload", typ: r("AgentResponseMessageResponsePayload") }, - { json: "type", js: "type", typ: r("ResponseMessageType") }, - ], false), - "AgentResponseMessageMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("AppIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "AgentResponseMessageResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - ], "any"), - "AppRequestMessage": o([ - { json: "meta", js: "meta", typ: r("AppRequestMessageMeta") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: r("RequestMessageType") }, - ], false), - "AppRequestMessageMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("AppIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "BroadcastEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastEventPayload") }, - { json: "type", js: "type", typ: r("BroadcastEventType") }, - ], false), - "BroadcastEventMeta": o([ - { json: "eventUuid", js: "eventUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "BroadcastEventPayload": o([ - { json: "channelId", js: "channelId", typ: u(null, "") }, - { json: "context", js: "context", typ: r("Context") }, - { json: "originatingApp", js: "originatingApp", typ: u(undefined, r("AppIdentifier")) }, - ], false), - "Context": o([ - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: "" }, - ], "any"), - "BroadcastRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastRequestPayload") }, - { json: "type", js: "type", typ: r("BroadcastRequestType") }, - ], false), - "BroadcastRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "BroadcastResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("BroadcastResponseType") }, - ], false), - "BroadcastResponseResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - ], "any"), - "ChannelChangedEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("ChannelChangedEventPayload") }, - { json: "type", js: "type", typ: r("ChannelChangedEventType") }, - ], false), - "ChannelChangedEventPayload": o([ - { json: "newChannelId", js: "newChannelId", typ: u(null, "") }, - ], false), - "ContextListenerUnsubscribeRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("ContextListenerUnsubscribeRequestPayload") }, - { json: "type", js: "type", typ: r("ContextListenerUnsubscribeRequestType") }, - ], false), - "ContextListenerUnsubscribeRequestPayload": o([ - { json: "listenerUUID", js: "listenerUUID", typ: "" }, - ], false), - "ContextListenerUnsubscribeResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("ContextListenerUnsubscribeResponseType") }, - ], false), - "CreatePrivateChannelRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("CreatePrivateChannelRequestPayload") }, - { json: "type", js: "type", typ: r("CreatePrivateChannelRequestType") }, - ], false), - "CreatePrivateChannelRequestPayload": o([ - ], false), - "CreatePrivateChannelResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("CreatePrivateChannelResponsePayload") }, - { json: "type", js: "type", typ: r("CreatePrivateChannelResponseType") }, - ], false), - "CreatePrivateChannelResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "privateChannel", js: "privateChannel", typ: u(undefined, r("Channel")) }, - ], false), - "Channel": o([ - { json: "displayMetadata", js: "displayMetadata", typ: u(undefined, r("DisplayMetadata")) }, - { json: "id", js: "id", typ: "" }, - { json: "type", js: "type", typ: r("Type") }, - ], false), - "DisplayMetadata": o([ - { json: "color", js: "color", typ: u(undefined, "") }, - { json: "glyph", js: "glyph", typ: u(undefined, "") }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], false), - "EventListenerUnsubscribeRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("EventListenerUnsubscribeRequestPayload") }, - { json: "type", js: "type", typ: r("EventListenerUnsubscribeRequestType") }, - ], false), - "EventListenerUnsubscribeRequestPayload": o([ - { json: "listenerUUID", js: "listenerUUID", typ: "" }, - ], false), - "EventListenerUnsubscribeResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("EventListenerUnsubscribeResponseType") }, - ], false), - "Fdc3UserInterfaceChannels": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceChannelsPayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceChannelsType") }, - ], false), - "Fdc3UserInterfaceChannelsPayload": o([ - { json: "selected", js: "selected", typ: u(null, "") }, - { json: "userChannels", js: "userChannels", typ: a(r("Channel")) }, - ], false), - "Fdc3UserInterfaceChannelSelected": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceChannelSelectedPayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceChannelSelectedType") }, - ], false), - "Fdc3UserInterfaceChannelSelectedPayload": o([ - { json: "selected", js: "selected", typ: u(null, "") }, - ], false), - "Fdc3UserInterfaceDrag": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceDragPayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceDragType") }, - ], false), - "Fdc3UserInterfaceDragPayload": o([ - { json: "mouseOffsets", js: "mouseOffsets", typ: r("MouseOffsets") }, - ], false), - "MouseOffsets": o([ - { json: "x", js: "x", typ: 0 }, - { json: "y", js: "y", typ: 0 }, - ], false), - "Fdc3UserInterfaceHandshake": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceHandshakePayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceHandshakeType") }, - ], false), - "Fdc3UserInterfaceHandshakePayload": o([ - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - ], false), - "Fdc3UserInterfaceHello": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceHelloPayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceHelloType") }, - ], false), - "Fdc3UserInterfaceHelloPayload": o([ - { json: "implementationDetails", js: "implementationDetails", typ: "" }, - { json: "initialCSS", js: "initialCSS", typ: r("InitialCSS") }, - ], false), - "InitialCSS": o([ - { json: "bottom", js: "bottom", typ: u(undefined, "") }, - { json: "height", js: "height", typ: u(undefined, "") }, - { json: "left", js: "left", typ: u(undefined, "") }, - { json: "maxHeight", js: "maxHeight", typ: u(undefined, "") }, - { json: "maxWidth", js: "maxWidth", typ: u(undefined, "") }, - { json: "right", js: "right", typ: u(undefined, "") }, - { json: "top", js: "top", typ: u(undefined, "") }, - { json: "transition", js: "transition", typ: u(undefined, "") }, - { json: "width", js: "width", typ: u(undefined, "") }, - { json: "zIndex", js: "zIndex", typ: u(undefined, "") }, - ], "any"), - "Fdc3UserInterfaceMessage": o([ - { json: "payload", js: "payload", typ: u(undefined, m("any")) }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceMessageType") }, - ], false), - "Fdc3UserInterfaceResolve": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceResolvePayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceResolveType") }, - ], false), - "Fdc3UserInterfaceResolvePayload": o([ - { json: "appIntents", js: "appIntents", typ: a(r("AppIntent")) }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "AppIntent": o([ - { json: "apps", js: "apps", typ: a(r("AppMetadata")) }, - { json: "intent", js: "intent", typ: r("IntentMetadata") }, - ], false), - "AppMetadata": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "description", js: "description", typ: u(undefined, "") }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "icons", js: "icons", typ: u(undefined, a(r("Icon"))) }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - { json: "instanceMetadata", js: "instanceMetadata", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "resultType", js: "resultType", typ: u(undefined, u(null, "")) }, - { json: "screenshots", js: "screenshots", typ: u(undefined, a(r("Image"))) }, - { json: "title", js: "title", typ: u(undefined, "") }, - { json: "tooltip", js: "tooltip", typ: u(undefined, "") }, - { json: "version", js: "version", typ: u(undefined, "") }, - ], false), - "Icon": o([ - { json: "size", js: "size", typ: u(undefined, "") }, - { json: "src", js: "src", typ: "" }, - { json: "type", js: "type", typ: u(undefined, "") }, - ], false), - "Image": o([ - { json: "label", js: "label", typ: u(undefined, "") }, - { json: "size", js: "size", typ: u(undefined, "") }, - { json: "src", js: "src", typ: "" }, - { json: "type", js: "type", typ: u(undefined, "") }, - ], false), - "IntentMetadata": o([ - { json: "displayName", js: "displayName", typ: u(undefined, "") }, - { json: "name", js: "name", typ: "" }, - ], false), - "Fdc3UserInterfaceResolveAction": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceResolveActionPayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceResolveActionType") }, - ], false), - "Fdc3UserInterfaceResolveActionPayload": o([ - { json: "action", js: "action", typ: r("Action") }, - { json: "appIdentifier", js: "appIdentifier", typ: u(undefined, r("AppIdentifier")) }, - { json: "intent", js: "intent", typ: u(undefined, "") }, - ], false), - "Fdc3UserInterfaceRestyle": o([ - { json: "payload", js: "payload", typ: r("Fdc3UserInterfaceRestylePayload") }, - { json: "type", js: "type", typ: r("Fdc3UserInterfaceRestyleType") }, - ], false), - "Fdc3UserInterfaceRestylePayload": o([ - { json: "updatedCSS", js: "updatedCSS", typ: r("UpdatedCSS") }, - ], false), - "UpdatedCSS": o([ - { json: "bottom", js: "bottom", typ: u(undefined, "") }, - { json: "height", js: "height", typ: u(undefined, "") }, - { json: "left", js: "left", typ: u(undefined, "") }, - { json: "maxHeight", js: "maxHeight", typ: u(undefined, "") }, - { json: "maxWidth", js: "maxWidth", typ: u(undefined, "") }, - { json: "right", js: "right", typ: u(undefined, "") }, - { json: "top", js: "top", typ: u(undefined, "") }, - { json: "transition", js: "transition", typ: u(undefined, "") }, - { json: "width", js: "width", typ: u(undefined, "") }, - { json: "zIndex", js: "zIndex", typ: u(undefined, "") }, - ], "any"), - "FindInstancesRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindInstancesRequestPayload") }, - { json: "type", js: "type", typ: r("FindInstancesRequestType") }, - ], false), - "FindInstancesRequestPayload": o([ - { json: "app", js: "app", typ: r("AppIdentifier") }, - ], false), - "FindInstancesResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindInstancesResponsePayload") }, - { json: "type", js: "type", typ: r("FindInstancesResponseType") }, - ], false), - "FindInstancesResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "appIdentifiers", js: "appIdentifiers", typ: u(undefined, a(r("AppMetadata"))) }, - ], false), - "FindIntentRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentRequestType") }, - ], false), - "FindIntentRequestPayload": o([ - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - { json: "intent", js: "intent", typ: "" }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentResponseType") }, - ], false), - "FindIntentResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "appIntent", js: "appIntent", typ: u(undefined, r("AppIntent")) }, - ], false), - "FindIntentsByContextRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextRequestType") }, - ], false), - "FindIntentsByContextRequestPayload": o([ - { json: "context", js: "context", typ: r("Context") }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentsByContextResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextResponseType") }, - ], false), - "FindIntentsByContextResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "appIntents", js: "appIntents", typ: u(undefined, a(r("AppIntent"))) }, - ], false), - "GetAppMetadataRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataRequestPayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataRequestType") }, - ], false), - "GetAppMetadataRequestPayload": o([ - { json: "app", js: "app", typ: r("AppIdentifier") }, - ], false), - "GetAppMetadataResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataResponsePayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataResponseType") }, - ], false), - "GetAppMetadataResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "appMetadata", js: "appMetadata", typ: u(undefined, r("AppMetadata")) }, - ], false), - "GetCurrentChannelRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetCurrentChannelRequestPayload") }, - { json: "type", js: "type", typ: r("GetCurrentChannelRequestType") }, - ], false), - "GetCurrentChannelRequestPayload": o([ - ], false), - "GetCurrentChannelResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetCurrentChannelResponsePayload") }, - { json: "type", js: "type", typ: r("GetCurrentChannelResponseType") }, - ], false), - "GetCurrentChannelResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - { json: "channel", js: "channel", typ: u(undefined, u(r("Channel"), null)) }, - ], false), - "GetCurrentContextRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetCurrentContextRequestPayload") }, - { json: "type", js: "type", typ: r("GetCurrentContextRequestType") }, - ], false), - "GetCurrentContextRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "GetCurrentContextResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetCurrentContextResponsePayload") }, - { json: "type", js: "type", typ: r("GetCurrentContextResponseType") }, - ], false), - "GetCurrentContextResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "context", js: "context", typ: u(undefined, u(null, r("Context"))) }, - ], false), - "GetInfoRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetInfoRequestPayload") }, - { json: "type", js: "type", typ: r("GetInfoRequestType") }, - ], false), - "GetInfoRequestPayload": o([ - ], false), - "GetInfoResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetInfoResponsePayload") }, - { json: "type", js: "type", typ: r("GetInfoResponseType") }, - ], false), - "GetInfoResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - { json: "implementationMetadata", js: "implementationMetadata", typ: u(undefined, r("ImplementationMetadata")) }, - ], false), - "ImplementationMetadata": o([ - { json: "appMetadata", js: "appMetadata", typ: r("AppMetadata") }, - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - { json: "optionalFeatures", js: "optionalFeatures", typ: r("OptionalFeatures") }, - { json: "provider", js: "provider", typ: "" }, - { json: "providerVersion", js: "providerVersion", typ: u(undefined, "") }, - ], false), - "OptionalFeatures": o([ - { json: "DesktopAgentBridging", js: "DesktopAgentBridging", typ: true }, - { json: "OriginatingAppMetadata", js: "OriginatingAppMetadata", typ: true }, - { json: "UserChannelMembershipAPIs", js: "UserChannelMembershipAPIs", typ: true }, - ], false), - "GetOrCreateChannelRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetOrCreateChannelRequestPayload") }, - { json: "type", js: "type", typ: r("GetOrCreateChannelRequestType") }, - ], false), - "GetOrCreateChannelRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - ], false), - "GetOrCreateChannelResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetOrCreateChannelResponsePayload") }, - { json: "type", js: "type", typ: r("GetOrCreateChannelResponseType") }, - ], false), - "GetOrCreateChannelResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "channel", js: "channel", typ: u(undefined, r("Channel")) }, - ], false), - "GetUserChannelsRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetUserChannelsRequestPayload") }, - { json: "type", js: "type", typ: r("GetUserChannelsRequestType") }, - ], false), - "GetUserChannelsRequestPayload": o([ - ], false), - "GetUserChannelsResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetUserChannelsResponsePayload") }, - { json: "type", js: "type", typ: r("GetUserChannelsResponseType") }, - ], false), - "GetUserChannelsResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "userChannels", js: "userChannels", typ: u(undefined, a(r("Channel"))) }, - ], false), - "HeartbeatAcknowledgementRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("HeartbeatAcknowledgementRequestPayload") }, - { json: "type", js: "type", typ: r("HeartbeatAcknowledgementRequestType") }, - ], false), - "HeartbeatAcknowledgementRequestPayload": o([ - { json: "heartbeatEventUuid", js: "heartbeatEventUuid", typ: "" }, - ], false), - "HeartbeatEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("HeartbeatEventPayload") }, - { json: "type", js: "type", typ: r("HeartbeatEventType") }, - ], false), - "HeartbeatEventPayload": o([ - ], false), - "IntentEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("IntentEventPayload") }, - { json: "type", js: "type", typ: r("IntentEventType") }, - ], false), - "IntentEventPayload": o([ - { json: "context", js: "context", typ: r("Context") }, - { json: "intent", js: "intent", typ: "" }, - { json: "originatingApp", js: "originatingApp", typ: u(undefined, r("AppIdentifier")) }, - { json: "raiseIntentRequestUuid", js: "raiseIntentRequestUuid", typ: "" }, - ], false), - "IntentListenerUnsubscribeRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("IntentListenerUnsubscribeRequestPayload") }, - { json: "type", js: "type", typ: r("IntentListenerUnsubscribeRequestType") }, - ], false), - "IntentListenerUnsubscribeRequestPayload": o([ - { json: "listenerUUID", js: "listenerUUID", typ: "" }, - ], false), - "IntentListenerUnsubscribeResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("IntentListenerUnsubscribeResponseType") }, - ], false), - "IntentResultRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("IntentResultRequestPayload") }, - { json: "type", js: "type", typ: r("IntentResultRequestType") }, - ], false), - "IntentResultRequestPayload": o([ - { json: "intentEventUuid", js: "intentEventUuid", typ: "" }, - { json: "intentResult", js: "intentResult", typ: r("IntentResult") }, - { json: "raiseIntentRequestUuid", js: "raiseIntentRequestUuid", typ: "" }, - ], false), - "IntentResult": o([ - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - { json: "channel", js: "channel", typ: u(undefined, r("Channel")) }, - ], false), - "IntentResultResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("IntentResultResponseType") }, - ], false), - "JoinUserChannelRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("JoinUserChannelRequestPayload") }, - { json: "type", js: "type", typ: r("JoinUserChannelRequestType") }, - ], false), - "JoinUserChannelRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - ], false), - "JoinUserChannelResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("JoinUserChannelResponsePayload") }, - { json: "type", js: "type", typ: r("JoinUserChannelResponseType") }, - ], false), - "JoinUserChannelResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - ], false), - "LeaveCurrentChannelRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("LeaveCurrentChannelRequestPayload") }, - { json: "type", js: "type", typ: r("LeaveCurrentChannelRequestType") }, - ], false), - "LeaveCurrentChannelRequestPayload": o([ - ], false), - "LeaveCurrentChannelResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("LeaveCurrentChannelResponsePayload") }, - { json: "type", js: "type", typ: r("LeaveCurrentChannelResponseType") }, - ], false), - "LeaveCurrentChannelResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - ], false), - "OpenRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("OpenRequestPayload") }, - { json: "type", js: "type", typ: r("OpenRequestType") }, - ], false), - "OpenRequestPayload": o([ - { json: "app", js: "app", typ: r("AppIdentifier") }, - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - ], false), - "OpenResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("OpenResponsePayload") }, - { json: "type", js: "type", typ: r("OpenResponseType") }, - ], false), - "OpenResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("OpenErrorResponsePayload")) }, - { json: "appIdentifier", js: "appIdentifier", typ: u(undefined, r("AppIdentifier")) }, - ], false), - "PrivateChannelAddEventListenerRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("TPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelAddEventListenerRequestType") }, - ], false), - "TPayload": o([ - { json: "listenerType", js: "listenerType", typ: u(r("PrivateChannelEventListenerTypes"), null) }, - { json: "privateChannelId", js: "privateChannelId", typ: "" }, - ], false), - "PrivateChannelAddEventListenerResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelAddEventListenerResponsePayload") }, - { json: "type", js: "type", typ: r("PrivateChannelAddEventListenerResponseType") }, - ], false), - "PrivateChannelAddEventListenerResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - { json: "listenerUUID", js: "listenerUUID", typ: u(undefined, "") }, - ], "any"), - "PrivateChannelDisconnectRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelDisconnectRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelDisconnectRequestType") }, - ], false), - "PrivateChannelDisconnectRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - ], false), - "PrivateChannelDisconnectResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelDisconnectResponsePayload") }, - { json: "type", js: "type", typ: r("PrivateChannelDisconnectResponseType") }, - ], false), - "PrivateChannelDisconnectResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("PurpleError")) }, - ], false), - "PrivateChannelOnAddContextListenerEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnAddContextListenerEventPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnAddContextListenerEventType") }, - ], false), - "PrivateChannelOnAddContextListenerEventPayload": o([ - { json: "contextType", js: "contextType", typ: u(null, "") }, - { json: "privateChannelId", js: "privateChannelId", typ: "" }, - ], false), - "PrivateChannelOnDisconnectEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnDisconnectEventPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnDisconnectEventType") }, - ], false), - "PrivateChannelOnDisconnectEventPayload": o([ - { json: "privateChannelId", js: "privateChannelId", typ: "" }, - ], false), - "PrivateChannelOnUnsubscribeEvent": o([ - { json: "meta", js: "meta", typ: r("BroadcastEventMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnUnsubscribeEventPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnUnsubscribeEventType") }, - ], false), - "PrivateChannelOnUnsubscribeEventPayload": o([ - { json: "contextType", js: "contextType", typ: u(null, "") }, - { json: "privateChannelId", js: "privateChannelId", typ: "" }, - ], false), - "PrivateChannelUnsubscribeEventListenerRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelUnsubscribeEventListenerRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelUnsubscribeEventListenerRequestType") }, - ], false), - "PrivateChannelUnsubscribeEventListenerRequestPayload": o([ - { json: "listenerUUID", js: "listenerUUID", typ: "" }, - ], false), - "PrivateChannelUnsubscribeEventListenerResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastResponseResponsePayload") }, - { json: "type", js: "type", typ: r("PrivateChannelUnsubscribeEventListenerResponseType") }, - ], false), - "RaiseIntentForContextRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentForContextRequestPayload") }, - { json: "type", js: "type", typ: r("RaiseIntentForContextRequestType") }, - ], false), - "RaiseIntentForContextRequestPayload": o([ - { json: "app", js: "app", typ: u(undefined, r("AppIdentifier")) }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "RaiseIntentForContextResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentForContextResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentForContextResponseType") }, - ], false), - "RaiseIntentForContextResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "intentResolution", js: "intentResolution", typ: u(undefined, r("IntentResolution")) }, - { json: "appIntents", js: "appIntents", typ: u(undefined, a(r("AppIntent"))) }, - ], false), - "IntentResolution": o([ - { json: "intent", js: "intent", typ: "" }, - { json: "source", js: "source", typ: r("AppIdentifier") }, - ], false), - "RaiseIntentRequest": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerRequestMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentRequestPayload") }, - { json: "type", js: "type", typ: r("RaiseIntentRequestType") }, - ], false), - "RaiseIntentRequestPayload": o([ - { json: "app", js: "app", typ: u(undefined, r("AppIdentifier")) }, - { json: "context", js: "context", typ: r("Context") }, - { json: "intent", js: "intent", typ: "" }, - ], false), - "RaiseIntentResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResponseType") }, - ], false), - "RaiseIntentResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("FindInstancesErrors")) }, - { json: "intentResolution", js: "intentResolution", typ: u(undefined, r("IntentResolution")) }, - { json: "appIntent", js: "appIntent", typ: u(undefined, r("AppIntent")) }, - ], false), - "RaiseIntentResultResponse": o([ - { json: "meta", js: "meta", typ: r("AddContextListenerResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResultResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResultResponseType") }, - ], false), - "RaiseIntentResultResponsePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponsePayloadError")) }, - { json: "intentResult", js: "intentResult", typ: u(undefined, r("IntentResult")) }, - ], false), - "WebConnectionProtocol1Hello": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol1HelloPayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol1HelloType") }, - ], false), - "WebConnectionProtocol1HelloMeta": o([ - { json: "connectionAttemptUuid", js: "connectionAttemptUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "WebConnectionProtocol1HelloPayload": o([ - { json: "actualUrl", js: "actualUrl", typ: "" }, - { json: "channelSelector", js: "channelSelector", typ: u(undefined, true) }, - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - { json: "identityUrl", js: "identityUrl", typ: "" }, - { json: "intentResolver", js: "intentResolver", typ: u(undefined, true) }, - ], "any"), - "WebConnectionProtocol2LoadURL": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol2LoadURLPayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol2LoadURLType") }, - ], false), - "WebConnectionProtocol2LoadURLPayload": o([ - { json: "iframeUrl", js: "iframeUrl", typ: "" }, - ], "any"), - "WebConnectionProtocol3Handshake": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol3HandshakePayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol3HandshakeType") }, - ], false), - "WebConnectionProtocol3HandshakePayload": o([ - { json: "channelSelectorUrl", js: "channelSelectorUrl", typ: u(true, "") }, - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - { json: "intentResolverUrl", js: "intentResolverUrl", typ: u(true, "") }, - ], false), - "WebConnectionProtocol4ValidateAppIdentity": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol4ValidateAppIdentityPayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol4ValidateAppIdentityType") }, - ], false), - "WebConnectionProtocol4ValidateAppIdentityPayload": o([ - { json: "actualUrl", js: "actualUrl", typ: "" }, - { json: "identityUrl", js: "identityUrl", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - { json: "instanceUuid", js: "instanceUuid", typ: u(undefined, "") }, - ], false), - "WebConnectionProtocol5ValidateAppIdentityFailedResponse": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol5ValidateAppIdentityFailedResponseType") }, - ], false), - "WebConnectionProtocol5ValidateAppIdentityFailedResponsePayload": o([ - { json: "message", js: "message", typ: u(undefined, "") }, - ], false), - "WebConnectionProtocol5ValidateAppIdentitySuccessResponse": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol1HelloMeta") }, - { json: "payload", js: "payload", typ: r("WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol5ValidateAppIdentitySuccessResponseType") }, - ], false), - "WebConnectionProtocol5ValidateAppIdentitySuccessResponsePayload": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "implementationMetadata", js: "implementationMetadata", typ: r("ImplementationMetadata") }, - { json: "instanceId", js: "instanceId", typ: "" }, - { json: "instanceUuid", js: "instanceUuid", typ: "" }, - ], false), - "WebConnectionProtocol6Goodbye": o([ - { json: "meta", js: "meta", typ: r("WebConnectionProtocol6GoodbyeMeta") }, - { json: "type", js: "type", typ: r("WebConnectionProtocol6GoodbyeType") }, - ], false), - "WebConnectionProtocol6GoodbyeMeta": o([ - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "WebConnectionProtocolMessage": o([ - { json: "meta", js: "meta", typ: r("ConnectionStepMetadata") }, - { json: "payload", js: "payload", typ: u(undefined, m("any")) }, - { json: "type", js: "type", typ: r("ConnectionStepMessageType") }, - ], false), - "ConnectionStepMetadata": o([ - { json: "timestamp", js: "timestamp", typ: Date }, - { json: "connectionAttemptUuid", js: "connectionAttemptUuid", typ: u(undefined, "") }, - ], false), - "AddContextListenerRequestType": [ - "addContextListenerRequest", - ], - "PurpleError": [ - "AccessDenied", - "CreationFailed", - "MalformedContext", - "NoChannelFound", - ], - "AddContextListenerResponseType": [ - "addContextListenerResponse", - ], - "FDC3EventType": [ - "USER_CHANNEL_CHANGED", - ], - "AddEventListenerRequestType": [ - "addEventListenerRequest", - ], - "ResponsePayloadError": [ - "AccessDenied", - "AgentDisconnected", - "AppNotFound", - "AppTimeout", - "CreationFailed", - "DesktopAgentNotFound", - "ErrorOnLaunch", - "IntentDeliveryFailed", - "IntentHandlerRejected", - "MalformedContext", - "MalformedMessage", - "NoAppsFound", - "NoChannelFound", - "NoResultReturned", - "NotConnectedToBridge", - "ResolverTimeout", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution", - ], - "AddEventListenerResponseType": [ - "addEventListenerResponse", - ], - "AddIntentListenerRequestType": [ - "addIntentListenerRequest", - ], - "FluffyError": [ - "DesktopAgentNotFound", - "IntentDeliveryFailed", - "MalformedContext", - "NoAppsFound", - "ResolverTimeout", - "ResolverUnavailable", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution", - ], - "AddIntentListenerResponseType": [ - "addIntentListenerResponse", - ], - "EventMessageType": [ - "addEventListenerEvent", - "broadcastEvent", - "channelChangedEvent", - "heartbeatEvent", - "intentEvent", - "privateChannelOnAddContextListenerEvent", - "privateChannelOnDisconnectEvent", - "privateChannelOnUnsubscribeEvent", - ], - "ResponseMessageType": [ - "addContextListenerResponse", - "addEventListenerResponse", - "addIntentListenerResponse", - "broadcastResponse", - "contextListenerUnsubscribeResponse", - "createPrivateChannelResponse", - "eventListenerUnsubscribeResponse", - "findInstancesResponse", - "findIntentResponse", - "findIntentsByContextResponse", - "getAppMetadataResponse", - "getCurrentChannelResponse", - "getCurrentContextResponse", - "getInfoResponse", - "getOrCreateChannelResponse", - "getUserChannelsResponse", - "intentListenerUnsubscribeResponse", - "intentResultResponse", - "joinUserChannelResponse", - "leaveCurrentChannelResponse", - "openResponse", - "privateChannelAddEventListenerResponse", - "privateChannelDisconnectResponse", - "privateChannelUnsubscribeEventListenerResponse", - "raiseIntentForContextResponse", - "raiseIntentResponse", - "raiseIntentResultResponse", - ], - "RequestMessageType": [ - "addContextListenerRequest", - "addEventListenerRequest", - "addIntentListenerRequest", - "broadcastRequest", - "contextListenerUnsubscribeRequest", - "createPrivateChannelRequest", - "eventListenerUnsubscribeRequest", - "findInstancesRequest", - "findIntentRequest", - "findIntentsByContextRequest", - "getAppMetadataRequest", - "getCurrentChannelRequest", - "getCurrentContextRequest", - "getInfoRequest", - "getOrCreateChannelRequest", - "getUserChannelsRequest", - "heartbeatAcknowledgementRequest", - "intentListenerUnsubscribeRequest", - "intentResultRequest", - "joinUserChannelRequest", - "leaveCurrentChannelRequest", - "openRequest", - "privateChannelAddEventListenerRequest", - "privateChannelDisconnectRequest", - "privateChannelUnsubscribeEventListenerRequest", - "raiseIntentForContextRequest", - "raiseIntentRequest", - ], - "BroadcastEventType": [ - "broadcastEvent", - ], - "BroadcastRequestType": [ - "broadcastRequest", - ], - "BroadcastResponseType": [ - "broadcastResponse", - ], - "ChannelChangedEventType": [ - "channelChangedEvent", - ], - "ContextListenerUnsubscribeRequestType": [ - "contextListenerUnsubscribeRequest", - ], - "ContextListenerUnsubscribeResponseType": [ - "contextListenerUnsubscribeResponse", - ], - "CreatePrivateChannelRequestType": [ - "createPrivateChannelRequest", - ], - "Type": [ - "app", - "private", - "user", - ], - "CreatePrivateChannelResponseType": [ - "createPrivateChannelResponse", - ], - "EventListenerUnsubscribeRequestType": [ - "eventListenerUnsubscribeRequest", - ], - "EventListenerUnsubscribeResponseType": [ - "eventListenerUnsubscribeResponse", - ], - "Fdc3UserInterfaceChannelsType": [ - "Fdc3UserInterfaceChannels", - ], - "Fdc3UserInterfaceChannelSelectedType": [ - "Fdc3UserInterfaceChannelSelected", - ], - "Fdc3UserInterfaceDragType": [ - "Fdc3UserInterfaceDrag", - ], - "Fdc3UserInterfaceHandshakeType": [ - "Fdc3UserInterfaceHandshake", - ], - "Fdc3UserInterfaceHelloType": [ - "Fdc3UserInterfaceHello", - ], - "Fdc3UserInterfaceMessageType": [ - "Fdc3UserInterfaceChannelSelected", - "Fdc3UserInterfaceChannels", - "Fdc3UserInterfaceDrag", - "Fdc3UserInterfaceHandshake", - "Fdc3UserInterfaceHello", - "Fdc3UserInterfaceResolve", - "Fdc3UserInterfaceResolveAction", - "Fdc3UserInterfaceRestyle", - ], - "Fdc3UserInterfaceResolveType": [ - "Fdc3UserInterfaceResolve", - ], - "Action": [ - "cancel", - "click", - "hover", - ], - "Fdc3UserInterfaceResolveActionType": [ - "Fdc3UserInterfaceResolveAction", - ], - "Fdc3UserInterfaceRestyleType": [ - "Fdc3UserInterfaceRestyle", - ], - "FindInstancesRequestType": [ - "findInstancesRequest", - ], - "FindInstancesErrors": [ - "AgentDisconnected", - "DesktopAgentNotFound", - "IntentDeliveryFailed", - "MalformedContext", - "MalformedMessage", - "NoAppsFound", - "NotConnectedToBridge", - "ResolverTimeout", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution", - ], - "FindInstancesResponseType": [ - "findInstancesResponse", - ], - "FindIntentRequestType": [ - "findIntentRequest", - ], - "FindIntentResponseType": [ - "findIntentResponse", - ], - "FindIntentsByContextRequestType": [ - "findIntentsByContextRequest", - ], - "FindIntentsByContextResponseType": [ - "findIntentsByContextResponse", - ], - "GetAppMetadataRequestType": [ - "getAppMetadataRequest", - ], - "GetAppMetadataResponseType": [ - "getAppMetadataResponse", - ], - "GetCurrentChannelRequestType": [ - "getCurrentChannelRequest", - ], - "GetCurrentChannelResponseType": [ - "getCurrentChannelResponse", - ], - "GetCurrentContextRequestType": [ - "getCurrentContextRequest", - ], - "GetCurrentContextResponseType": [ - "getCurrentContextResponse", - ], - "GetInfoRequestType": [ - "getInfoRequest", - ], - "GetInfoResponseType": [ - "getInfoResponse", - ], - "GetOrCreateChannelRequestType": [ - "getOrCreateChannelRequest", - ], - "GetOrCreateChannelResponseType": [ - "getOrCreateChannelResponse", - ], - "GetUserChannelsRequestType": [ - "getUserChannelsRequest", - ], - "GetUserChannelsResponseType": [ - "getUserChannelsResponse", - ], - "HeartbeatAcknowledgementRequestType": [ - "heartbeatAcknowledgementRequest", - ], - "HeartbeatEventType": [ - "heartbeatEvent", - ], - "IntentEventType": [ - "intentEvent", - ], - "IntentListenerUnsubscribeRequestType": [ - "intentListenerUnsubscribeRequest", - ], - "IntentListenerUnsubscribeResponseType": [ - "intentListenerUnsubscribeResponse", - ], - "IntentResultRequestType": [ - "intentResultRequest", - ], - "IntentResultResponseType": [ - "intentResultResponse", - ], - "JoinUserChannelRequestType": [ - "joinUserChannelRequest", - ], - "JoinUserChannelResponseType": [ - "joinUserChannelResponse", - ], - "LeaveCurrentChannelRequestType": [ - "leaveCurrentChannelRequest", - ], - "LeaveCurrentChannelResponseType": [ - "leaveCurrentChannelResponse", - ], - "OpenRequestType": [ - "openRequest", - ], - "OpenErrorResponsePayload": [ - "AgentDisconnected", - "AppNotFound", - "AppTimeout", - "DesktopAgentNotFound", - "ErrorOnLaunch", - "MalformedContext", - "MalformedMessage", - "NotConnectedToBridge", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - ], - "OpenResponseType": [ - "openResponse", - ], - "PrivateChannelEventListenerTypes": [ - "addContextListener", - "disconnect", - "unsubscribe", - ], - "PrivateChannelAddEventListenerRequestType": [ - "privateChannelAddEventListenerRequest", - ], - "PrivateChannelAddEventListenerResponseType": [ - "privateChannelAddEventListenerResponse", - ], - "PrivateChannelDisconnectRequestType": [ - "privateChannelDisconnectRequest", - ], - "PrivateChannelDisconnectResponseType": [ - "privateChannelDisconnectResponse", - ], - "PrivateChannelOnAddContextListenerEventType": [ - "privateChannelOnAddContextListenerEvent", - ], - "PrivateChannelOnDisconnectEventType": [ - "privateChannelOnDisconnectEvent", - ], - "PrivateChannelOnUnsubscribeEventType": [ - "privateChannelOnUnsubscribeEvent", - ], - "PrivateChannelUnsubscribeEventListenerRequestType": [ - "privateChannelUnsubscribeEventListenerRequest", - ], - "PrivateChannelUnsubscribeEventListenerResponseType": [ - "privateChannelUnsubscribeEventListenerResponse", - ], - "RaiseIntentForContextRequestType": [ - "raiseIntentForContextRequest", - ], - "RaiseIntentForContextResponseType": [ - "raiseIntentForContextResponse", - ], - "RaiseIntentRequestType": [ - "raiseIntentRequest", - ], - "RaiseIntentResponseType": [ - "raiseIntentResponse", - ], - "RaiseIntentResultResponseType": [ - "raiseIntentResultResponse", - ], - "WebConnectionProtocol1HelloType": [ - "WCP1Hello", - ], - "WebConnectionProtocol2LoadURLType": [ - "WCP2LoadUrl", - ], - "WebConnectionProtocol3HandshakeType": [ - "WCP3Handshake", - ], - "WebConnectionProtocol4ValidateAppIdentityType": [ - "WCP4ValidateAppIdentity", - ], - "WebConnectionProtocol5ValidateAppIdentityFailedResponseType": [ - "WCP5ValidateAppIdentityFailedResponse", - ], - "WebConnectionProtocol5ValidateAppIdentitySuccessResponseType": [ - "WCP5ValidateAppIdentityResponse", - ], - "WebConnectionProtocol6GoodbyeType": [ - "WCP6Goodbye", - ], - "ConnectionStepMessageType": [ - "WCP1Hello", - "WCP2LoadUrl", - "WCP3Handshake", - "WCP4ValidateAppIdentity", - "WCP5ValidateAppIdentityFailedResponse", - "WCP5ValidateAppIdentityResponse", - "WCP6Goodbye", - ], -}; diff --git a/src/bridging/BridgingTypes.ts b/src/bridging/BridgingTypes.ts deleted file mode 100644 index 4a7b7e98a..000000000 --- a/src/bridging/BridgingTypes.ts +++ /dev/null @@ -1,6057 +0,0 @@ -// To parse this data: -// -// import { Convert, AgentErrorResponseMessage, AgentRequestMessage, AgentResponseMessage, BridgeErrorResponseMessage, BridgeRequestMessage, BridgeResponseMessage, BroadcastAgentRequest, BroadcastBridgeRequest, ConnectionStepMessage, ConnectionStep2Hello, ConnectionStep3Handshake, ConnectionStep4AuthenticationFailed, ConnectionStep6ConnectedAgentsUpdate, FindInstancesAgentErrorResponse, FindInstancesAgentRequest, FindInstancesAgentResponse, FindInstancesBridgeErrorResponse, FindInstancesBridgeRequest, FindInstancesBridgeResponse, FindIntentAgentErrorResponse, FindIntentAgentRequest, FindIntentAgentResponse, FindIntentBridgeErrorResponse, FindIntentBridgeRequest, FindIntentBridgeResponse, FindIntentsByContextAgentErrorResponse, FindIntentsByContextAgentRequest, FindIntentsByContextAgentResponse, FindIntentsByContextBridgeErrorResponse, FindIntentsByContextBridgeRequest, FindIntentsByContextBridgeResponse, GetAppMetadataAgentErrorResponse, GetAppMetadataAgentRequest, GetAppMetadataAgentResponse, GetAppMetadataBridgeErrorResponse, GetAppMetadataBridgeRequest, GetAppMetadataBridgeResponse, OpenAgentErrorResponse, OpenAgentRequest, OpenAgentResponse, OpenBridgeErrorResponse, OpenBridgeRequest, OpenBridgeResponse, PrivateChannelBroadcastAgentRequest, PrivateChannelBroadcastBridgeRequest, PrivateChannelEventListenerAddedAgentRequest, PrivateChannelEventListenerAddedBridgeRequest, PrivateChannelEventListenerRemovedAgentRequest, PrivateChannelEventListenerRemovedBridgeRequest, PrivateChannelOnAddContextListenerAgentRequest, PrivateChannelOnAddContextListenerBridgeRequest, PrivateChannelOnDisconnectAgentRequest, PrivateChannelOnDisconnectBridgeRequest, PrivateChannelOnUnsubscribeAgentRequest, PrivateChannelOnUnsubscribeBridgeRequest, RaiseIntentAgentErrorResponse, RaiseIntentAgentRequest, RaiseIntentAgentResponse, RaiseIntentBridgeErrorResponse, RaiseIntentBridgeRequest, RaiseIntentBridgeResponse, RaiseIntentResultAgentErrorResponse, RaiseIntentResultAgentResponse, RaiseIntentResultBridgeErrorResponse, RaiseIntentResultBridgeResponse } from "./file"; -// -// const agentErrorResponseMessage = Convert.toAgentErrorResponseMessage(json); -// const agentRequestMessage = Convert.toAgentRequestMessage(json); -// const agentResponseMessage = Convert.toAgentResponseMessage(json); -// const bridgeErrorResponseMessage = Convert.toBridgeErrorResponseMessage(json); -// const bridgeRequestMessage = Convert.toBridgeRequestMessage(json); -// const bridgeResponseMessage = Convert.toBridgeResponseMessage(json); -// const broadcastAgentRequest = Convert.toBroadcastAgentRequest(json); -// const broadcastBridgeRequest = Convert.toBroadcastBridgeRequest(json); -// const bridgeCommonDefinitions = Convert.toBridgeCommonDefinitions(json); -// const connectionStepMessage = Convert.toConnectionStepMessage(json); -// const connectionStep2Hello = Convert.toConnectionStep2Hello(json); -// const connectionStep3Handshake = Convert.toConnectionStep3Handshake(json); -// const connectionStep4AuthenticationFailed = Convert.toConnectionStep4AuthenticationFailed(json); -// const connectionStep6ConnectedAgentsUpdate = Convert.toConnectionStep6ConnectedAgentsUpdate(json); -// const findInstancesAgentErrorResponse = Convert.toFindInstancesAgentErrorResponse(json); -// const findInstancesAgentRequest = Convert.toFindInstancesAgentRequest(json); -// const findInstancesAgentResponse = Convert.toFindInstancesAgentResponse(json); -// const findInstancesBridgeErrorResponse = Convert.toFindInstancesBridgeErrorResponse(json); -// const findInstancesBridgeRequest = Convert.toFindInstancesBridgeRequest(json); -// const findInstancesBridgeResponse = Convert.toFindInstancesBridgeResponse(json); -// const findIntentAgentErrorResponse = Convert.toFindIntentAgentErrorResponse(json); -// const findIntentAgentRequest = Convert.toFindIntentAgentRequest(json); -// const findIntentAgentResponse = Convert.toFindIntentAgentResponse(json); -// const findIntentBridgeErrorResponse = Convert.toFindIntentBridgeErrorResponse(json); -// const findIntentBridgeRequest = Convert.toFindIntentBridgeRequest(json); -// const findIntentBridgeResponse = Convert.toFindIntentBridgeResponse(json); -// const findIntentsByContextAgentErrorResponse = Convert.toFindIntentsByContextAgentErrorResponse(json); -// const findIntentsByContextAgentRequest = Convert.toFindIntentsByContextAgentRequest(json); -// const findIntentsByContextAgentResponse = Convert.toFindIntentsByContextAgentResponse(json); -// const findIntentsByContextBridgeErrorResponse = Convert.toFindIntentsByContextBridgeErrorResponse(json); -// const findIntentsByContextBridgeRequest = Convert.toFindIntentsByContextBridgeRequest(json); -// const findIntentsByContextBridgeResponse = Convert.toFindIntentsByContextBridgeResponse(json); -// const getAppMetadataAgentErrorResponse = Convert.toGetAppMetadataAgentErrorResponse(json); -// const getAppMetadataAgentRequest = Convert.toGetAppMetadataAgentRequest(json); -// const getAppMetadataAgentResponse = Convert.toGetAppMetadataAgentResponse(json); -// const getAppMetadataBridgeErrorResponse = Convert.toGetAppMetadataBridgeErrorResponse(json); -// const getAppMetadataBridgeRequest = Convert.toGetAppMetadataBridgeRequest(json); -// const getAppMetadataBridgeResponse = Convert.toGetAppMetadataBridgeResponse(json); -// const openAgentErrorResponse = Convert.toOpenAgentErrorResponse(json); -// const openAgentRequest = Convert.toOpenAgentRequest(json); -// const openAgentResponse = Convert.toOpenAgentResponse(json); -// const openBridgeErrorResponse = Convert.toOpenBridgeErrorResponse(json); -// const openBridgeRequest = Convert.toOpenBridgeRequest(json); -// const openBridgeResponse = Convert.toOpenBridgeResponse(json); -// const privateChannelBroadcastAgentRequest = Convert.toPrivateChannelBroadcastAgentRequest(json); -// const privateChannelBroadcastBridgeRequest = Convert.toPrivateChannelBroadcastBridgeRequest(json); -// const privateChannelEventListenerAddedAgentRequest = Convert.toPrivateChannelEventListenerAddedAgentRequest(json); -// const privateChannelEventListenerAddedBridgeRequest = Convert.toPrivateChannelEventListenerAddedBridgeRequest(json); -// const privateChannelEventListenerRemovedAgentRequest = Convert.toPrivateChannelEventListenerRemovedAgentRequest(json); -// const privateChannelEventListenerRemovedBridgeRequest = Convert.toPrivateChannelEventListenerRemovedBridgeRequest(json); -// const privateChannelOnAddContextListenerAgentRequest = Convert.toPrivateChannelOnAddContextListenerAgentRequest(json); -// const privateChannelOnAddContextListenerBridgeRequest = Convert.toPrivateChannelOnAddContextListenerBridgeRequest(json); -// const privateChannelOnDisconnectAgentRequest = Convert.toPrivateChannelOnDisconnectAgentRequest(json); -// const privateChannelOnDisconnectBridgeRequest = Convert.toPrivateChannelOnDisconnectBridgeRequest(json); -// const privateChannelOnUnsubscribeAgentRequest = Convert.toPrivateChannelOnUnsubscribeAgentRequest(json); -// const privateChannelOnUnsubscribeBridgeRequest = Convert.toPrivateChannelOnUnsubscribeBridgeRequest(json); -// const raiseIntentAgentErrorResponse = Convert.toRaiseIntentAgentErrorResponse(json); -// const raiseIntentAgentRequest = Convert.toRaiseIntentAgentRequest(json); -// const raiseIntentAgentResponse = Convert.toRaiseIntentAgentResponse(json); -// const raiseIntentBridgeErrorResponse = Convert.toRaiseIntentBridgeErrorResponse(json); -// const raiseIntentBridgeRequest = Convert.toRaiseIntentBridgeRequest(json); -// const raiseIntentBridgeResponse = Convert.toRaiseIntentBridgeResponse(json); -// const raiseIntentResultAgentErrorResponse = Convert.toRaiseIntentResultAgentErrorResponse(json); -// const raiseIntentResultAgentResponse = Convert.toRaiseIntentResultAgentResponse(json); -// const raiseIntentResultBridgeErrorResponse = Convert.toRaiseIntentResultBridgeErrorResponse(json); -// const raiseIntentResultBridgeResponse = Convert.toRaiseIntentResultBridgeResponse(json); -// -// These functions will throw an error if the JSON doesn't -// match the expected interface, even if the JSON is valid. - -/** - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface AgentErrorResponseMessage { - meta: AgentResponseMetadata; - /** - * Error message payload containing an standardized error string. - */ - payload: ErrorResponseMessagePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: ResponseMessageType; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface AgentResponseMetadata { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface ErrorResponseMessagePayload { - error: ResponseErrorDetail; - [property: string]: any; -} - -/** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - * - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type ResponseErrorDetail = "AccessDenied" | "CreationFailed" | "MalformedContext" | "NoChannelFound" | "AppNotFound" | "AppTimeout" | "DesktopAgentNotFound" | "ErrorOnLaunch" | "ResolverUnavailable" | "IntentDeliveryFailed" | "NoAppsFound" | "ResolverTimeout" | "TargetAppUnavailable" | "TargetInstanceUnavailable" | "UserCancelledResolution" | "IntentHandlerRejected" | "NoResultReturned" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ -export type ResponseMessageType = "findInstancesResponse" | "findIntentResponse" | "findIntentsByContextResponse" | "getAppMetadataResponse" | "openResponse" | "raiseIntentResponse" | "raiseIntentResultResponse"; - -/** - * A request message from a Desktop Agent to the Bridge. - */ -export interface AgentRequestMessage { - meta: AgentRequestMetadata; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: RequestMessageType; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface AgentRequestMetadata { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceIdentifier; - timestamp: Date; -} - -/** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Represents identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface BridgeParticipantIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - */ -export interface SourceIdentifier { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId?: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ -export type RequestMessageType = "broadcastRequest" | "findInstancesRequest" | "findIntentRequest" | "findIntentsByContextRequest" | "getAppMetadataRequest" | "openRequest" | "PrivateChannel.broadcast" | "PrivateChannel.eventListenerAdded" | "PrivateChannel.eventListenerRemoved" | "PrivateChannel.onAddContextListener" | "PrivateChannel.onDisconnect" | "PrivateChannel.onUnsubscribe" | "raiseIntentRequest"; - -/** - * A response message from a Desktop Agent to the Bridge. - */ -export interface AgentResponseMessage { - meta: AgentResponseMetadata; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: ResponseMessageType; -} - -/** - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface BridgeErrorResponseMessage { - meta: BridgeErrorResponseMessageMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: ResponseErrorMessagePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: string; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface BridgeErrorResponseMessageMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - */ -export interface DesktopAgentIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; - [property: string]: any; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface ResponseErrorMessagePayload { - error?: ResponseErrorDetail; - [property: string]: any; -} - -/** - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface BridgeRequestMessage { - meta: BridgeRequestMetadata; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: string; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface BridgeRequestMetadata { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: BridgeParticipantIdentifier; - timestamp: Date; -} - -/** - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface BridgeResponseMessage { - meta: BridgeResponseMessageMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: string; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface BridgeResponseMessageMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * A request to broadcast context on a channel. - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface BroadcastAgentRequest { - meta: BroadcastAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: BroadcastAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "broadcastRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface BroadcastAgentRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source: SourceObject; - timestamp: Date; -} - -/** - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - */ -export interface SourceObject { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface BroadcastAgentRequestPayload { - /** - * The Id of the Channel that the broadcast was sent on. - */ - channelId: string; - /** - * The context object that is to be broadcast. - */ - context: Context; -} - -/** - * The context object that is to be broadcast. - * - * The context object that was the payload of a broadcast message. - * - * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by - * FDC3 operations. As such, it is not really meant to be used on its own, but is imported - * by more specific type definitions (standardized or custom) to provide the structure and - * properties shared by all FDC3 context data types. - * - * The key element of FDC3 context types is their mandatory `type` property, which is used - * to identify what type of data the object represents, and what shape it has. - * - * The FDC3 context type, and all derived types, define the minimum set of fields a context - * data object of a particular type can be expected to have, but this can always be extended - * with custom fields as appropriate. - */ -export interface Context { - /** - * Context data objects may include a set of equivalent key-value pairs that can be used to - * help applications identify and look up the context type they receive in their own domain. - * The idea behind this design is that applications can provide as many equivalent - * identifiers to a target application as possible, e.g. an instrument may be represented by - * an ISIN, CUSIP or Bloomberg identifier. - * - * Identifiers do not make sense for all types of data, so the `id` property is therefore - * optional, but some derived types may choose to require at least one identifier. - * Identifier values SHOULD always be of type string. - */ - id?: { [key: string]: any }; - /** - * Context data objects may include a name property that can be used for more information, - * or display purposes. Some derived types may require the name object as mandatory, - * depending on use case. - */ - name?: string; - /** - * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 - * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present - * to route shared context data appropriately. - * - * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data - * types they support in an FDC3 [App - * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery - * and routing. - * - * Standardized FDC3 context types have well-known `type` properties prefixed with the - * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and - * used by a particular organization, the convention is to prefix them with an - * organization-specific namespace, e.g. `blackrock.fund`. - * - * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more - * information about context data types. - */ - type: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to broadcast context on a channel. - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface BroadcastBridgeRequest { - meta: BroadcastBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: BroadcastBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "broadcastRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface BroadcastBridgeRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - * - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Represents identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - */ -export interface MetaSource { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface BroadcastBridgeRequestPayload { - /** - * The Id of the Channel that the broadcast was sent on. - */ - channelId: string; - /** - * The context object that is to be broadcast. - */ - context: Context; -} - -/** - * A message used during the connection flow for a Desktop Agent to the Bridge. Used for - * messages sent in either direction. - */ -export interface ConnectionStepMessage { - meta: ConnectionStepMetadata; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: { [key: string]: any }; - /** - * Identifies the type of the connection step message. - */ - type: ConnectionStepMessageType; -} - -/** - * Metadata for this connection step message. - */ -export interface ConnectionStepMetadata { - requestUuid?: string; - responseUuid?: string; - timestamp: Date; -} - -/** - * Identifies the type of the connection step message. - */ -export type ConnectionStepMessageType = "hello" | "handshake" | "authenticationFailed" | "connectedAgentsUpdate"; - -/** - * Hello message sent by the Bridge to anyone connecting to the Bridge (enables - * identification as a bridge and confirmation of whether authentication is required) - * - * A message used during the connection flow for a Desktop Agent to the Bridge. Used for - * messages sent in either direction. - */ -export interface ConnectionStep2Hello { - meta: ConnectionStep2HelloMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: ConnectionStep2HelloPayload; - /** - * Identifies the type of the connection step message. - */ - type: "hello"; -} - -/** - * Metadata for this connection step message. - */ -export interface ConnectionStep2HelloMeta { - timestamp: Date; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface ConnectionStep2HelloPayload { - /** - * A flag indicating whether the Desktop Agent Bridge requires authentication or not. - */ - authRequired: boolean; - /** - * An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to - * authenticate a bridge. - */ - authToken?: string; - /** - * The version of the Bridge - */ - desktopAgentBridgeVersion: string; - /** - * The FDC3 versions supported by the Bridge - */ - supportedFDC3Versions: string[]; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Handshake message sent by the Desktop Agent to the Bridge (including requested name, - * channel state and authentication data) - * - * A message used during the connection flow for a Desktop Agent to the Bridge. Used for - * messages sent in either direction. - */ -export interface ConnectionStep3Handshake { - meta: ConnectionStep3HandshakeMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: ConnectionStep3HandshakePayload; - /** - * Identifies the type of the connection step message. - */ - type: "handshake"; -} - -/** - * Metadata for this connection step message. - */ -export interface ConnectionStep3HandshakeMeta { - requestUuid: string; - timestamp: Date; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface ConnectionStep3HandshakePayload { - authToken?: string; - /** - * The current state of the Desktop Agent's App and User channels (exclude any Private - * channels), as a mapping of channel id to an array of Context objects, one per type found - * in the channel, most recent first. - */ - channelsState: { [key: string]: Context[] }; - /** - * Desktop Agent ImplementationMetadata trying to connect to the bridge. - */ - implementationMetadata: ConnectingAgentImplementationMetadata; - /** - * The requested Desktop Agent name - */ - requestedName: string; -} - -/** - * Desktop Agent ImplementationMetadata trying to connect to the bridge. - * - * Metadata relating to the FDC3 Desktop Agent implementation and its provider. - */ -export interface ConnectingAgentImplementationMetadata { - /** - * The version number of the FDC3 specification that the implementation provides. - * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. - */ - fdc3Version: string; - /** - * Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. - */ - optionalFeatures: OptionalFeatures; - /** - * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, - * OpenFin etc.). - */ - provider: string; - /** - * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). - */ - providerVersion?: string; -} - -/** - * Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. - */ -export interface OptionalFeatures { - /** - * Used to indicate whether the experimental Desktop Agent Bridging - * feature is implemented by the Desktop Agent. - */ - DesktopAgentBridging: boolean; - /** - * Used to indicate whether the exposure of 'originating app metadata' for - * context and intent messages is supported by the Desktop Agent. - */ - OriginatingAppMetadata: boolean; - /** - * Used to indicate whether the optional `fdc3.joinUserChannel`, - * `fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by - * the Desktop Agent. - */ - UserChannelMembershipAPIs: boolean; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Message sent by Bridge to Desktop Agent if their authentication fails. - * - * A message used during the connection flow for a Desktop Agent to the Bridge. Used for - * messages sent in either direction. - */ -export interface ConnectionStep4AuthenticationFailed { - meta: ConnectionStep4AuthenticationFailedMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: ConnectionStep4AuthenticationFailedPayload; - /** - * Identifies the type of the connection step message. - */ - type: "authenticationFailed"; -} - -/** - * Metadata for this connection step message. - */ -export interface ConnectionStep4AuthenticationFailedMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface ConnectionStep4AuthenticationFailedPayload { - message?: string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, - * includes the details of all agents, the change made and the expected channel state for - * all agents. - * - * A message used during the connection flow for a Desktop Agent to the Bridge. Used for - * messages sent in either direction. - */ -export interface ConnectionStep6ConnectedAgentsUpdate { - meta: ConnectionStep6ConnectedAgentsUpdateMeta; - /** - * The message payload, containing data pertaining to this connection step. - */ - payload: ConnectionStep6ConnectedAgentsUpdatePayload; - /** - * Identifies the type of the connection step message. - */ - type: "connectedAgentsUpdate"; -} - -/** - * Metadata for this connection step message. - */ -export interface ConnectionStep6ConnectedAgentsUpdateMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload, containing data pertaining to this connection step. - */ -export interface ConnectionStep6ConnectedAgentsUpdatePayload { - /** - * Should be set when an agent first connects to the bridge and provide its assigned name. - */ - addAgent?: string; - /** - * Desktop Agent Bridge implementation metadata of all connected agents. - */ - allAgents: DesktopAgentImplementationMetadata[]; - /** - * The updated state of channels that should be adopted by the agents. Should only be set - * when an agent is connecting to the bridge. - */ - channelsState?: { [key: string]: Context[] }; - /** - * Should be set when an agent disconnects from the bridge and provide the name that no - * longer is assigned. - */ - removeAgent?: string; -} - -/** - * Includes the name assigned to the Desktop Agent by the Bridge. - * - * Metadata relating to the FDC3 Desktop Agent implementation and its provider. - */ -export interface DesktopAgentImplementationMetadata { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a particular Desktop - * Agent. - */ - desktopAgent: string; - /** - * The version number of the FDC3 specification that the implementation provides. - * The string must be a numeric semver version, e.g. 1.2 or 1.2.1. - */ - fdc3Version: string; - /** - * Metadata indicating whether the Desktop Agent implements optional features of - * the Desktop Agent API. - */ - optionalFeatures: OptionalFeatures; - /** - * The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, - * OpenFin etc.). - */ - provider: string; - /** - * The version of the provider of the Desktop Agent implementation (e.g. 5.3.0). - */ - providerVersion?: string; -} - -/** - * Identifies the type of the connection step message. - */ - -/** - * A response to a findInstances request that contains an error. - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface FindInstancesAgentErrorResponse { - meta: FindInstancesAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: PayloadClass; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findInstancesResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface FindInstancesAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface PayloadClass { - error: FindInstancesErrors; -} - -/** - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - * - * Should be set if the raiseIntent request returned an error. - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - * - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - * - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - */ -export type FindInstancesErrors = "DesktopAgentNotFound" | "IntentDeliveryFailed" | "MalformedContext" | "NoAppsFound" | "ResolverTimeout" | "ResolverUnavailable" | "TargetAppUnavailable" | "TargetInstanceUnavailable" | "UserCancelledResolution" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request for details of instances of a particular app - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface FindInstancesAgentRequest { - meta: FindInstancesAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindInstancesAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findInstancesRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface FindInstancesAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceIdentifier; - timestamp: Date; -} - -/** - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Represents identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - * - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface DestinationObject { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindInstancesAgentRequestPayload { - app: AppIdentifier; -} - -/** - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppIdentifier { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to a findInstances request. - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface FindInstancesAgentResponse { - meta: AgentResponseMetadata; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindInstancesAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findInstancesResponse"; -} - -/** - * The message payload contains a flag indicating whether the API call was successful, plus - * any return values for the FDC3 API function called, or indicating that the request - * resulted in an error and including a standardized error message. - * - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindInstancesAgentResponsePayload { - appIdentifiers: AppMetadata[]; -} - -/** - * Extends an `AppIdentifier`, describing an application or instance of an application, with - * additional descriptive metadata that is usually provided by an FDC3 App Directory that - * the Desktop Agent connects to. - * - * The additional information from an app directory can aid in rendering UI elements, such - * as a launcher menu or resolver UI. This includes a title, description, tooltip and icon - * and screenshot URLs. - * - * Note that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the - * `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc. - */ -export interface AppMetadata { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * A longer, multi-paragraph description for the application that could include markup. - */ - description?: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent?: string; - /** - * A list of icon URLs for the application that can be used to render UI elements. - */ - icons?: Icon[]; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - /** - * An optional set of, implementation specific, metadata fields that can be used to - * disambiguate instances, such as a window title or screen position. Must only be set if - * `instanceId` is set. - */ - instanceMetadata?: { [key: string]: any }; - /** - * The 'friendly' app name. - * This field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now - * require an `AppIdentifier` wth `appId` set. - * Note that for display purposes the `title` field should be used, if set, in preference to - * this field. - */ - name?: string; - /** - * The type of output returned for any intent specified during resolution. May express a - * particular context type (e.g. "fdc3.instrument"), channel (e.g. "channel") or a channel - * that will receive a specified type (e.g. "channel"). - */ - resultType?: null | string; - /** - * Images representing the app in common usage scenarios that can be used to render UI - * elements. - */ - screenshots?: Image[]; - /** - * A more user-friendly application title that can be used to render UI elements. - */ - title?: string; - /** - * A tooltip for the application that can be used to render UI elements. - */ - tooltip?: string; - /** - * The Version of the application. - */ - version?: string; -} - -/** - * Describes an Icon image that may be used to represent the application. - */ -export interface Icon { - /** - * The icon dimension, formatted as `x`. - */ - size?: string; - /** - * The icon url. - */ - src: string; - /** - * Icon media type. If not present the Desktop Agent may use the src file extension. - */ - type?: string; -} - -/** - * Describes an image file, typically a screenshot, that often represents the application in - * a common usage scenario. - */ -export interface Image { - /** - * Caption for the image. - */ - label?: string; - /** - * The image dimension, formatted as `x`. - */ - size?: string; - /** - * The image url. - */ - src: string; - /** - * Image media type. If not present the Desktop Agent may use the src file extension. - */ - type?: string; -} - -/** - * A response to a findInstances request that contains an error. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface FindInstancesBridgeErrorResponse { - meta: FindInstancesBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: MessagePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findInstancesResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface FindInstancesBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface MessagePayload { - error: FindInstancesErrors; -} - -/** - * A request for details of instances of a particular app - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface FindInstancesBridgeRequest { - meta: FindInstancesBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindInstancesBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findInstancesRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface FindInstancesBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSourceObject; - timestamp: Date; -} - -/** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - * - * Field that represents the source application that a request or response was received - * from, or the source Desktop Agent if it issued the request or response itself. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Represents identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - * - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - */ -export interface MetaSourceObject { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId?: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - * - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - */ - desktopAgent: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindInstancesBridgeRequestPayload { - app: AppIdentifier; -} - -/** - * A response to a findInstances request. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface FindInstancesBridgeResponse { - meta: BridgeResponseMessageMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindInstancesBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findInstancesResponse"; -} - -/** - * The message payload contains a flag indicating whether the API call was successful, plus - * any return values for the FDC3 API function called, or indicating that the request - * resulted in an error and including a standardized error message. - * - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindInstancesBridgeResponsePayload { - appIdentifiers: AppMetadata[]; -} - -/** - * A response to a findIntent request that contains an error. - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface FindIntentAgentErrorResponse { - meta: FindIntentAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: FindIntentAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface FindIntentAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface FindIntentAgentErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request for details of apps available to resolve a particular intent and context pair. - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface FindIntentAgentRequest { - meta: FindIntentAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface FindIntentAgentRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceIdentifier; - timestamp: Date; - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentAgentRequestPayload { - context?: Context; - intent: string; - resultType?: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to a findIntent request. - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface FindIntentAgentResponse { - meta: FindIntentAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindIntentAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface FindIntentAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindIntentAgentResponsePayload { - appIntent: AppIntent; -} - -/** - * An interface that relates an intent to apps. - */ -export interface AppIntent { - /** - * Details of applications that can resolve the intent. - */ - apps: AppMetadata[]; - /** - * Details of the intent whose relationship to resolving applications is being described. - */ - intent: IntentMetadata; -} - -/** - * Details of the intent whose relationship to resolving applications is being described. - * - * Metadata describing an Intent. - */ -export interface IntentMetadata { - /** - * Display name for the intent. - */ - displayName?: string; - /** - * The unique name of the intent that can be invoked by the raiseIntent call. - */ - name: string; -} - -/** - * A response to a findIntent request that contains an error. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface FindIntentBridgeErrorResponse { - meta: FindIntentBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: FindIntentBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface FindIntentBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface FindIntentBridgeErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * A request for details of apps available to resolve a particular intent and context pair. - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface FindIntentBridgeRequest { - meta: FindIntentBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface FindIntentBridgeRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: BridgeParticipantIdentifier; - timestamp: Date; - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentBridgeRequestPayload { - context?: Context; - intent: string; - resultType?: string; -} - -/** - * A response to a findIntent request. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface FindIntentBridgeResponse { - meta: FindIntentBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindIntentBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface FindIntentBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindIntentBridgeResponsePayload { - appIntent: AppIntent; -} - -/** - * A response to a findIntentsByContext request that contains an error. - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface FindIntentsByContextAgentErrorResponse { - meta: FindIntentsByContextAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: FindIntentsByContextAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentsByContextResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface FindIntentsByContextAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface FindIntentsByContextAgentErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request for details of intents and apps available to resolve them for a particular - * context. - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface FindIntentsByContextAgentRequest { - meta: FindIntentsByContextAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentsByContextAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentsByContextRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface FindIntentsByContextAgentRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentsByContextAgentRequestPayload { - context: Context; - resultType?: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to a findIntentsByContext request. - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface FindIntentsByContextAgentResponse { - meta: FindIntentsByContextAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindIntentsByContextAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentsByContextResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface FindIntentsByContextAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindIntentsByContextAgentResponsePayload { - appIntents: AppIntent[]; -} - -/** - * A response to a findIntentsByContext request that contains an error. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface FindIntentsByContextBridgeErrorResponse { - meta: FindIntentsByContextBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: FindIntentsByContextBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentsByContextResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface FindIntentsByContextBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface FindIntentsByContextBridgeErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * A request for details of intents and apps available to resolve them for a particular - * context. - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface FindIntentsByContextBridgeRequest { - meta: FindIntentsByContextBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: FindIntentsByContextBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "findIntentsByContextRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface FindIntentsByContextBridgeRequestMeta { - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: BridgeParticipantIdentifier; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface FindIntentsByContextBridgeRequestPayload { - context: Context; - resultType?: string; -} - -/** - * A response to a findIntentsByContext request. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface FindIntentsByContextBridgeResponse { - meta: FindIntentsByContextBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: FindIntentsByContextBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "findIntentsByContextResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface FindIntentsByContextBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface FindIntentsByContextBridgeResponsePayload { - appIntents: AppIntent[]; -} - -/** - * A response to a getAppMetadata request that contains an error. - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface GetAppMetadataAgentErrorResponse { - meta: GetAppMetadataAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: GetAppMetadataAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getAppMetadataResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface GetAppMetadataAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface GetAppMetadataAgentErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request for metadata about an app - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface GetAppMetadataAgentRequest { - meta: GetAppMetadataAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetAppMetadataAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getAppMetadataRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface GetAppMetadataAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceIdentifier; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetAppMetadataAgentRequestPayload { - app: AppObject; -} - -/** - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppObject { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to a getAppMetadata request. - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface GetAppMetadataAgentResponse { - meta: GetAppMetadataAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: GetAppMetadataAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getAppMetadataResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface GetAppMetadataAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface GetAppMetadataAgentResponsePayload { - appMetadata: AppMetadata; -} - -/** - * A response to a getAppMetadata request that contains an error. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface GetAppMetadataBridgeErrorResponse { - meta: GetAppMetadataBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: GetAppMetadataBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getAppMetadataResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface GetAppMetadataBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface GetAppMetadataBridgeErrorResponsePayload { - error: FindInstancesErrors; -} - -/** - * A request for metadata about an app - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface GetAppMetadataBridgeRequest { - meta: GetAppMetadataBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: GetAppMetadataBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "getAppMetadataRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface GetAppMetadataBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface GetAppMetadataBridgeRequestPayload { - app: AppObject; -} - -/** - * A response to a getAppMetadata request. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface GetAppMetadataBridgeResponse { - meta: GetAppMetadataBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: GetAppMetadataBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "getAppMetadataResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface GetAppMetadataBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface GetAppMetadataBridgeResponsePayload { - appMetadata: AppMetadata; -} - -/** - * A response to an open request that contains an error - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface OpenAgentErrorResponse { - meta: OpenAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: OpenAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "openResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface OpenAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface OpenAgentErrorResponsePayload { - error: OpenErrorResponsePayload; -} - -/** - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type OpenErrorResponsePayload = "AppNotFound" | "AppTimeout" | "DesktopAgentNotFound" | "ErrorOnLaunch" | "MalformedContext" | "ResolverUnavailable" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to open an application - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface OpenAgentRequest { - meta: OpenAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: OpenAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "openRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface OpenAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface OpenAgentRequestPayload { - /** - * The application to open on the specified Desktop Agent - */ - app: AppToOpen; - context?: Context; -} - -/** - * The application to open on the specified Desktop Agent - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppToOpen { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to an open request - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface OpenAgentResponse { - meta: OpenAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: OpenAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "openResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface OpenAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface OpenAgentResponsePayload { - appIdentifier: AppIdentifier; -} - -/** - * A response to an open request that contains an error - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface OpenBridgeErrorResponse { - meta: OpenBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: OpenBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "openResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface OpenBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface OpenBridgeErrorResponsePayload { - error: OpenErrorResponsePayload; -} - -/** - * A request to open an application - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface OpenBridgeRequest { - meta: OpenBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: OpenBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "openRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface OpenBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: DestinationObject; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface OpenBridgeRequestPayload { - /** - * The application to open on the specified Desktop Agent - */ - app: AppToOpen; - context?: Context; -} - -/** - * A response to an open request - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface OpenBridgeResponse { - meta: OpenBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: OpenBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "openResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface OpenBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface OpenBridgeResponsePayload { - appIdentifier: AppIdentifier; -} - -/** - * A request to broadcast on a PrivateChannel. - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelBroadcastAgentRequest { - meta: PrivateChannelBroadcastAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelBroadcastAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.broadcast"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelBroadcastAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - * - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - * - * Represents identifiers that MUST include the Desktop Agent name and MAY identify a - * specific app or instance. - * - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ -export interface MetaDestination { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelBroadcastAgentRequestPayload { - /** - * The Id of the PrivateChannel that the broadcast was sent on - */ - channelId: string; - /** - * The context object that was the payload of a broadcast message. - */ - context: Context; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to broadcast on a PrivateChannel. - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelBroadcastBridgeRequest { - meta: PrivateChannelBroadcastBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelBroadcastBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.broadcast"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface PrivateChannelBroadcastBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelBroadcastBridgeRequestPayload { - /** - * The Id of the PrivateChannel that the broadcast was sent on - */ - channelId: string; - /** - * The context object that was the payload of a broadcast message. - */ - context: Context; -} - -/** - * A request to forward on an EventListenerAdded event, relating to a PrivateChannel - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelEventListenerAddedAgentRequest { - meta: PrivateChannelEventListenerAddedAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelEventListenerAddedAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.eventListenerAdded"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelEventListenerAddedAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelEventListenerAddedAgentRequestPayload { - /** - * The id of the PrivateChannel that the event listener was added to. - */ - channelId: string; - listenerType: PrivateChannelEventListenerTypes; -} - -/** - * Event listener type names for Private Channel events. - */ -export type PrivateChannelEventListenerTypes = "onAddContextListener" | "onUnsubscribe" | "onDisconnect"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to forward on an EventListenerAdded event, relating to a PrivateChannel - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelEventListenerAddedBridgeRequest { - meta: PrivateChannelEventListenerAddedBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelEventListenerAddedBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.eventListenerAdded"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface PrivateChannelEventListenerAddedBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelEventListenerAddedBridgeRequestPayload { - /** - * The id of the PrivateChannel that the event listener was added to. - */ - channelId: string; - listenerType: PrivateChannelEventListenerTypes; -} - -/** - * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelEventListenerRemovedAgentRequest { - meta: PrivateChannelEventListenerRemovedAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelEventListenerRemovedAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.eventListenerRemoved"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelEventListenerRemovedAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelEventListenerRemovedAgentRequestPayload { - /** - * The id of the PrivateChannel that the event listener was removed from. - */ - channelId: string; - listenerType: PrivateChannelEventListenerTypes; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to forward on an EventListenerRemoved event, relating to a PrivateChannel - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelEventListenerRemovedBridgeRequest { - meta: PrivateChannelEventListenerRemovedBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelEventListenerRemovedBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.eventListenerRemoved"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface PrivateChannelEventListenerRemovedBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelEventListenerRemovedBridgeRequestPayload { - /** - * The id of the PrivateChannel that the event listener was removed from. - */ - channelId: string; - listenerType: PrivateChannelEventListenerTypes; -} - -/** - * A request to forward on an AddContextListener event, relating to a PrivateChannel - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelOnAddContextListenerAgentRequest { - meta: PrivateChannelOnAddContextListenerAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnAddContextListenerAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onAddContextListener"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelOnAddContextListenerAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnAddContextListenerAgentRequestPayload { - /** - * The id of the PrivateChannel that the context listener was added to. - */ - channelId: string; - /** - * The type of the context listener added. Should be null for an untyped listener. - */ - contextType: null | string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to forward on an AddContextListener event, relating to a PrivateChannel - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelOnAddContextListenerBridgeRequest { - meta: PrivateChannelOnAddContextListenerBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnAddContextListenerBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onAddContextListener"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface PrivateChannelOnAddContextListenerBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnAddContextListenerBridgeRequestPayload { - /** - * The id of the PrivateChannel that the context listener was added to. - */ - channelId: string; - /** - * The type of the context listener added. Should be null for an untyped listener. - */ - contextType: null | string; -} - -/** - * A request to forward on a Disconnect event, relating to a PrivateChannel - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelOnDisconnectAgentRequest { - meta: PrivateChannelOnDisconnectAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnDisconnectAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onDisconnect"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelOnDisconnectAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnDisconnectAgentRequestPayload { - /** - * The id of the PrivateChannel that the agent discconnected from. - */ - channelId: string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to forward on a Disconnect event, relating to a PrivateChannel - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelOnDisconnectBridgeRequest { - meta: PrivateChannelOnDisconnectBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnDisconnectBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onDisconnect"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface PrivateChannelOnDisconnectBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnDisconnectBridgeRequestPayload { - /** - * The id of the PrivateChannel that the agent discconnected from. - */ - channelId: string; -} - -/** - * A request to forward on an Unsubscribe event, relating to a PrivateChannel - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface PrivateChannelOnUnsubscribeAgentRequest { - meta: PrivateChannelOnUnsubscribeAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnUnsubscribeAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onUnsubscribe"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface PrivateChannelOnUnsubscribeAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source?: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnUnsubscribeAgentRequestPayload { - /** - * The id of the PrivateChannel that the context listener was unsubscribed from. - */ - channelId: string; - /** - * The type of the context listener that was unsubscribed. Should be null for an untyped - * listener. - */ - contextType: null | string; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to forward on an Unsubscribe event, relating to a PrivateChannel - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface PrivateChannelOnUnsubscribeBridgeRequest { - meta: ERequestMetadata; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: PrivateChannelOnUnsubscribeBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "PrivateChannel.onUnsubscribe"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface ERequestMetadata { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination?: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface PrivateChannelOnUnsubscribeBridgeRequestPayload { - /** - * The id of the PrivateChannel that the context listener was unsubscribed from. - */ - channelId: string; - /** - * The type of the context listener that was unsubscribed. Should be null for an untyped - * listener. - */ - contextType: null | string; -} - -/** - * A response to a request to raise an intent that contains an error. - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface RaiseIntentAgentErrorResponse { - meta: RaiseIntentAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: RaiseIntentAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface RaiseIntentAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Used if a raiseIntent request resulted in an error. - * - * Error message payload containing an standardized error string. - */ -export interface RaiseIntentAgentErrorResponsePayload { - /** - * Should be set if the raiseIntent request returned an error. - */ - error: FindInstancesErrors; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A request to raise an intent. - * - * A request message from a Desktop Agent to the Bridge. - */ -export interface RaiseIntentAgentRequest { - meta: RaiseIntentAgentRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: RaiseIntentAgentRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "raiseIntentRequest"; -} - -/** - * Metadata for a request message sent by Desktop Agents to the Bridge. - */ -export interface RaiseIntentAgentRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. - */ - source: SourceObject; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface RaiseIntentAgentRequestPayload { - app: AppDestinationIdentifier; - context: Context; - intent: string; -} - -/** - * Field that represents a destination App on a remote Desktop Agent that a request is to be - * sent to. - * - * Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios - * where a request needs to be directed to a Desktop Agent rather than a specific app, or a - * response message is returned by the Desktop Agent (or more specifically its resolver) - * rather than a specific app. Used as a substitute for `AppIdentifier` in cases where no - * app details are available or are appropriate. - * - * Array of DesktopAgentIdentifiers for responses that were not returned to the bridge - * before the timeout or because an error occurred. May be omitted if all sources responded - * without errors. MUST include the `desktopAgent` field when returned by the bridge. - * - * Array of DesktopAgentIdentifiers for the sources that generated responses to the request. - * Will contain a single value for individual responses and multiple values for responses - * that were collated by the bridge. May be omitted if all sources errored. MUST include the - * `desktopAgent` field when returned by the bridge. - * - * Field that represents a destination Desktop Agent that a request is to be sent to. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - * - * Field that represents the source application that a request or response was received - * from. - * - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ -export interface AppDestinationIdentifier { - /** - * Used in Desktop Agent Bridging to attribute or target a message to a - * particular Desktop Agent. - * - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent: string; - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A response to a request to raise an intent. - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface RaiseIntentAgentResponse { - meta: RaiseIntentAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: RaiseIntentAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface RaiseIntentAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface RaiseIntentAgentResponsePayload { - /** - * Used if the raiseIntent request was successfully resolved. - */ - intentResolution: IntentResolution; -} - -/** - * Used if the raiseIntent request was successfully resolved. - * - * IntentResolution provides a standard format for data returned upon resolving an intent. - * - * ```javascript - * //resolve a "Chain" type intent - * let resolution = await agent.raiseIntent("intentName", context); - * - * //resolve a "Client-Service" type intent with a data response or a Channel - * let resolution = await agent.raiseIntent("intentName", context); - * try { - * const result = await resolution.getResult(); - * if (result && result.broadcast) { - * console.log(`${resolution.source} returned a channel with id ${result.id}`); - * } else if (result){ - * console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`); - * } else { - * console.error(`${resolution.source} didn't return data` - * } - * } catch(error) { - * console.error(`${resolution.source} returned an error: ${error}`); - * } - * - * // Use metadata about the resolving app instance to target a further intent - * await agent.raiseIntent("intentName", context, resolution.source); - * ``` - */ -export interface IntentResolution { - /** - * The intent that was raised. May be used to determine which intent the user - * chose in response to `fdc3.raiseIntentForContext()`. - */ - intent: string; - /** - * Identifier for the app instance that was selected (or started) to resolve the intent. - * `source.instanceId` MUST be set, indicating the specific app instance that - * received the intent. - */ - source: AppIdentifier; -} - -/** - * A response to a request to raise an intent that contains an error. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface RaiseIntentBridgeErrorResponse { - meta: RaiseIntentBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: RaiseIntentBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface RaiseIntentBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Used if a raiseIntent request resulted in an error. - * - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface RaiseIntentBridgeErrorResponsePayload { - /** - * Should be set if the raiseIntent request returned an error. - */ - error: FindInstancesErrors; -} - -/** - * A request to raise an intent. - * - * A request message forwarded from the Bridge onto a Desktop Agent connected to it. - */ -export interface RaiseIntentBridgeRequest { - meta: RaiseIntentBridgeRequestMeta; - /** - * The message payload typically contains the arguments to FDC3 API functions. - */ - payload: RaiseIntentBridgeRequestPayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Request' appended. - */ - type: "raiseIntentRequest"; -} - -/** - * Metadata required in a request message forwarded on by the Bridge - */ -export interface RaiseIntentBridgeRequestMeta { - /** - * Optional field that represents the destination that the request should be routed to. Must - * be set by the Desktop Agent for API calls that include a target app parameter and must - * include the name of the Desktop Agent hosting the target application. - */ - destination: MetaDestination; - requestUuid: string; - /** - * Field that represents the source application that the request was received from, or the - * source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST - * be set by the bridge. - */ - source: MetaSource; - timestamp: Date; -} - -/** - * The message payload typically contains the arguments to FDC3 API functions. - */ -export interface RaiseIntentBridgeRequestPayload { - app: AppDestinationIdentifier; - context: Context; - intent: string; -} - -/** - * A response to a request to raise an intent. - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface RaiseIntentBridgeResponse { - meta: RaiseIntentBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: RaiseIntentBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface RaiseIntentBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface RaiseIntentBridgeResponsePayload { - /** - * Used if the raiseIntent request was successfully resolved. - */ - intentResolution: IntentResolution; -} - -/** - * A secondary response to a request to raise an intent used to deliver the intent result, - * which contains an error - * - * A response message from a Desktop Agent to the Bridge containing an error, to be used in - * preference to the standard response when an error needs to be returned. - */ -export interface RaiseIntentResultAgentErrorResponse { - meta: RaiseIntentResultAgentErrorResponseMeta; - /** - * Error message payload containing an standardized error string. - */ - payload: RaiseIntentResultAgentErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResultResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface RaiseIntentResultAgentErrorResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * Error message payload containing an standardized error string. - */ -export interface RaiseIntentResultAgentErrorResponsePayload { - error: RaiseIntentResultErrorMessage; -} - -/** - * Array of error message strings for responses that were not returned to the bridge before - * the timeout or because an error occurred. Should be the same length as the `errorSources` - * array and ordered the same. May be omitted if all sources responded without errors. - * - * Constants representing the errors that can be encountered when calling the `open` method - * on the DesktopAgent object (`fdc3`). - * - * Constants representing the errors that can be encountered when calling the `findIntent`, - * `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the - * DesktopAgent (`fdc3`). - */ -export type RaiseIntentResultErrorMessage = "IntentHandlerRejected" | "NoResultReturned" | "AgentDisconnected" | "NotConnectedToBridge" | "ResponseToBridgeTimedOut" | "MalformedMessage"; - -/** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - * - * Unique identifier for a request or event message. Required in all message types. - * - * Unique identifier for a response to a specific message and must always be accompanied by - * a RequestUuid. - */ - -/** - * A secondary response to a request to raise an intent used to deliver the intent result - * - * A response message from a Desktop Agent to the Bridge. - */ -export interface RaiseIntentResultAgentResponse { - meta: RaiseIntentResultAgentResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: RaiseIntentResultAgentResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResultResponse"; -} - -/** - * Metadata for a response messages sent by a Desktop Agent to the Bridge - */ -export interface RaiseIntentResultAgentResponseMeta { - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface RaiseIntentResultAgentResponsePayload { - intentResult: IntentResult; -} - -export interface IntentResult { - context?: Context; - channel?: Channel; -} - -/** - * Represents a context channel that applications can use to send and receive - * context data. - * - * Please note that There are differences in behavior when you interact with a - * User channel via the `DesktopAgent` interface and the `Channel` interface. - * Specifically, when 'joining' a User channel or adding a context listener - * when already joined to a channel via the `DesktopAgent` interface, existing - * context (matching the type of the context listener) on the channel is - * received by the context listener immediately. Whereas, when a context - * listener is added via the Channel interface, context is not received - * automatically, but may be retrieved manually via the `getCurrentContext()` - * function. - */ -export interface Channel { - /** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - */ - displayMetadata?: DisplayMetadata; - /** - * Constant that uniquely identifies this channel. - */ - id: string; - /** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". - */ - type: Type; -} - -/** - * Channels may be visualized and selectable by users. DisplayMetadata may be used to - * provide hints on how to see them. - * For App channels, displayMetadata would typically not be present. - * - * A system channel will be global enough to have a presence across many apps. This gives us - * some hints - * to render them in a standard way. It is assumed it may have other properties too, but if - * it has these, - * this is their meaning. - */ -export interface DisplayMetadata { - /** - * The color that should be associated within this channel when displaying this channel in a - * UI, e.g: `0xFF0000`. - */ - color?: string; - /** - * A URL of an image that can be used to display this channel. - */ - glyph?: string; - /** - * A user-readable name for this channel, e.g: `"Red"`. - */ - name?: string; -} - -/** - * Uniquely defines each channel type. - * Can be "user", "app" or "private". - */ -export type Type = "app" | "private" | "user"; - -/** - * A secondary response to a request to raise an intent used to deliver the intent result, - * which contains an error - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request, used where all connected agents returned errors. - */ -export interface RaiseIntentResultBridgeErrorResponse { - meta: RaiseIntentResultBridgeErrorResponseMeta; - /** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ - payload: RaiseIntentResultBridgeErrorResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResultResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface RaiseIntentResultBridgeErrorResponseMeta { - errorDetails: ResponseErrorDetail[]; - errorSources: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - timestamp: Date; -} - -/** - * The error message payload contains details of an error return to the app or agent that - * raised the original request. - */ -export interface RaiseIntentResultBridgeErrorResponsePayload { - error: RaiseIntentResultErrorMessage; -} - -/** - * A secondary response to a request to raise an intent used to deliver the intent result - * - * A response message from the Bridge back to the original Desktop Agent that raised the - * request. - */ -export interface RaiseIntentResultBridgeResponse { - meta: RaiseIntentResultBridgeResponseMeta; - /** - * The message payload typically contains return values for FDC3 API functions. - */ - payload: RaiseIntentResultBridgeResponsePayload; - /** - * Identifies the type of the message and it is typically set to the FDC3 function name that - * the message relates to, e.g. 'findIntent', with 'Response' appended. - */ - type: "raiseIntentResultResponse"; -} - -/** - * Metadata required in a response message collated and/or forwarded on by the Bridge - */ -export interface RaiseIntentResultBridgeResponseMeta { - errorDetails?: ResponseErrorDetail[]; - errorSources?: DesktopAgentIdentifier[]; - requestUuid: string; - responseUuid: string; - sources?: DesktopAgentIdentifier[]; - timestamp: Date; -} - -/** - * The message payload typically contains return values for FDC3 API functions. - */ -export interface RaiseIntentResultBridgeResponsePayload { - intentResult: IntentResult; -} - -// Converts JSON strings to/from your types -// and asserts the results of JSON.parse at runtime -export class Convert { - public static toAgentErrorResponseMessage(json: string): AgentErrorResponseMessage { - return cast(JSON.parse(json), r("AgentErrorResponseMessage")); - } - - public static agentErrorResponseMessageToJson(value: AgentErrorResponseMessage): string { - return JSON.stringify(uncast(value, r("AgentErrorResponseMessage")), null, 2); - } - - public static toAgentRequestMessage(json: string): AgentRequestMessage { - return cast(JSON.parse(json), r("AgentRequestMessage")); - } - - public static agentRequestMessageToJson(value: AgentRequestMessage): string { - return JSON.stringify(uncast(value, r("AgentRequestMessage")), null, 2); - } - - public static toAgentResponseMessage(json: string): AgentResponseMessage { - return cast(JSON.parse(json), r("AgentResponseMessage")); - } - - public static agentResponseMessageToJson(value: AgentResponseMessage): string { - return JSON.stringify(uncast(value, r("AgentResponseMessage")), null, 2); - } - - public static toBridgeErrorResponseMessage(json: string): BridgeErrorResponseMessage { - return cast(JSON.parse(json), r("BridgeErrorResponseMessage")); - } - - public static bridgeErrorResponseMessageToJson(value: BridgeErrorResponseMessage): string { - return JSON.stringify(uncast(value, r("BridgeErrorResponseMessage")), null, 2); - } - - public static toBridgeRequestMessage(json: string): BridgeRequestMessage { - return cast(JSON.parse(json), r("BridgeRequestMessage")); - } - - public static bridgeRequestMessageToJson(value: BridgeRequestMessage): string { - return JSON.stringify(uncast(value, r("BridgeRequestMessage")), null, 2); - } - - public static toBridgeResponseMessage(json: string): BridgeResponseMessage { - return cast(JSON.parse(json), r("BridgeResponseMessage")); - } - - public static bridgeResponseMessageToJson(value: BridgeResponseMessage): string { - return JSON.stringify(uncast(value, r("BridgeResponseMessage")), null, 2); - } - - public static toBroadcastAgentRequest(json: string): BroadcastAgentRequest { - return cast(JSON.parse(json), r("BroadcastAgentRequest")); - } - - public static broadcastAgentRequestToJson(value: BroadcastAgentRequest): string { - return JSON.stringify(uncast(value, r("BroadcastAgentRequest")), null, 2); - } - - public static toBroadcastBridgeRequest(json: string): BroadcastBridgeRequest { - return cast(JSON.parse(json), r("BroadcastBridgeRequest")); - } - - public static broadcastBridgeRequestToJson(value: BroadcastBridgeRequest): string { - return JSON.stringify(uncast(value, r("BroadcastBridgeRequest")), null, 2); - } - - public static toBridgeCommonDefinitions(json: string): { [key: string]: any } { - return cast(JSON.parse(json), m("any")); - } - - public static bridgeCommonDefinitionsToJson(value: { [key: string]: any }): string { - return JSON.stringify(uncast(value, m("any")), null, 2); - } - - public static toConnectionStepMessage(json: string): ConnectionStepMessage { - return cast(JSON.parse(json), r("ConnectionStepMessage")); - } - - public static connectionStepMessageToJson(value: ConnectionStepMessage): string { - return JSON.stringify(uncast(value, r("ConnectionStepMessage")), null, 2); - } - - public static toConnectionStep2Hello(json: string): ConnectionStep2Hello { - return cast(JSON.parse(json), r("ConnectionStep2Hello")); - } - - public static connectionStep2HelloToJson(value: ConnectionStep2Hello): string { - return JSON.stringify(uncast(value, r("ConnectionStep2Hello")), null, 2); - } - - public static toConnectionStep3Handshake(json: string): ConnectionStep3Handshake { - return cast(JSON.parse(json), r("ConnectionStep3Handshake")); - } - - public static connectionStep3HandshakeToJson(value: ConnectionStep3Handshake): string { - return JSON.stringify(uncast(value, r("ConnectionStep3Handshake")), null, 2); - } - - public static toConnectionStep4AuthenticationFailed(json: string): ConnectionStep4AuthenticationFailed { - return cast(JSON.parse(json), r("ConnectionStep4AuthenticationFailed")); - } - - public static connectionStep4AuthenticationFailedToJson(value: ConnectionStep4AuthenticationFailed): string { - return JSON.stringify(uncast(value, r("ConnectionStep4AuthenticationFailed")), null, 2); - } - - public static toConnectionStep6ConnectedAgentsUpdate(json: string): ConnectionStep6ConnectedAgentsUpdate { - return cast(JSON.parse(json), r("ConnectionStep6ConnectedAgentsUpdate")); - } - - public static connectionStep6ConnectedAgentsUpdateToJson(value: ConnectionStep6ConnectedAgentsUpdate): string { - return JSON.stringify(uncast(value, r("ConnectionStep6ConnectedAgentsUpdate")), null, 2); - } - - public static toFindInstancesAgentErrorResponse(json: string): FindInstancesAgentErrorResponse { - return cast(JSON.parse(json), r("FindInstancesAgentErrorResponse")); - } - - public static findInstancesAgentErrorResponseToJson(value: FindInstancesAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("FindInstancesAgentErrorResponse")), null, 2); - } - - public static toFindInstancesAgentRequest(json: string): FindInstancesAgentRequest { - return cast(JSON.parse(json), r("FindInstancesAgentRequest")); - } - - public static findInstancesAgentRequestToJson(value: FindInstancesAgentRequest): string { - return JSON.stringify(uncast(value, r("FindInstancesAgentRequest")), null, 2); - } - - public static toFindInstancesAgentResponse(json: string): FindInstancesAgentResponse { - return cast(JSON.parse(json), r("FindInstancesAgentResponse")); - } - - public static findInstancesAgentResponseToJson(value: FindInstancesAgentResponse): string { - return JSON.stringify(uncast(value, r("FindInstancesAgentResponse")), null, 2); - } - - public static toFindInstancesBridgeErrorResponse(json: string): FindInstancesBridgeErrorResponse { - return cast(JSON.parse(json), r("FindInstancesBridgeErrorResponse")); - } - - public static findInstancesBridgeErrorResponseToJson(value: FindInstancesBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("FindInstancesBridgeErrorResponse")), null, 2); - } - - public static toFindInstancesBridgeRequest(json: string): FindInstancesBridgeRequest { - return cast(JSON.parse(json), r("FindInstancesBridgeRequest")); - } - - public static findInstancesBridgeRequestToJson(value: FindInstancesBridgeRequest): string { - return JSON.stringify(uncast(value, r("FindInstancesBridgeRequest")), null, 2); - } - - public static toFindInstancesBridgeResponse(json: string): FindInstancesBridgeResponse { - return cast(JSON.parse(json), r("FindInstancesBridgeResponse")); - } - - public static findInstancesBridgeResponseToJson(value: FindInstancesBridgeResponse): string { - return JSON.stringify(uncast(value, r("FindInstancesBridgeResponse")), null, 2); - } - - public static toFindIntentAgentErrorResponse(json: string): FindIntentAgentErrorResponse { - return cast(JSON.parse(json), r("FindIntentAgentErrorResponse")); - } - - public static findIntentAgentErrorResponseToJson(value: FindIntentAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("FindIntentAgentErrorResponse")), null, 2); - } - - public static toFindIntentAgentRequest(json: string): FindIntentAgentRequest { - return cast(JSON.parse(json), r("FindIntentAgentRequest")); - } - - public static findIntentAgentRequestToJson(value: FindIntentAgentRequest): string { - return JSON.stringify(uncast(value, r("FindIntentAgentRequest")), null, 2); - } - - public static toFindIntentAgentResponse(json: string): FindIntentAgentResponse { - return cast(JSON.parse(json), r("FindIntentAgentResponse")); - } - - public static findIntentAgentResponseToJson(value: FindIntentAgentResponse): string { - return JSON.stringify(uncast(value, r("FindIntentAgentResponse")), null, 2); - } - - public static toFindIntentBridgeErrorResponse(json: string): FindIntentBridgeErrorResponse { - return cast(JSON.parse(json), r("FindIntentBridgeErrorResponse")); - } - - public static findIntentBridgeErrorResponseToJson(value: FindIntentBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("FindIntentBridgeErrorResponse")), null, 2); - } - - public static toFindIntentBridgeRequest(json: string): FindIntentBridgeRequest { - return cast(JSON.parse(json), r("FindIntentBridgeRequest")); - } - - public static findIntentBridgeRequestToJson(value: FindIntentBridgeRequest): string { - return JSON.stringify(uncast(value, r("FindIntentBridgeRequest")), null, 2); - } - - public static toFindIntentBridgeResponse(json: string): FindIntentBridgeResponse { - return cast(JSON.parse(json), r("FindIntentBridgeResponse")); - } - - public static findIntentBridgeResponseToJson(value: FindIntentBridgeResponse): string { - return JSON.stringify(uncast(value, r("FindIntentBridgeResponse")), null, 2); - } - - public static toFindIntentsByContextAgentErrorResponse(json: string): FindIntentsByContextAgentErrorResponse { - return cast(JSON.parse(json), r("FindIntentsByContextAgentErrorResponse")); - } - - public static findIntentsByContextAgentErrorResponseToJson(value: FindIntentsByContextAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextAgentErrorResponse")), null, 2); - } - - public static toFindIntentsByContextAgentRequest(json: string): FindIntentsByContextAgentRequest { - return cast(JSON.parse(json), r("FindIntentsByContextAgentRequest")); - } - - public static findIntentsByContextAgentRequestToJson(value: FindIntentsByContextAgentRequest): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextAgentRequest")), null, 2); - } - - public static toFindIntentsByContextAgentResponse(json: string): FindIntentsByContextAgentResponse { - return cast(JSON.parse(json), r("FindIntentsByContextAgentResponse")); - } - - public static findIntentsByContextAgentResponseToJson(value: FindIntentsByContextAgentResponse): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextAgentResponse")), null, 2); - } - - public static toFindIntentsByContextBridgeErrorResponse(json: string): FindIntentsByContextBridgeErrorResponse { - return cast(JSON.parse(json), r("FindIntentsByContextBridgeErrorResponse")); - } - - public static findIntentsByContextBridgeErrorResponseToJson(value: FindIntentsByContextBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextBridgeErrorResponse")), null, 2); - } - - public static toFindIntentsByContextBridgeRequest(json: string): FindIntentsByContextBridgeRequest { - return cast(JSON.parse(json), r("FindIntentsByContextBridgeRequest")); - } - - public static findIntentsByContextBridgeRequestToJson(value: FindIntentsByContextBridgeRequest): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextBridgeRequest")), null, 2); - } - - public static toFindIntentsByContextBridgeResponse(json: string): FindIntentsByContextBridgeResponse { - return cast(JSON.parse(json), r("FindIntentsByContextBridgeResponse")); - } - - public static findIntentsByContextBridgeResponseToJson(value: FindIntentsByContextBridgeResponse): string { - return JSON.stringify(uncast(value, r("FindIntentsByContextBridgeResponse")), null, 2); - } - - public static toGetAppMetadataAgentErrorResponse(json: string): GetAppMetadataAgentErrorResponse { - return cast(JSON.parse(json), r("GetAppMetadataAgentErrorResponse")); - } - - public static getAppMetadataAgentErrorResponseToJson(value: GetAppMetadataAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("GetAppMetadataAgentErrorResponse")), null, 2); - } - - public static toGetAppMetadataAgentRequest(json: string): GetAppMetadataAgentRequest { - return cast(JSON.parse(json), r("GetAppMetadataAgentRequest")); - } - - public static getAppMetadataAgentRequestToJson(value: GetAppMetadataAgentRequest): string { - return JSON.stringify(uncast(value, r("GetAppMetadataAgentRequest")), null, 2); - } - - public static toGetAppMetadataAgentResponse(json: string): GetAppMetadataAgentResponse { - return cast(JSON.parse(json), r("GetAppMetadataAgentResponse")); - } - - public static getAppMetadataAgentResponseToJson(value: GetAppMetadataAgentResponse): string { - return JSON.stringify(uncast(value, r("GetAppMetadataAgentResponse")), null, 2); - } - - public static toGetAppMetadataBridgeErrorResponse(json: string): GetAppMetadataBridgeErrorResponse { - return cast(JSON.parse(json), r("GetAppMetadataBridgeErrorResponse")); - } - - public static getAppMetadataBridgeErrorResponseToJson(value: GetAppMetadataBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("GetAppMetadataBridgeErrorResponse")), null, 2); - } - - public static toGetAppMetadataBridgeRequest(json: string): GetAppMetadataBridgeRequest { - return cast(JSON.parse(json), r("GetAppMetadataBridgeRequest")); - } - - public static getAppMetadataBridgeRequestToJson(value: GetAppMetadataBridgeRequest): string { - return JSON.stringify(uncast(value, r("GetAppMetadataBridgeRequest")), null, 2); - } - - public static toGetAppMetadataBridgeResponse(json: string): GetAppMetadataBridgeResponse { - return cast(JSON.parse(json), r("GetAppMetadataBridgeResponse")); - } - - public static getAppMetadataBridgeResponseToJson(value: GetAppMetadataBridgeResponse): string { - return JSON.stringify(uncast(value, r("GetAppMetadataBridgeResponse")), null, 2); - } - - public static toOpenAgentErrorResponse(json: string): OpenAgentErrorResponse { - return cast(JSON.parse(json), r("OpenAgentErrorResponse")); - } - - public static openAgentErrorResponseToJson(value: OpenAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("OpenAgentErrorResponse")), null, 2); - } - - public static toOpenAgentRequest(json: string): OpenAgentRequest { - return cast(JSON.parse(json), r("OpenAgentRequest")); - } - - public static openAgentRequestToJson(value: OpenAgentRequest): string { - return JSON.stringify(uncast(value, r("OpenAgentRequest")), null, 2); - } - - public static toOpenAgentResponse(json: string): OpenAgentResponse { - return cast(JSON.parse(json), r("OpenAgentResponse")); - } - - public static openAgentResponseToJson(value: OpenAgentResponse): string { - return JSON.stringify(uncast(value, r("OpenAgentResponse")), null, 2); - } - - public static toOpenBridgeErrorResponse(json: string): OpenBridgeErrorResponse { - return cast(JSON.parse(json), r("OpenBridgeErrorResponse")); - } - - public static openBridgeErrorResponseToJson(value: OpenBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("OpenBridgeErrorResponse")), null, 2); - } - - public static toOpenBridgeRequest(json: string): OpenBridgeRequest { - return cast(JSON.parse(json), r("OpenBridgeRequest")); - } - - public static openBridgeRequestToJson(value: OpenBridgeRequest): string { - return JSON.stringify(uncast(value, r("OpenBridgeRequest")), null, 2); - } - - public static toOpenBridgeResponse(json: string): OpenBridgeResponse { - return cast(JSON.parse(json), r("OpenBridgeResponse")); - } - - public static openBridgeResponseToJson(value: OpenBridgeResponse): string { - return JSON.stringify(uncast(value, r("OpenBridgeResponse")), null, 2); - } - - public static toPrivateChannelBroadcastAgentRequest(json: string): PrivateChannelBroadcastAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelBroadcastAgentRequest")); - } - - public static privateChannelBroadcastAgentRequestToJson(value: PrivateChannelBroadcastAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelBroadcastAgentRequest")), null, 2); - } - - public static toPrivateChannelBroadcastBridgeRequest(json: string): PrivateChannelBroadcastBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelBroadcastBridgeRequest")); - } - - public static privateChannelBroadcastBridgeRequestToJson(value: PrivateChannelBroadcastBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelBroadcastBridgeRequest")), null, 2); - } - - public static toPrivateChannelEventListenerAddedAgentRequest(json: string): PrivateChannelEventListenerAddedAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelEventListenerAddedAgentRequest")); - } - - public static privateChannelEventListenerAddedAgentRequestToJson(value: PrivateChannelEventListenerAddedAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelEventListenerAddedAgentRequest")), null, 2); - } - - public static toPrivateChannelEventListenerAddedBridgeRequest(json: string): PrivateChannelEventListenerAddedBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelEventListenerAddedBridgeRequest")); - } - - public static privateChannelEventListenerAddedBridgeRequestToJson(value: PrivateChannelEventListenerAddedBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelEventListenerAddedBridgeRequest")), null, 2); - } - - public static toPrivateChannelEventListenerRemovedAgentRequest(json: string): PrivateChannelEventListenerRemovedAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelEventListenerRemovedAgentRequest")); - } - - public static privateChannelEventListenerRemovedAgentRequestToJson(value: PrivateChannelEventListenerRemovedAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelEventListenerRemovedAgentRequest")), null, 2); - } - - public static toPrivateChannelEventListenerRemovedBridgeRequest(json: string): PrivateChannelEventListenerRemovedBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelEventListenerRemovedBridgeRequest")); - } - - public static privateChannelEventListenerRemovedBridgeRequestToJson(value: PrivateChannelEventListenerRemovedBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelEventListenerRemovedBridgeRequest")), null, 2); - } - - public static toPrivateChannelOnAddContextListenerAgentRequest(json: string): PrivateChannelOnAddContextListenerAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelOnAddContextListenerAgentRequest")); - } - - public static privateChannelOnAddContextListenerAgentRequestToJson(value: PrivateChannelOnAddContextListenerAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnAddContextListenerAgentRequest")), null, 2); - } - - public static toPrivateChannelOnAddContextListenerBridgeRequest(json: string): PrivateChannelOnAddContextListenerBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelOnAddContextListenerBridgeRequest")); - } - - public static privateChannelOnAddContextListenerBridgeRequestToJson(value: PrivateChannelOnAddContextListenerBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnAddContextListenerBridgeRequest")), null, 2); - } - - public static toPrivateChannelOnDisconnectAgentRequest(json: string): PrivateChannelOnDisconnectAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelOnDisconnectAgentRequest")); - } - - public static privateChannelOnDisconnectAgentRequestToJson(value: PrivateChannelOnDisconnectAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnDisconnectAgentRequest")), null, 2); - } - - public static toPrivateChannelOnDisconnectBridgeRequest(json: string): PrivateChannelOnDisconnectBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelOnDisconnectBridgeRequest")); - } - - public static privateChannelOnDisconnectBridgeRequestToJson(value: PrivateChannelOnDisconnectBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnDisconnectBridgeRequest")), null, 2); - } - - public static toPrivateChannelOnUnsubscribeAgentRequest(json: string): PrivateChannelOnUnsubscribeAgentRequest { - return cast(JSON.parse(json), r("PrivateChannelOnUnsubscribeAgentRequest")); - } - - public static privateChannelOnUnsubscribeAgentRequestToJson(value: PrivateChannelOnUnsubscribeAgentRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnUnsubscribeAgentRequest")), null, 2); - } - - public static toPrivateChannelOnUnsubscribeBridgeRequest(json: string): PrivateChannelOnUnsubscribeBridgeRequest { - return cast(JSON.parse(json), r("PrivateChannelOnUnsubscribeBridgeRequest")); - } - - public static privateChannelOnUnsubscribeBridgeRequestToJson(value: PrivateChannelOnUnsubscribeBridgeRequest): string { - return JSON.stringify(uncast(value, r("PrivateChannelOnUnsubscribeBridgeRequest")), null, 2); - } - - public static toRaiseIntentAgentErrorResponse(json: string): RaiseIntentAgentErrorResponse { - return cast(JSON.parse(json), r("RaiseIntentAgentErrorResponse")); - } - - public static raiseIntentAgentErrorResponseToJson(value: RaiseIntentAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentAgentErrorResponse")), null, 2); - } - - public static toRaiseIntentAgentRequest(json: string): RaiseIntentAgentRequest { - return cast(JSON.parse(json), r("RaiseIntentAgentRequest")); - } - - public static raiseIntentAgentRequestToJson(value: RaiseIntentAgentRequest): string { - return JSON.stringify(uncast(value, r("RaiseIntentAgentRequest")), null, 2); - } - - public static toRaiseIntentAgentResponse(json: string): RaiseIntentAgentResponse { - return cast(JSON.parse(json), r("RaiseIntentAgentResponse")); - } - - public static raiseIntentAgentResponseToJson(value: RaiseIntentAgentResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentAgentResponse")), null, 2); - } - - public static toRaiseIntentBridgeErrorResponse(json: string): RaiseIntentBridgeErrorResponse { - return cast(JSON.parse(json), r("RaiseIntentBridgeErrorResponse")); - } - - public static raiseIntentBridgeErrorResponseToJson(value: RaiseIntentBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentBridgeErrorResponse")), null, 2); - } - - public static toRaiseIntentBridgeRequest(json: string): RaiseIntentBridgeRequest { - return cast(JSON.parse(json), r("RaiseIntentBridgeRequest")); - } - - public static raiseIntentBridgeRequestToJson(value: RaiseIntentBridgeRequest): string { - return JSON.stringify(uncast(value, r("RaiseIntentBridgeRequest")), null, 2); - } - - public static toRaiseIntentBridgeResponse(json: string): RaiseIntentBridgeResponse { - return cast(JSON.parse(json), r("RaiseIntentBridgeResponse")); - } - - public static raiseIntentBridgeResponseToJson(value: RaiseIntentBridgeResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentBridgeResponse")), null, 2); - } - - public static toRaiseIntentResultAgentErrorResponse(json: string): RaiseIntentResultAgentErrorResponse { - return cast(JSON.parse(json), r("RaiseIntentResultAgentErrorResponse")); - } - - public static raiseIntentResultAgentErrorResponseToJson(value: RaiseIntentResultAgentErrorResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResultAgentErrorResponse")), null, 2); - } - - public static toRaiseIntentResultAgentResponse(json: string): RaiseIntentResultAgentResponse { - return cast(JSON.parse(json), r("RaiseIntentResultAgentResponse")); - } - - public static raiseIntentResultAgentResponseToJson(value: RaiseIntentResultAgentResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResultAgentResponse")), null, 2); - } - - public static toRaiseIntentResultBridgeErrorResponse(json: string): RaiseIntentResultBridgeErrorResponse { - return cast(JSON.parse(json), r("RaiseIntentResultBridgeErrorResponse")); - } - - public static raiseIntentResultBridgeErrorResponseToJson(value: RaiseIntentResultBridgeErrorResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResultBridgeErrorResponse")), null, 2); - } - - public static toRaiseIntentResultBridgeResponse(json: string): RaiseIntentResultBridgeResponse { - return cast(JSON.parse(json), r("RaiseIntentResultBridgeResponse")); - } - - public static raiseIntentResultBridgeResponseToJson(value: RaiseIntentResultBridgeResponse): string { - return JSON.stringify(uncast(value, r("RaiseIntentResultBridgeResponse")), null, 2); - } -} - -function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { - const prettyTyp = prettyTypeName(typ); - const parentText = parent ? ` on ${parent}` : ''; - const keyText = key ? ` for key "${key}"` : ''; - throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); -} - -function prettyTypeName(typ: any): string { - if (Array.isArray(typ)) { - if (typ.length === 2 && typ[0] === undefined) { - return `an optional ${prettyTypeName(typ[1])}`; - } else { - return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`; - } - } else if (typeof typ === "object" && typ.literal !== undefined) { - return typ.literal; - } else { - return typeof typ; - } -} - -function jsonToJSProps(typ: any): any { - if (typ.jsonToJS === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ }); - typ.jsonToJS = map; - } - return typ.jsonToJS; -} - -function jsToJSONProps(typ: any): any { - if (typ.jsToJSON === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ }); - typ.jsToJSON = map; - } - return typ.jsToJSON; -} - -function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { - function transformPrimitive(typ: string, val: any): any { - if (typeof typ === typeof val) return val; - return invalidValue(typ, val, key, parent); - } - - function transformUnion(typs: any[], val: any): any { - // val must validate against one typ in typs - const l = typs.length; - for (let i = 0; i < l; i++) { - const typ = typs[i]; - try { - return transform(val, typ, getProps); - } catch (_) {} - } - return invalidValue(typs, val, key, parent); - } - - function transformEnum(cases: string[], val: any): any { - if (cases.indexOf(val) !== -1) return val; - return invalidValue(cases.map(a => { return l(a); }), val, key, parent); - } - - function transformArray(typ: any, val: any): any { - // val must be an array with no invalid elements - if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent); - return val.map(el => transform(el, typ, getProps)); - } - - function transformDate(val: any): any { - if (val === null) { - return null; - } - const d = new Date(val); - if (isNaN(d.valueOf())) { - return invalidValue(l("Date"), val, key, parent); - } - return d; - } - - function transformObject(props: { [k: string]: any }, additional: any, val: any): any { - if (val === null || typeof val !== "object" || Array.isArray(val)) { - return invalidValue(l(ref || "object"), val, key, parent); - } - const result: any = {}; - Object.getOwnPropertyNames(props).forEach(key => { - const prop = props[key]; - const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; - result[prop.key] = transform(v, prop.typ, getProps, key, ref); - }); - Object.getOwnPropertyNames(val).forEach(key => { - if (!Object.prototype.hasOwnProperty.call(props, key)) { - result[key] = transform(val[key], additional, getProps, key, ref); - } - }); - return result; - } - - if (typ === "any") return val; - if (typ === null) { - if (val === null) return val; - return invalidValue(typ, val, key, parent); - } - if (typ === false) return invalidValue(typ, val, key, parent); - let ref: any = undefined; - while (typeof typ === "object" && typ.ref !== undefined) { - ref = typ.ref; - typ = typeMap[typ.ref]; - } - if (Array.isArray(typ)) return transformEnum(typ, val); - if (typeof typ === "object") { - return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) - : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) - : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) - : invalidValue(typ, val, key, parent); - } - // Numbers can be parsed by Date but shouldn't be. - if (typ === Date && typeof val !== "number") return transformDate(val); - return transformPrimitive(typ, val); -} - -function cast(val: any, typ: any): T { - return transform(val, typ, jsonToJSProps); -} - -function uncast(val: T, typ: any): any { - return transform(val, typ, jsToJSONProps); -} - -function l(typ: any) { - return { literal: typ }; -} - -function a(typ: any) { - return { arrayItems: typ }; -} - -function u(...typs: any[]) { - return { unionMembers: typs }; -} - -function o(props: any[], additional: any) { - return { props, additional }; -} - -function m(additional: any) { - return { props: [], additional }; -} - -function r(name: string) { - return { ref: name }; -} - -const typeMap: any = { - "AgentErrorResponseMessage": o([ - { json: "meta", js: "meta", typ: r("AgentResponseMetadata") }, - { json: "payload", js: "payload", typ: r("ErrorResponseMessagePayload") }, - { json: "type", js: "type", typ: r("ResponseMessageType") }, - ], false), - "AgentResponseMetadata": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ErrorResponseMessagePayload": o([ - { json: "error", js: "error", typ: r("ResponseErrorDetail") }, - ], "any"), - "AgentRequestMessage": o([ - { json: "meta", js: "meta", typ: r("AgentRequestMetadata") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: r("RequestMessageType") }, - ], false), - "AgentRequestMetadata": o([ - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "BridgeParticipantIdentifier": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "SourceIdentifier": o([ - { json: "appId", js: "appId", typ: u(undefined, "") }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "AgentResponseMessage": o([ - { json: "meta", js: "meta", typ: r("AgentResponseMetadata") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: r("ResponseMessageType") }, - ], false), - "BridgeErrorResponseMessage": o([ - { json: "meta", js: "meta", typ: r("BridgeErrorResponseMessageMeta") }, - { json: "payload", js: "payload", typ: r("ResponseErrorMessagePayload") }, - { json: "type", js: "type", typ: "" }, - ], false), - "BridgeErrorResponseMessageMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "DesktopAgentIdentifier": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - ], "any"), - "ResponseErrorMessagePayload": o([ - { json: "error", js: "error", typ: u(undefined, r("ResponseErrorDetail")) }, - ], "any"), - "BridgeRequestMessage": o([ - { json: "meta", js: "meta", typ: r("BridgeRequestMetadata") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: "" }, - ], false), - "BridgeRequestMetadata": o([ - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("BridgeParticipantIdentifier") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "BridgeResponseMessage": o([ - { json: "meta", js: "meta", typ: r("BridgeResponseMessageMeta") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: "" }, - ], false), - "BridgeResponseMessageMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "BroadcastAgentRequest": o([ - { json: "meta", js: "meta", typ: r("BroadcastAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastAgentRequestPayload") }, - { json: "type", js: "type", typ: r("BroadcastAgentRequestType") }, - ], false), - "BroadcastAgentRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("SourceObject") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "SourceObject": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "BroadcastAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "Context": o([ - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: "" }, - ], "any"), - "BroadcastBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("BroadcastBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("BroadcastBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("BroadcastAgentRequestType") }, - ], false), - "BroadcastBridgeRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "MetaSource": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "BroadcastBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "ConnectionStepMessage": o([ - { json: "meta", js: "meta", typ: r("ConnectionStepMetadata") }, - { json: "payload", js: "payload", typ: m("any") }, - { json: "type", js: "type", typ: r("ConnectionStepMessageType") }, - ], false), - "ConnectionStepMetadata": o([ - { json: "requestUuid", js: "requestUuid", typ: u(undefined, "") }, - { json: "responseUuid", js: "responseUuid", typ: u(undefined, "") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ConnectionStep2Hello": o([ - { json: "meta", js: "meta", typ: r("ConnectionStep2HelloMeta") }, - { json: "payload", js: "payload", typ: r("ConnectionStep2HelloPayload") }, - { json: "type", js: "type", typ: r("ConnectionStep2HelloType") }, - ], false), - "ConnectionStep2HelloMeta": o([ - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ConnectionStep2HelloPayload": o([ - { json: "authRequired", js: "authRequired", typ: true }, - { json: "authToken", js: "authToken", typ: u(undefined, "") }, - { json: "desktopAgentBridgeVersion", js: "desktopAgentBridgeVersion", typ: "" }, - { json: "supportedFDC3Versions", js: "supportedFDC3Versions", typ: a("") }, - ], false), - "ConnectionStep3Handshake": o([ - { json: "meta", js: "meta", typ: r("ConnectionStep3HandshakeMeta") }, - { json: "payload", js: "payload", typ: r("ConnectionStep3HandshakePayload") }, - { json: "type", js: "type", typ: r("ConnectionStep3HandshakeType") }, - ], false), - "ConnectionStep3HandshakeMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ConnectionStep3HandshakePayload": o([ - { json: "authToken", js: "authToken", typ: u(undefined, "") }, - { json: "channelsState", js: "channelsState", typ: m(a(r("Context"))) }, - { json: "implementationMetadata", js: "implementationMetadata", typ: r("ConnectingAgentImplementationMetadata") }, - { json: "requestedName", js: "requestedName", typ: "" }, - ], false), - "ConnectingAgentImplementationMetadata": o([ - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - { json: "optionalFeatures", js: "optionalFeatures", typ: r("OptionalFeatures") }, - { json: "provider", js: "provider", typ: "" }, - { json: "providerVersion", js: "providerVersion", typ: u(undefined, "") }, - ], false), - "OptionalFeatures": o([ - { json: "DesktopAgentBridging", js: "DesktopAgentBridging", typ: true }, - { json: "OriginatingAppMetadata", js: "OriginatingAppMetadata", typ: true }, - { json: "UserChannelMembershipAPIs", js: "UserChannelMembershipAPIs", typ: true }, - ], false), - "ConnectionStep4AuthenticationFailed": o([ - { json: "meta", js: "meta", typ: r("ConnectionStep4AuthenticationFailedMeta") }, - { json: "payload", js: "payload", typ: r("ConnectionStep4AuthenticationFailedPayload") }, - { json: "type", js: "type", typ: r("ConnectionStep4AuthenticationFailedType") }, - ], false), - "ConnectionStep4AuthenticationFailedMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ConnectionStep4AuthenticationFailedPayload": o([ - { json: "message", js: "message", typ: u(undefined, "") }, - ], false), - "ConnectionStep6ConnectedAgentsUpdate": o([ - { json: "meta", js: "meta", typ: r("ConnectionStep6ConnectedAgentsUpdateMeta") }, - { json: "payload", js: "payload", typ: r("ConnectionStep6ConnectedAgentsUpdatePayload") }, - { json: "type", js: "type", typ: r("ConnectionStep6ConnectedAgentsUpdateType") }, - ], false), - "ConnectionStep6ConnectedAgentsUpdateMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "ConnectionStep6ConnectedAgentsUpdatePayload": o([ - { json: "addAgent", js: "addAgent", typ: u(undefined, "") }, - { json: "allAgents", js: "allAgents", typ: a(r("DesktopAgentImplementationMetadata")) }, - { json: "channelsState", js: "channelsState", typ: u(undefined, m(a(r("Context")))) }, - { json: "removeAgent", js: "removeAgent", typ: u(undefined, "") }, - ], false), - "DesktopAgentImplementationMetadata": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "fdc3Version", js: "fdc3Version", typ: "" }, - { json: "optionalFeatures", js: "optionalFeatures", typ: r("OptionalFeatures") }, - { json: "provider", js: "provider", typ: "" }, - { json: "providerVersion", js: "providerVersion", typ: u(undefined, "") }, - ], false), - "FindInstancesAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindInstancesAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("PayloadClass") }, - { json: "type", js: "type", typ: r("FindInstancesAgentErrorResponseType") }, - ], false), - "FindInstancesAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PayloadClass": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindInstancesAgentRequest": o([ - { json: "meta", js: "meta", typ: r("FindInstancesAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindInstancesAgentRequestPayload") }, - { json: "type", js: "type", typ: r("FindInstancesAgentRequestType") }, - ], false), - "FindInstancesAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "DestinationObject": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "FindInstancesAgentRequestPayload": o([ - { json: "app", js: "app", typ: r("AppIdentifier") }, - ], false), - "AppIdentifier": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "FindInstancesAgentResponse": o([ - { json: "meta", js: "meta", typ: r("AgentResponseMetadata") }, - { json: "payload", js: "payload", typ: r("FindInstancesAgentResponsePayload") }, - { json: "type", js: "type", typ: r("FindInstancesAgentErrorResponseType") }, - ], false), - "FindInstancesAgentResponsePayload": o([ - { json: "appIdentifiers", js: "appIdentifiers", typ: a(r("AppMetadata")) }, - ], false), - "AppMetadata": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "description", js: "description", typ: u(undefined, "") }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "icons", js: "icons", typ: u(undefined, a(r("Icon"))) }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - { json: "instanceMetadata", js: "instanceMetadata", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "resultType", js: "resultType", typ: u(undefined, u(null, "")) }, - { json: "screenshots", js: "screenshots", typ: u(undefined, a(r("Image"))) }, - { json: "title", js: "title", typ: u(undefined, "") }, - { json: "tooltip", js: "tooltip", typ: u(undefined, "") }, - { json: "version", js: "version", typ: u(undefined, "") }, - ], false), - "Icon": o([ - { json: "size", js: "size", typ: u(undefined, "") }, - { json: "src", js: "src", typ: "" }, - { json: "type", js: "type", typ: u(undefined, "") }, - ], false), - "Image": o([ - { json: "label", js: "label", typ: u(undefined, "") }, - { json: "size", js: "size", typ: u(undefined, "") }, - { json: "src", js: "src", typ: "" }, - { json: "type", js: "type", typ: u(undefined, "") }, - ], false), - "FindInstancesBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindInstancesBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("MessagePayload") }, - { json: "type", js: "type", typ: r("FindInstancesAgentErrorResponseType") }, - ], false), - "FindInstancesBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "MessagePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindInstancesBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("FindInstancesBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindInstancesBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("FindInstancesAgentRequestType") }, - ], false), - "FindInstancesBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSourceObject") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "MetaSourceObject": o([ - { json: "appId", js: "appId", typ: u(undefined, "") }, - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "FindInstancesBridgeRequestPayload": o([ - { json: "app", js: "app", typ: r("AppIdentifier") }, - ], false), - "FindInstancesBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("BridgeResponseMessageMeta") }, - { json: "payload", js: "payload", typ: r("FindInstancesBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("FindInstancesAgentErrorResponseType") }, - ], false), - "FindInstancesBridgeResponsePayload": o([ - { json: "appIdentifiers", js: "appIdentifiers", typ: a(r("AppMetadata")) }, - ], false), - "FindIntentAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentErrorResponseType") }, - ], false), - "FindIntentAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindIntentAgentRequest": o([ - { json: "meta", js: "meta", typ: r("FindIntentAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentAgentRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentRequestType") }, - ], false), - "FindIntentAgentRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - ], false), - "FindIntentAgentRequestPayload": o([ - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - { json: "intent", js: "intent", typ: "" }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentAgentResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentAgentResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentErrorResponseType") }, - ], false), - "FindIntentAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentAgentResponsePayload": o([ - { json: "appIntent", js: "appIntent", typ: r("AppIntent") }, - ], false), - "AppIntent": o([ - { json: "apps", js: "apps", typ: a(r("AppMetadata")) }, - { json: "intent", js: "intent", typ: r("IntentMetadata") }, - ], false), - "IntentMetadata": o([ - { json: "displayName", js: "displayName", typ: u(undefined, "") }, - { json: "name", js: "name", typ: "" }, - ], false), - "FindIntentBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentErrorResponseType") }, - ], false), - "FindIntentBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindIntentBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("FindIntentBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentRequestType") }, - ], false), - "FindIntentBridgeRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("BridgeParticipantIdentifier") }, - { json: "timestamp", js: "timestamp", typ: Date }, - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - ], false), - "FindIntentBridgeRequestPayload": o([ - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - { json: "intent", js: "intent", typ: "" }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentAgentErrorResponseType") }, - ], false), - "FindIntentBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentBridgeResponsePayload": o([ - { json: "appIntent", js: "appIntent", typ: r("AppIntent") }, - ], false), - "FindIntentsByContextAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentErrorResponseType") }, - ], false), - "FindIntentsByContextAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentsByContextAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindIntentsByContextAgentRequest": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextAgentRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentRequestType") }, - ], false), - "FindIntentsByContextAgentRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - ], false), - "FindIntentsByContextAgentRequestPayload": o([ - { json: "context", js: "context", typ: r("Context") }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentsByContextAgentResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextAgentResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentErrorResponseType") }, - ], false), - "FindIntentsByContextAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentsByContextAgentResponsePayload": o([ - { json: "appIntents", js: "appIntents", typ: a(r("AppIntent")) }, - ], false), - "FindIntentsByContextBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentErrorResponseType") }, - ], false), - "FindIntentsByContextBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentsByContextBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "FindIntentsByContextBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentRequestType") }, - ], false), - "FindIntentsByContextBridgeRequestMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - { json: "destination", js: "destination", typ: u(undefined, r("BridgeParticipantIdentifier")) }, - ], false), - "FindIntentsByContextBridgeRequestPayload": o([ - { json: "context", js: "context", typ: r("Context") }, - { json: "resultType", js: "resultType", typ: u(undefined, "") }, - ], false), - "FindIntentsByContextBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("FindIntentsByContextBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("FindIntentsByContextBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("FindIntentsByContextAgentErrorResponseType") }, - ], false), - "FindIntentsByContextBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "FindIntentsByContextBridgeResponsePayload": o([ - { json: "appIntents", js: "appIntents", typ: a(r("AppIntent")) }, - ], false), - "GetAppMetadataAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentErrorResponseType") }, - ], false), - "GetAppMetadataAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "GetAppMetadataAgentRequest": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataAgentRequestPayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentRequestType") }, - ], false), - "GetAppMetadataAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceIdentifier")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataAgentRequestPayload": o([ - { json: "app", js: "app", typ: r("AppObject") }, - ], false), - "AppObject": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "GetAppMetadataAgentResponse": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataAgentResponsePayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentErrorResponseType") }, - ], false), - "GetAppMetadataAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataAgentResponsePayload": o([ - { json: "appMetadata", js: "appMetadata", typ: r("AppMetadata") }, - ], false), - "GetAppMetadataBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentErrorResponseType") }, - ], false), - "GetAppMetadataBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "GetAppMetadataBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentRequestType") }, - ], false), - "GetAppMetadataBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSourceObject") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataBridgeRequestPayload": o([ - { json: "app", js: "app", typ: r("AppObject") }, - ], false), - "GetAppMetadataBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("GetAppMetadataBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("GetAppMetadataBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("GetAppMetadataAgentErrorResponseType") }, - ], false), - "GetAppMetadataBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "GetAppMetadataBridgeResponsePayload": o([ - { json: "appMetadata", js: "appMetadata", typ: r("AppMetadata") }, - ], false), - "OpenAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("OpenAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("OpenAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("OpenAgentErrorResponseType") }, - ], false), - "OpenAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("OpenErrorResponsePayload") }, - ], false), - "OpenAgentRequest": o([ - { json: "meta", js: "meta", typ: r("OpenAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("OpenAgentRequestPayload") }, - { json: "type", js: "type", typ: r("OpenAgentRequestType") }, - ], false), - "OpenAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("SourceObject") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenAgentRequestPayload": o([ - { json: "app", js: "app", typ: r("AppToOpen") }, - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - ], false), - "AppToOpen": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "OpenAgentResponse": o([ - { json: "meta", js: "meta", typ: r("OpenAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("OpenAgentResponsePayload") }, - { json: "type", js: "type", typ: r("OpenAgentErrorResponseType") }, - ], false), - "OpenAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenAgentResponsePayload": o([ - { json: "appIdentifier", js: "appIdentifier", typ: r("AppIdentifier") }, - ], false), - "OpenBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("OpenBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("OpenBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("OpenAgentErrorResponseType") }, - ], false), - "OpenBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("OpenErrorResponsePayload") }, - ], false), - "OpenBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("OpenBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("OpenBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("OpenAgentRequestType") }, - ], false), - "OpenBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("DestinationObject")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenBridgeRequestPayload": o([ - { json: "app", js: "app", typ: r("AppToOpen") }, - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - ], false), - "OpenBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("OpenBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("OpenBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("OpenAgentErrorResponseType") }, - ], false), - "OpenBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "OpenBridgeResponsePayload": o([ - { json: "appIdentifier", js: "appIdentifier", typ: r("AppIdentifier") }, - ], false), - "PrivateChannelBroadcastAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelBroadcastAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelBroadcastAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelBroadcastAgentRequestType") }, - ], false), - "PrivateChannelBroadcastAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "MetaDestination": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "PrivateChannelBroadcastAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "PrivateChannelBroadcastBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelBroadcastBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelBroadcastBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelBroadcastAgentRequestType") }, - ], false), - "PrivateChannelBroadcastBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelBroadcastBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "context", js: "context", typ: r("Context") }, - ], false), - "PrivateChannelEventListenerAddedAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelEventListenerAddedAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelEventListenerAddedAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelEventListenerAddedAgentRequestType") }, - ], false), - "PrivateChannelEventListenerAddedAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelEventListenerAddedAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "listenerType", js: "listenerType", typ: r("PrivateChannelEventListenerTypes") }, - ], false), - "PrivateChannelEventListenerAddedBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelEventListenerAddedBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelEventListenerAddedBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelEventListenerAddedAgentRequestType") }, - ], false), - "PrivateChannelEventListenerAddedBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelEventListenerAddedBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "listenerType", js: "listenerType", typ: r("PrivateChannelEventListenerTypes") }, - ], false), - "PrivateChannelEventListenerRemovedAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelEventListenerRemovedAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelEventListenerRemovedAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelEventListenerRemovedAgentRequestType") }, - ], false), - "PrivateChannelEventListenerRemovedAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelEventListenerRemovedAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "listenerType", js: "listenerType", typ: r("PrivateChannelEventListenerTypes") }, - ], false), - "PrivateChannelEventListenerRemovedBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelEventListenerRemovedBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelEventListenerRemovedBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelEventListenerRemovedAgentRequestType") }, - ], false), - "PrivateChannelEventListenerRemovedBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelEventListenerRemovedBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "listenerType", js: "listenerType", typ: r("PrivateChannelEventListenerTypes") }, - ], false), - "PrivateChannelOnAddContextListenerAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelOnAddContextListenerAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnAddContextListenerAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnAddContextListenerAgentRequestType") }, - ], false), - "PrivateChannelOnAddContextListenerAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnAddContextListenerAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "PrivateChannelOnAddContextListenerBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelOnAddContextListenerBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnAddContextListenerBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnAddContextListenerAgentRequestType") }, - ], false), - "PrivateChannelOnAddContextListenerBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnAddContextListenerBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "PrivateChannelOnDisconnectAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelOnDisconnectAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnDisconnectAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnDisconnectAgentRequestType") }, - ], false), - "PrivateChannelOnDisconnectAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnDisconnectAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - ], false), - "PrivateChannelOnDisconnectBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelOnDisconnectBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnDisconnectBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnDisconnectAgentRequestType") }, - ], false), - "PrivateChannelOnDisconnectBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnDisconnectBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - ], false), - "PrivateChannelOnUnsubscribeAgentRequest": o([ - { json: "meta", js: "meta", typ: r("PrivateChannelOnUnsubscribeAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnUnsubscribeAgentRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnUnsubscribeAgentRequestType") }, - ], false), - "PrivateChannelOnUnsubscribeAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: u(undefined, r("SourceObject")) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnUnsubscribeAgentRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "PrivateChannelOnUnsubscribeBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("ERequestMetadata") }, - { json: "payload", js: "payload", typ: r("PrivateChannelOnUnsubscribeBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("PrivateChannelOnUnsubscribeAgentRequestType") }, - ], false), - "ERequestMetadata": o([ - { json: "destination", js: "destination", typ: u(undefined, r("MetaDestination")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "PrivateChannelOnUnsubscribeBridgeRequestPayload": o([ - { json: "channelId", js: "channelId", typ: "" }, - { json: "contextType", js: "contextType", typ: u(null, "") }, - ], false), - "RaiseIntentAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentErrorResponseType") }, - ], false), - "RaiseIntentAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "RaiseIntentAgentRequest": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentAgentRequestMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentAgentRequestPayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentRequestType") }, - ], false), - "RaiseIntentAgentRequestMeta": o([ - { json: "destination", js: "destination", typ: r("MetaDestination") }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("SourceObject") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentAgentRequestPayload": o([ - { json: "app", js: "app", typ: r("AppDestinationIdentifier") }, - { json: "context", js: "context", typ: r("Context") }, - { json: "intent", js: "intent", typ: "" }, - ], false), - "AppDestinationIdentifier": o([ - { json: "desktopAgent", js: "desktopAgent", typ: "" }, - { json: "appId", js: "appId", typ: "" }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "RaiseIntentAgentResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentAgentResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentErrorResponseType") }, - ], false), - "RaiseIntentAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentAgentResponsePayload": o([ - { json: "intentResolution", js: "intentResolution", typ: r("IntentResolution") }, - ], false), - "IntentResolution": o([ - { json: "intent", js: "intent", typ: "" }, - { json: "source", js: "source", typ: r("AppIdentifier") }, - ], false), - "RaiseIntentBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentErrorResponseType") }, - ], false), - "RaiseIntentBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("FindInstancesErrors") }, - ], false), - "RaiseIntentBridgeRequest": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentBridgeRequestMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentBridgeRequestPayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentRequestType") }, - ], false), - "RaiseIntentBridgeRequestMeta": o([ - { json: "destination", js: "destination", typ: r("MetaDestination") }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "source", js: "source", typ: r("MetaSource") }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentBridgeRequestPayload": o([ - { json: "app", js: "app", typ: r("AppDestinationIdentifier") }, - { json: "context", js: "context", typ: r("Context") }, - { json: "intent", js: "intent", typ: "" }, - ], false), - "RaiseIntentBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentAgentErrorResponseType") }, - ], false), - "RaiseIntentBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentBridgeResponsePayload": o([ - { json: "intentResolution", js: "intentResolution", typ: r("IntentResolution") }, - ], false), - "RaiseIntentResultAgentErrorResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentResultAgentErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResultAgentErrorResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResultAgentErrorResponseType") }, - ], false), - "RaiseIntentResultAgentErrorResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentResultAgentErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("RaiseIntentResultErrorMessage") }, - ], false), - "RaiseIntentResultAgentResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentResultAgentResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResultAgentResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResultAgentErrorResponseType") }, - ], false), - "RaiseIntentResultAgentResponseMeta": o([ - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentResultAgentResponsePayload": o([ - { json: "intentResult", js: "intentResult", typ: r("IntentResult") }, - ], false), - "IntentResult": o([ - { json: "context", js: "context", typ: u(undefined, r("Context")) }, - { json: "channel", js: "channel", typ: u(undefined, r("Channel")) }, - ], false), - "Channel": o([ - { json: "displayMetadata", js: "displayMetadata", typ: u(undefined, r("DisplayMetadata")) }, - { json: "id", js: "id", typ: "" }, - { json: "type", js: "type", typ: r("Type") }, - ], false), - "DisplayMetadata": o([ - { json: "color", js: "color", typ: u(undefined, "") }, - { json: "glyph", js: "glyph", typ: u(undefined, "") }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], false), - "RaiseIntentResultBridgeErrorResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentResultBridgeErrorResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResultBridgeErrorResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResultAgentErrorResponseType") }, - ], false), - "RaiseIntentResultBridgeErrorResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: a(r("ResponseErrorDetail")) }, - { json: "errorSources", js: "errorSources", typ: a(r("DesktopAgentIdentifier")) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentResultBridgeErrorResponsePayload": o([ - { json: "error", js: "error", typ: r("RaiseIntentResultErrorMessage") }, - ], false), - "RaiseIntentResultBridgeResponse": o([ - { json: "meta", js: "meta", typ: r("RaiseIntentResultBridgeResponseMeta") }, - { json: "payload", js: "payload", typ: r("RaiseIntentResultBridgeResponsePayload") }, - { json: "type", js: "type", typ: r("RaiseIntentResultAgentErrorResponseType") }, - ], false), - "RaiseIntentResultBridgeResponseMeta": o([ - { json: "errorDetails", js: "errorDetails", typ: u(undefined, a(r("ResponseErrorDetail"))) }, - { json: "errorSources", js: "errorSources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "requestUuid", js: "requestUuid", typ: "" }, - { json: "responseUuid", js: "responseUuid", typ: "" }, - { json: "sources", js: "sources", typ: u(undefined, a(r("DesktopAgentIdentifier"))) }, - { json: "timestamp", js: "timestamp", typ: Date }, - ], false), - "RaiseIntentResultBridgeResponsePayload": o([ - { json: "intentResult", js: "intentResult", typ: r("IntentResult") }, - ], false), - "ResponseErrorDetail": [ - "AccessDenied", - "AgentDisconnected", - "AppNotFound", - "AppTimeout", - "CreationFailed", - "DesktopAgentNotFound", - "ErrorOnLaunch", - "IntentDeliveryFailed", - "IntentHandlerRejected", - "MalformedContext", - "MalformedMessage", - "NoAppsFound", - "NoChannelFound", - "NoResultReturned", - "NotConnectedToBridge", - "ResolverTimeout", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution", - ], - "ResponseMessageType": [ - "findInstancesResponse", - "findIntentResponse", - "findIntentsByContextResponse", - "getAppMetadataResponse", - "openResponse", - "raiseIntentResponse", - "raiseIntentResultResponse", - ], - "RequestMessageType": [ - "broadcastRequest", - "findInstancesRequest", - "findIntentRequest", - "findIntentsByContextRequest", - "getAppMetadataRequest", - "openRequest", - "PrivateChannel.broadcast", - "PrivateChannel.eventListenerAdded", - "PrivateChannel.eventListenerRemoved", - "PrivateChannel.onAddContextListener", - "PrivateChannel.onDisconnect", - "PrivateChannel.onUnsubscribe", - "raiseIntentRequest", - ], - "BroadcastAgentRequestType": [ - "broadcastRequest", - ], - "ConnectionStepMessageType": [ - "authenticationFailed", - "connectedAgentsUpdate", - "handshake", - "hello", - ], - "ConnectionStep2HelloType": [ - "hello", - ], - "ConnectionStep3HandshakeType": [ - "handshake", - ], - "ConnectionStep4AuthenticationFailedType": [ - "authenticationFailed", - ], - "ConnectionStep6ConnectedAgentsUpdateType": [ - "connectedAgentsUpdate", - ], - "FindInstancesErrors": [ - "AgentDisconnected", - "DesktopAgentNotFound", - "IntentDeliveryFailed", - "MalformedContext", - "MalformedMessage", - "NoAppsFound", - "NotConnectedToBridge", - "ResolverTimeout", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution", - ], - "FindInstancesAgentErrorResponseType": [ - "findInstancesResponse", - ], - "FindInstancesAgentRequestType": [ - "findInstancesRequest", - ], - "FindIntentAgentErrorResponseType": [ - "findIntentResponse", - ], - "FindIntentAgentRequestType": [ - "findIntentRequest", - ], - "FindIntentsByContextAgentErrorResponseType": [ - "findIntentsByContextResponse", - ], - "FindIntentsByContextAgentRequestType": [ - "findIntentsByContextRequest", - ], - "GetAppMetadataAgentErrorResponseType": [ - "getAppMetadataResponse", - ], - "GetAppMetadataAgentRequestType": [ - "getAppMetadataRequest", - ], - "OpenErrorResponsePayload": [ - "AgentDisconnected", - "AppNotFound", - "AppTimeout", - "DesktopAgentNotFound", - "ErrorOnLaunch", - "MalformedContext", - "MalformedMessage", - "NotConnectedToBridge", - "ResolverUnavailable", - "ResponseToBridgeTimedOut", - ], - "OpenAgentErrorResponseType": [ - "openResponse", - ], - "OpenAgentRequestType": [ - "openRequest", - ], - "PrivateChannelBroadcastAgentRequestType": [ - "PrivateChannel.broadcast", - ], - "PrivateChannelEventListenerTypes": [ - "onAddContextListener", - "onDisconnect", - "onUnsubscribe", - ], - "PrivateChannelEventListenerAddedAgentRequestType": [ - "PrivateChannel.eventListenerAdded", - ], - "PrivateChannelEventListenerRemovedAgentRequestType": [ - "PrivateChannel.eventListenerRemoved", - ], - "PrivateChannelOnAddContextListenerAgentRequestType": [ - "PrivateChannel.onAddContextListener", - ], - "PrivateChannelOnDisconnectAgentRequestType": [ - "PrivateChannel.onDisconnect", - ], - "PrivateChannelOnUnsubscribeAgentRequestType": [ - "PrivateChannel.onUnsubscribe", - ], - "RaiseIntentAgentErrorResponseType": [ - "raiseIntentResponse", - ], - "RaiseIntentAgentRequestType": [ - "raiseIntentRequest", - ], - "RaiseIntentResultErrorMessage": [ - "AgentDisconnected", - "IntentHandlerRejected", - "MalformedMessage", - "NoResultReturned", - "NotConnectedToBridge", - "ResponseToBridgeTimedOut", - ], - "RaiseIntentResultAgentErrorResponseType": [ - "raiseIntentResultResponse", - ], - "Type": [ - "app", - "private", - "user", - ], -}; diff --git a/src/context/ContextTypes.ts b/src/context/ContextTypes.ts deleted file mode 100644 index 794687e52..000000000 --- a/src/context/ContextTypes.ts +++ /dev/null @@ -1,3038 +0,0 @@ -// To parse this data: -// -// import { Convert, Action, Chart, ChatInitSettings, ChatMessage, ChatRoom, ChatSearchCriteria, Contact, ContactList, Context, Country, Currency, Email, FileAttachment, Instrument, InstrumentList, Interaction, Message, Nothing, Order, OrderList, Organization, Portfolio, Position, Product, TimeRange, Trade, TradeList, TransactionResult, Valuation } from "./file"; -// -// const action = Convert.toAction(json); -// const chart = Convert.toChart(json); -// const chatInitSettings = Convert.toChatInitSettings(json); -// const chatMessage = Convert.toChatMessage(json); -// const chatRoom = Convert.toChatRoom(json); -// const chatSearchCriteria = Convert.toChatSearchCriteria(json); -// const contact = Convert.toContact(json); -// const contactList = Convert.toContactList(json); -// const context = Convert.toContext(json); -// const country = Convert.toCountry(json); -// const currency = Convert.toCurrency(json); -// const email = Convert.toEmail(json); -// const fileAttachment = Convert.toFileAttachment(json); -// const instrument = Convert.toInstrument(json); -// const instrumentList = Convert.toInstrumentList(json); -// const interaction = Convert.toInteraction(json); -// const message = Convert.toMessage(json); -// const nothing = Convert.toNothing(json); -// const order = Convert.toOrder(json); -// const orderList = Convert.toOrderList(json); -// const organization = Convert.toOrganization(json); -// const portfolio = Convert.toPortfolio(json); -// const position = Convert.toPosition(json); -// const product = Convert.toProduct(json); -// const timeRange = Convert.toTimeRange(json); -// const trade = Convert.toTrade(json); -// const tradeList = Convert.toTradeList(json); -// const transactionResult = Convert.toTransactionResult(json); -// const valuation = Convert.toValuation(json); -// -// These functions will throw an error if the JSON doesn't -// match the expected interface, even if the JSON is valid. - -/** - * A representation of an FDC3 Action (specified via a Context or Context & Intent) that can - * be inserted inside another object, for example a chat message. - * - * The action may be completed by calling: - * - `fdc3.raiseIntent()` with the specified Intent and Context - * - `fdc3.raiseIntentForContext()` if only a context is specified, (which the Desktop Agent - * will resolve by presenting the user with a list of available Intents for the Context). - * - `channel.broadcast()` with the specified Context, if the `broadcast` action has been - * defined. - * - * Accepts an optional `app` parameter in order to specify a specific app. - */ -export interface Action { - /** - * The **action** field indicates the type of action: - * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` - * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if - * given). - * - **broadcast** : If `broadcast` and a `channelId` are specified then - * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the - * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, - * the context should be broadcast to the current channel (`fdc3.broadcast()`) - */ - action?: ActionType; - /** - * An optional target application identifier that should perform the action. The `app` - * property is ignored unless the action is raiseIntent. - */ - app?: AppIdentifier; - /** - * Optional channel on which to broadcast the context. The `channelId` property is ignored - * unless the `action` is broadcast. - */ - channelId?: string; - /** - * A context object with which the action will be performed - */ - context: ContextElement; - /** - * Optional Intent to raise to perform the actions. Should reference an intent type name, - * such as those defined in the FDC3 Standard. If intent is not set then - * `fdc3.raiseIntentForContext` should be used to perform the action as this will usually - * allow the user to choose the intent to raise. - */ - intent?: string; - /** - * A human readable display name for the action - */ - title: string; - type: "fdc3.action"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * The **action** field indicates the type of action: - * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` - * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if - * given). - * - **broadcast** : If `broadcast` and a `channelId` are specified then - * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the - * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, - * the context should be broadcast to the current channel (`fdc3.broadcast()`) - */ -export type ActionType = "broadcast" | "raiseIntent"; - -/** - * An optional target application identifier that should perform the action. The `app` - * property is ignored unless the action is raiseIntent. - * - * Identifies an application, or instance of an application, and is used to target FDC3 API - * calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application - * instances. - * - * Will always include at least an `appId` field, which uniquely identifies a specific app. - * - * If the `instanceId` field is set then the `AppMetadata` object represents a specific - * instance of the application that may be addressed using that Id. - */ -export interface AppIdentifier { - /** - * The unique application identifier located within a specific application directory - * instance. An example of an appId might be 'app@sub.root'. - */ - appId: string; - /** - * The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to - * identify the Desktop Agent to target. - */ - desktopAgent?: string; - /** - * An optional instance identifier, indicating that this object represents a specific - * instance of the application described. - */ - instanceId?: string; - [property: string]: any; -} - -/** - * A context object with which the action will be performed - * - * A context object returned by the transaction, possibly with updated data. - * - * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by - * FDC3 operations. As such, it is not really meant to be used on its own, but is imported - * by more specific type definitions (standardized or custom) to provide the structure and - * properties shared by all FDC3 context data types. - * - * The key element of FDC3 context types is their mandatory `type` property, which is used - * to identify what type of data the object represents, and what shape it has. - * - * The FDC3 context type, and all derived types, define the minimum set of fields a context - * data object of a particular type can be expected to have, but this can always be extended - * with custom fields as appropriate. - */ -export interface ContextElement { - /** - * Context data objects may include a set of equivalent key-value pairs that can be used to - * help applications identify and look up the context type they receive in their own domain. - * The idea behind this design is that applications can provide as many equivalent - * identifiers to a target application as possible, e.g. an instrument may be represented by - * an ISIN, CUSIP or Bloomberg identifier. - * - * Identifiers do not make sense for all types of data, so the `id` property is therefore - * optional, but some derived types may choose to require at least one identifier. - * Identifier values SHOULD always be of type string. - */ - id?: { [key: string]: any }; - /** - * Context data objects may include a name property that can be used for more information, - * or display purposes. Some derived types may require the name object as mandatory, - * depending on use case. - */ - name?: string; - /** - * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 - * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present - * to route shared context data appropriately. - * - * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data - * types they support in an FDC3 [App - * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery - * and routing. - * - * Standardized FDC3 context types have well-known `type` properties prefixed with the - * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and - * used by a particular organization, the convention is to prefix them with an - * organization-specific namespace, e.g. `blackrock.fund`. - * - * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more - * information about context data types. - */ - type: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A context type representing details of a Chart, which may be used to request plotting of - * a particular chart or to otherwise share details of its composition, such as: - * - * - A list of instruments for comparison - * - The time period to plot the chart over - * - The style of chart (line, bar, mountain, candle etc.) - * - Other settings such as indicators to calculate, or data representing drawings and - * annotations. - * - * In addition to handling requests to plot charts, a charting application may use this type - * to output a representation of what it is currently displaying so that it can be recorded - * by another application. - */ -export interface Chart { - /** - * An array of instrument contexts whose data should be plotted. - */ - instruments: InstrumentElement[]; - /** - * It is common for charts to support other configuration, such as indicators, annotations - * etc., which do not have standardized formats, but may be included in the `otherConfig` - * array as context objects. - */ - otherConfig?: ContextElement[]; - /** - * The time range that should be plotted - */ - range?: TimeRangeObject; - /** - * The type of chart that should be plotted - */ - style?: ChartStyle; - type: "fdc3.chart"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * A financial instrument that relates to the definition of this product - * - * - * - * A financial instrument from any asset class. - */ -export interface InstrumentElement { - /** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - */ - id: PurpleInstrumentIdentifiers; - /** - * The `market` map can be used to further specify the instrument and help achieve - * interoperability between disparate data sources. This is especially useful when using an - * `id` field that is not globally unique. - */ - market?: OrganizationMarket; - /** - * An optional human-readable name for the instrument - */ - name?: string; - type: "fdc3.instrument"; - [property: string]: any; -} - -/** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - */ -export interface PurpleInstrumentIdentifiers { - /** - * https://www.bloomberg.com/ - */ - BBG?: string; - /** - * https://www.cusip.com/ - */ - CUSIP?: string; - /** - * https://www.factset.com/ - */ - FDS_ID?: string; - /** - * https://www.openfigi.com/ - */ - FIGI?: string; - /** - * https://www.isin.org/ - */ - ISIN?: string; - /** - * https://permid.org/ - */ - PERMID?: string; - /** - * https://www.refinitiv.com/ - */ - RIC?: string; - /** - * https://www.lseg.com/sedol - */ - SEDOL?: string; - /** - * Unstandardized stock tickers - */ - ticker?: string; - [property: string]: any; -} - -/** - * The `market` map can be used to further specify the instrument and help achieve - * interoperability between disparate data sources. This is especially useful when using an - * `id` field that is not globally unique. - */ -export interface OrganizationMarket { - /** - * https://www.bloomberg.com/ - */ - BBG?: string; - /** - * https://www.iso.org/iso-3166-country-codes.html - */ - COUNTRY_ISOALPHA2?: string; - /** - * https://en.wikipedia.org/wiki/Market_Identifier_Code - */ - MIC?: string; - /** - * Human readable market name - */ - name?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * The time range that should be plotted - * - * The time range over which the interaction occurred - * - * A context representing a period of time. Any user interfaces that represent or visualize - * events or activity over time can be filtered or focused on a particular time period, - * e.g.: - * - * - A pricing chart - * - A trade blotter - * - A record of client contact/activity in a CRM - * - * Example use cases: - * - * - User may want to view pricing/trades/customer activity for a security over a particular - * time period, the time range might be specified as the context for the `ViewChart` intent - * OR it might be embedded in another context (e.g. a context representing a chart to plot). - * - User filters a visualization (e.g. a pricing chart) to show a particular period, the - * `TimeRange` is broadcast and other visualizations (e.g. a heatmap of activity by - * instrument, or industry sector etc.) receive it and filter themselves to show data over - * the same range. - * - * Notes: - * - * - A `TimeRange` may be closed (i.e. `startTime` and `endTime` are both known) or open - * (i.e. only one of `startTime` or `endTime` is known). - * - Ranges corresponding to dates (e.g. `2022-05-12` to `2022-05-19`) should be specified - * using times as this prevents issues with timezone conversions and inclusive/exclusive - * date ranges. - * - String fields representing times are encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html). - * - A timezone indicator should be specified, e.g. `"2022-05-12T15:18:03Z"` or - * `"2022-05-12T16:18:03+01:00"` - * - Times MAY be specified with millisecond precision, e.g. `"2022-05-12T15:18:03.349Z"` - */ -export interface TimeRangeObject { - /** - * The end time of the range, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. - */ - endTime?: Date; - /** - * The start time of the range, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. - */ - startTime?: Date; - type: "fdc3.timeRange"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * The type of chart that should be plotted - */ -export type ChartStyle = "line" | "bar" | "stacked-bar" | "mountain" | "candle" | "pie" | "scatter" | "histogram" | "heatmap" | "custom"; - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A collection of settings to start a new chat conversation - */ -export interface ChatInitSettings { - /** - * Name to apply to the chat created - */ - chatName?: string; - /** - * Contacts to add to the chat - */ - members?: ContactListObject; - /** - * An initial message to post in the chat when created. - */ - message?: MessageObject | string; - /** - * Option settings that affect the creation of the chat - */ - options?: ChatOptions; - type: "fdc3.chat.initSettings"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * Contacts to add to the chat - * - * A list of contacts involved in the interaction - * - * A collection of contacts, e.g. for chatting to or calling multiple contacts. - * - * The contact list schema does not explicitly include identifiers in the `id` section, as - * there is not a common standard for such identifiers. Applications can, however, populate - * this part of the contract with custom identifiers if so desired. - */ -export interface ContactListObject { - /** - * An array of contact contexts that forms the list. - */ - contacts: ContactElement[]; - /** - * One or more identifiers that refer to the contact list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An optional human-readable summary of the contact list - */ - name?: string; - type: "fdc3.contactList"; - [property: string]: any; -} - -/** - * The contact that initiated the interaction - * - * A person contact that can be engaged with through email, calling, messaging, CMS, etc. - */ -export interface ContactElement { - /** - * Identifiers that relate to the Contact represented by this context - */ - id: PurpleContactIdentifiers; - /** - * An optional human-readable name for the contact - */ - name?: string; - type: "fdc3.contact"; - [property: string]: any; -} - -/** - * Identifiers that relate to the Contact represented by this context - */ -export interface PurpleContactIdentifiers { - /** - * The email address for the contact - */ - email?: string; - /** - * FactSet Permanent Identifier representing the contact - */ - FDS_ID?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A chat message to be sent through an instant messaging application. Can contain one or - * several text bodies (organized by mime-type, plaintext or markdown), as well as attached - * entities (either arbitrary file attachments or FDC3 actions to be embedded in the - * message). To be put inside a ChatInitSettings object. - */ -export interface MessageObject { - /** - * A map of string IDs to entities that should be attached to the message, such as an action - * to perform, a file attachment, or other FDC3 context object. - */ - entities?: { [key: string]: EntityValue }; - /** - * A map of string mime-type to string content - */ - text?: PurpleMessageText; - type: "fdc3.message"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * A representation of an FDC3 Action (specified via a Context or Context & Intent) that can - * be inserted inside another object, for example a chat message. - * - * The action may be completed by calling: - * - `fdc3.raiseIntent()` with the specified Intent and Context - * - `fdc3.raiseIntentForContext()` if only a context is specified, (which the Desktop Agent - * will resolve by presenting the user with a list of available Intents for the Context). - * - `channel.broadcast()` with the specified Context, if the `broadcast` action has been - * defined. - * - * Accepts an optional `app` parameter in order to specify a specific app. - * - * A File attachment encoded in the form of a data URI. Can be added to a Message. - */ -export interface EntityValue { - /** - * The **action** field indicates the type of action: - * - **raiseIntent** : If no action or `raiseIntent` is specified, then `fdc3.raiseIntent` - * or `fdc3.raiseIntentForContext` will be called with the specified context (and intent if - * given). - * - **broadcast** : If `broadcast` and a `channelId` are specified then - * `fdc3.getOrCreateChannel(channelId)` is called to retrieve the channel and broadcast the - * context to it with `channel.broadcast(context)`. If no `channelId` has been specified, - * the context should be broadcast to the current channel (`fdc3.broadcast()`) - */ - action?: ActionType; - /** - * An optional target application identifier that should perform the action. The `app` - * property is ignored unless the action is raiseIntent. - */ - app?: AppIdentifier; - /** - * Optional channel on which to broadcast the context. The `channelId` property is ignored - * unless the `action` is broadcast. - */ - channelId?: string; - /** - * A context object with which the action will be performed - */ - context?: ContextElement; - /** - * Optional Intent to raise to perform the actions. Should reference an intent type name, - * such as those defined in the FDC3 Standard. If intent is not set then - * `fdc3.raiseIntentForContext` should be used to perform the action as this will usually - * allow the user to choose the intent to raise. - */ - intent?: string; - /** - * A human readable display name for the action - */ - title?: string; - type: EntityType; - id?: { [key: string]: any }; - name?: string; - data?: EntityData; - [property: string]: any; -} - -export interface EntityData { - /** - * A data URI encoding the content of the file to be attached - */ - dataUri: string; - /** - * The name of the attached file - */ - name: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ -export type EntityType = "fdc3.action" | "fdc3.fileAttachment"; - -/** - * A map of string mime-type to string content - */ -export interface PurpleMessageText { - /** - * Markdown encoded content - */ - "text/markdown"?: string; - /** - * Plain text encoded content. - */ - "text/plain"?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Option settings that affect the creation of the chat - */ -export interface ChatOptions { - /** - * if true members will be allowed to add other members to the chat - */ - allowAddUser?: boolean; - /** - * if true members will be allowed to browse past messages - */ - allowHistoryBrowsing?: boolean; - /** - * if true members will be allowed to copy/paste messages - */ - allowMessageCopy?: boolean; - /** - * if false a separate chat will be created for each member - */ - groupRecipients?: boolean; - /** - * if true the room will be visible to everyone in the chat application - */ - isPublic?: boolean; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A context representing a chat message. Typically used to send the message or to - * pre-populate a message for sending. - */ -export interface ChatMessage { - chatRoom: ChatRoomObject; - message: MessageObject; - type: "fdc3.chat.message"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * Reference to the chat room which could be used to send a message to the room - */ -export interface ChatRoomObject { - /** - * Identifier(s) for the chat - currently unstandardized - */ - id: { [key: string]: string }; - /** - * Display name for the chat room - */ - name?: string; - /** - * The name of the service that hosts the chat - */ - providerName: string; - type: "fdc3.chat.room"; - /** - * Universal url to access to the room. It could be opened from a browser, a mobile app, - * etc... - */ - url?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Reference to the chat room which could be used to send a message to the room - */ -export interface ChatRoom { - /** - * Identifier(s) for the chat - currently unstandardized - */ - id: { [key: string]: string }; - /** - * Display name for the chat room - */ - name?: string; - /** - * The name of the service that hosts the chat - */ - providerName: string; - type: "fdc3.chat.room"; - /** - * Universal url to access to the room. It could be opened from a browser, a mobile app, - * etc... - */ - url?: string; - [property: string]: any; -} - -/** - * A context type that represents a simple search criterion, based on a list of other - * context objects, that can be used to search or filter messages in a chat application. - */ -export interface ChatSearchCriteria { - /** - * An array of criteria that should match chats returned from by a search. - * - * ⚠️ Operators (and/or/not) are not defined in `fdc3.chat.searchCriteria`. It is up to the - * application that processes the FDC3 Intent to choose and apply the operators between the - * criteria. - * - * Empty search criteria can be supported to allow resetting of filters. - */ - criteria: Array; - type: "fdc3.chat.searchCriteria"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * A financial instrument that relates to the definition of this product - * - * - * - * A financial instrument from any asset class. - * - * An entity that can be used when referencing private companies and other organizations - * where a specific instrument is not available or desired e.g. CRM and News workflows. - * - * It is valid to include extra properties and metadata as part of the organization payload, - * but the minimum requirement is for at least one specified identifier to be provided. - * - * The contact that initiated the interaction - * - * A person contact that can be engaged with through email, calling, messaging, CMS, etc. - */ -export interface OrganizationObject { - /** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - * - * Identifiers for the organization, at least one must be provided. - * - * Identifiers that relate to the Contact represented by this context - */ - id: Identifiers; - /** - * The `market` map can be used to further specify the instrument and help achieve - * interoperability between disparate data sources. This is especially useful when using an - * `id` field that is not globally unique. - */ - market?: OrganizationMarket; - /** - * An optional human-readable name for the instrument - * - * An optional human-readable name of the organization - * - * An optional human-readable name for the contact - */ - name?: string; - type: TentacledInteractionType; - [property: string]: any; -} - -/** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - * - * Identifiers for the organization, at least one must be provided. - * - * Identifiers that relate to the Contact represented by this context - */ -export interface Identifiers { - /** - * https://www.bloomberg.com/ - */ - BBG?: string; - /** - * https://www.cusip.com/ - */ - CUSIP?: string; - /** - * https://www.factset.com/ - * - * FactSet Permanent Identifier representing the organization - * - * FactSet Permanent Identifier representing the contact - */ - FDS_ID?: string; - /** - * https://www.openfigi.com/ - */ - FIGI?: string; - /** - * https://www.isin.org/ - */ - ISIN?: string; - /** - * https://permid.org/ - * - * Refinitiv Permanent Identifiers, or PermID for the organization - */ - PERMID?: string; - /** - * https://www.refinitiv.com/ - */ - RIC?: string; - /** - * https://www.lseg.com/sedol - */ - SEDOL?: string; - /** - * Unstandardized stock tickers - */ - ticker?: string; - /** - * The Legal Entity Identifier (LEI) is a 20-character, alpha-numeric code based on the ISO - * 17442 standard developed by the International Organization for Standardization (ISO). It - * connects to key reference information that enables clear and unique identification of - * legal entities participating in financial transactions. - */ - LEI?: string; - /** - * The email address for the contact - */ - email?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ -export type TentacledInteractionType = "fdc3.instrument" | "fdc3.organization" | "fdc3.contact"; - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A person contact that can be engaged with through email, calling, messaging, CMS, etc. - */ -export interface Contact { - /** - * Identifiers that relate to the Contact represented by this context - */ - id: FluffyContactIdentifiers; - /** - * An optional human-readable name for the contact - */ - name?: string; - type: "fdc3.contact"; - [property: string]: any; -} - -/** - * Identifiers that relate to the Contact represented by this context - */ -export interface FluffyContactIdentifiers { - /** - * The email address for the contact - */ - email?: string; - /** - * FactSet Permanent Identifier representing the contact - */ - FDS_ID?: string; - [property: string]: any; -} - -/** - * A collection of contacts, e.g. for chatting to or calling multiple contacts. - * - * The contact list schema does not explicitly include identifiers in the `id` section, as - * there is not a common standard for such identifiers. Applications can, however, populate - * this part of the contract with custom identifiers if so desired. - */ -export interface ContactList { - /** - * An array of contact contexts that forms the list. - */ - contacts: ContactElement[]; - /** - * One or more identifiers that refer to the contact list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An optional human-readable summary of the contact list - */ - name?: string; - type: "fdc3.contactList"; - [property: string]: any; -} - -/** - * The `fdc3.context` type defines the basic contract or "shape" for all data exchanged by - * FDC3 operations. As such, it is not really meant to be used on its own, but is imported - * by more specific type definitions (standardized or custom) to provide the structure and - * properties shared by all FDC3 context data types. - * - * The key element of FDC3 context types is their mandatory `type` property, which is used - * to identify what type of data the object represents, and what shape it has. - * - * The FDC3 context type, and all derived types, define the minimum set of fields a context - * data object of a particular type can be expected to have, but this can always be extended - * with custom fields as appropriate. - */ -export interface Context { - /** - * Context data objects may include a set of equivalent key-value pairs that can be used to - * help applications identify and look up the context type they receive in their own domain. - * The idea behind this design is that applications can provide as many equivalent - * identifiers to a target application as possible, e.g. an instrument may be represented by - * an ISIN, CUSIP or Bloomberg identifier. - * - * Identifiers do not make sense for all types of data, so the `id` property is therefore - * optional, but some derived types may choose to require at least one identifier. - * Identifier values SHOULD always be of type string. - */ - id?: { [key: string]: any }; - /** - * Context data objects may include a name property that can be used for more information, - * or display purposes. Some derived types may require the name object as mandatory, - * depending on use case. - */ - name?: string; - /** - * The type property is the only _required_ part of the FDC3 context data schema. The FDC3 - * [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present - * to route shared context data appropriately. - * - * FDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data - * types they support in an FDC3 [App - * Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery - * and routing. - * - * Standardized FDC3 context types have well-known `type` properties prefixed with the - * `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and - * used by a particular organization, the convention is to prefix them with an - * organization-specific namespace, e.g. `blackrock.fund`. - * - * See the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more - * information about context data types. - */ - type: string; - [property: string]: any; -} - -/** - * A country entity. - * - * Notes: - * - * - It is valid to include extra properties and metadata as part of the country payload, - * but the minimum requirement is for at least one standardized identifier to be provided - * - * - `COUNTRY_ISOALPHA2` SHOULD be preferred. - * - * - Try to only use country identifiers as intended and specified in the [ISO - * standard](https://en.wikipedia.org/wiki/ISO_3166-1). E.g. the `COUNTRY_ISOALPHA2` - * property must be a recognized value and not a proprietary two-letter code. If the - * identifier you want to share is not a standardized and recognized one, rather define a - * property that makes it clear what value it is. This makes it easier for target - * applications. - */ -export interface Country { - id: CountryID; - /** - * An optional human-readable name for the country - */ - name?: string; - type: "fdc3.country"; - [property: string]: any; -} - -export interface CountryID { - /** - * Two-letter ISO country code - */ - COUNTRY_ISOALPHA2?: string; - /** - * Three-letter ISO country code - */ - COUNTRY_ISOALPHA3?: string; - /** - * Two-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed - * with `COUNTRY_`. - */ - ISOALPHA2?: string; - /** - * Three-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed - * with `COUNTRY_`. - */ - ISOALPHA3?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A context representing an individual Currency. - */ -export interface Currency { - id: CurrencyID; - /** - * The name of the currency for display purposes - */ - name?: string; - type: "fdc3.currency"; - [property: string]: any; -} - -export interface CurrencyID { - /** - * The `CURRENCY_ISOCODE` should conform to 3 character alphabetic codes defined in [ISO - * 4217](https://www.iso.org/iso-4217-currency-codes.html) - */ - CURRENCY_ISOCODE?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A collection of information to be used to initiate an email with a Contact or ContactList. - */ -export interface Email { - /** - * One or more recipients for the email. - */ - recipients: EmailRecipients; - /** - * Subject line for the email. - */ - subject?: string; - /** - * Body content for the email. - */ - textBody?: string; - type: "fdc3.email"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * One or more recipients for the email. - * - * The contact that initiated the interaction - * - * A person contact that can be engaged with through email, calling, messaging, CMS, etc. - * - * Contacts to add to the chat - * - * A list of contacts involved in the interaction - * - * A collection of contacts, e.g. for chatting to or calling multiple contacts. - * - * The contact list schema does not explicitly include identifiers in the `id` section, as - * there is not a common standard for such identifiers. Applications can, however, populate - * this part of the contract with custom identifiers if so desired. - */ -export interface EmailRecipients { - /** - * Identifiers that relate to the Contact represented by this context - * - * One or more identifiers that refer to the contact list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: ContactTIdentifiers; - /** - * An optional human-readable name for the contact - * - * An optional human-readable summary of the contact list - */ - name?: string; - type: EmailRecipientsType; - /** - * An array of contact contexts that forms the list. - */ - contacts?: ContactElement[]; - [property: string]: any; -} - -/** - * Identifiers that relate to the Contact represented by this context - * - * One or more identifiers that refer to the contact list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ -export interface ContactTIdentifiers { - /** - * The email address for the contact - */ - email?: string; - /** - * FactSet Permanent Identifier representing the contact - */ - FDS_ID?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ -export type EmailRecipientsType = "fdc3.contact" | "fdc3.contactList"; - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A File attachment encoded in the form of a data URI. Can be added to a Message. - */ -export interface FileAttachment { - data: FileAttachmentData; - type: "fdc3.fileAttachment"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -export interface FileAttachmentData { - /** - * A data URI encoding the content of the file to be attached - */ - dataUri: string; - /** - * The name of the attached file - */ - name: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A financial instrument from any asset class. - */ -export interface Instrument { - /** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - */ - id: FluffyInstrumentIdentifiers; - /** - * The `market` map can be used to further specify the instrument and help achieve - * interoperability between disparate data sources. This is especially useful when using an - * `id` field that is not globally unique. - */ - market?: PurpleMarket; - /** - * An optional human-readable name for the instrument - */ - name?: string; - type: "fdc3.instrument"; - [property: string]: any; -} - -/** - * Any combination of instrument identifiers can be used together to resolve ambiguity, or - * for a better match. Not all applications will use the same instrument identifiers, which - * is why FDC3 allows for multiple to be specified. In general, the more identifiers an - * application can provide, the easier it will be to achieve interoperability. - * - * It is valid to include extra properties and metadata as part of the instrument payload, - * but the minimum requirement is for at least one instrument identifier to be provided. - * - * Try to only use instrument identifiers as intended. E.g. the `ticker` property is meant - * for tickers as used by an exchange. - * If the identifier you want to share is not a ticker or one of the other standardized - * fields, define a property that makes it clear what the value represents. Doing so will - * make interpretation easier for the developers of target applications. - */ -export interface FluffyInstrumentIdentifiers { - /** - * https://www.bloomberg.com/ - */ - BBG?: string; - /** - * https://www.cusip.com/ - */ - CUSIP?: string; - /** - * https://www.factset.com/ - */ - FDS_ID?: string; - /** - * https://www.openfigi.com/ - */ - FIGI?: string; - /** - * https://www.isin.org/ - */ - ISIN?: string; - /** - * https://permid.org/ - */ - PERMID?: string; - /** - * https://www.refinitiv.com/ - */ - RIC?: string; - /** - * https://www.lseg.com/sedol - */ - SEDOL?: string; - /** - * Unstandardized stock tickers - */ - ticker?: string; - [property: string]: any; -} - -/** - * The `market` map can be used to further specify the instrument and help achieve - * interoperability between disparate data sources. This is especially useful when using an - * `id` field that is not globally unique. - */ -export interface PurpleMarket { - /** - * https://www.bloomberg.com/ - */ - BBG?: string; - /** - * https://www.iso.org/iso-3166-country-codes.html - */ - COUNTRY_ISOALPHA2?: string; - /** - * https://en.wikipedia.org/wiki/Market_Identifier_Code - */ - MIC?: string; - /** - * Human readable market name - */ - name?: string; - [property: string]: any; -} - -/** - * A collection of instruments. Use this type for use cases that require not just a single - * instrument, but multiple (e.g. to populate a watchlist). However, when holding - * information for each instrument is required, it is recommended to use the - * [Portfolio](Portfolio) type. - * - * The instrument list schema does not explicitly include identifiers in the `id` section, - * as there is not a common standard for such identifiers. Applications can, however, - * populate this part of the contract with custom identifiers if so desired. - */ -export interface InstrumentList { - /** - * One or more identifiers that refer to the instrument list in an OMS, EMS or related - * system. Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An array of instrument contexts that forms the list. - */ - instruments: InstrumentElement[]; - /** - * An optional human-readable summary of the instrument list - */ - name?: string; - type: "fdc3.instrumentList"; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * An `Interaction` is a significant direct exchange of ideas or information between a - * number of participants, e.g. a Sell Side party and one or more Buy Side parties. An - * `Interaction` might be a call, a meeting (physical or virtual), an IM or the preparation - * of some specialist data, such as financial data for a given company or sector. - */ -export interface Interaction { - /** - * A human-readable description of the interaction - */ - description: string; - /** - * Can be used by a target application to pass an identifier back to the originating - * application after an interaction record has been created, updated or deleted. An - * interaction ID does not need to be populated by the originating application, however the - * target application could store it for future reference and SHOULD return it in a - * `TransactionResult`. - */ - id?: InteractionID; - /** - * The contact that initiated the interaction - */ - initiator?: ContactElement; - /** - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - interactionType: string; - /** - * Used to represent the application or service that the interaction was created from to aid - * in tracing the source of an interaction. - */ - origin?: string; - /** - * A list of contacts involved in the interaction - */ - participants: ContactListObject; - /** - * The time range over which the interaction occurred - */ - timeRange: TimeRangeObject; - type: "fdc3.interaction"; - name?: string; - [property: string]: any; -} - -/** - * Can be used by a target application to pass an identifier back to the originating - * application after an interaction record has been created, updated or deleted. An - * interaction ID does not need to be populated by the originating application, however the - * target application could store it for future reference and SHOULD return it in a - * `TransactionResult`. - */ -export interface InteractionID { - /** - * Interactions ID in Salesforce - */ - SALESFORCE?: string; - /** - * Interaction ID in SingleTrack - */ - SINGLETRACK?: string; - /** - * Can be used by a target application to pass a record's link back to the originating - * application. This offers the originating application a way to open the record for a user - * to view. - */ - URI?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A chat message to be sent through an instant messaging application. Can contain one or - * several text bodies (organized by mime-type, plaintext or markdown), as well as attached - * entities (either arbitrary file attachments or FDC3 actions to be embedded in the - * message). To be put inside a ChatInitSettings object. - */ -export interface Message { - /** - * A map of string IDs to entities that should be attached to the message, such as an action - * to perform, a file attachment, or other FDC3 context object. - */ - entities?: { [key: string]: EntityValue }; - /** - * A map of string mime-type to string content - */ - text?: FluffyMessageText; - type: "fdc3.message"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * A map of string mime-type to string content - */ -export interface FluffyMessageText { - /** - * Markdown encoded content - */ - "text/markdown"?: string; - /** - * Plain text encoded content. - */ - "text/plain"?: string; - [property: string]: any; -} - -/** - * A type that explicitly represents a lack of context. - * - * Notes: - * - * - Intended to be used in situations where no context is desired. - * - For example: - * - Raising an intent without context (e.g. opening a blank order form, or chat interface - * without a contact selected). - * - Resetting context on a channel (e.g. when context is used to set a filter in other - * applications a null context might release the filter). - * - An explicit representation of a Null or empty context allows apps to declare support - * for a lack of context, for example in their intent metadata in an app directory. - */ -export interface Nothing { - type: "fdc3.nothing"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * @experimental context type representing an order. To be used with OMS and EMS systems. - * - * This type currently only defines a required `id` field, which should provide a reference - * to the order in one or more systems, an optional human readable `name` field to be used - * to summarize the order and an optional `details` field that may be used to provide - * additional detail about the order, including a context representing a `product`, which - * may be extended with arbitrary properties. The `details.product` field is currently typed - * as a unspecified Context type, but both `details` and `details.product` are expected to - * be standardized in future. - */ -export interface Order { - /** - * Optional additional details about the order, which may include a product element that is - * an, as yet undefined but extensible, Context - */ - details?: PurpleOrderDetails; - /** - * One or more identifiers that refer to the order in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * An optional human-readable summary of the order. - */ - name?: string; - type: "fdc3.order"; - [property: string]: any; -} - -/** - * Optional additional details about the order, which may include a product element that is - * an, as yet undefined but extensible, Context - */ -export interface PurpleOrderDetails { - product?: ProductObject; - [property: string]: any; -} - -/** - * A product that is the subject of the trade. - * - * @experimental context type representing a tradable product. To be used with OMS and EMS - * systems. - * - * This type is currently only loosely defined as an extensible context object, with an - * optional instrument field. - * - * The Product schema does not explicitly include identifiers in the id section, as there is - * not a common standard for such identifiers. Applications can, however, populate this part - * of the contract with custom identifiers if so desired. - */ -export interface ProductObject { - /** - * One or more identifiers that refer to the product. Specific key names for systems are - * expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * A financial instrument that relates to the definition of this product - */ - instrument?: InstrumentElement; - /** - * A human-readable summary of the product. - */ - name?: string; - type: "fdc3.product"; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * @experimental A list of orders. Use this type for use cases that require not just a - * single order, but multiple. - * - * The OrderList schema does not explicitly include identifiers in the id section, as there - * is not a common standard for such identifiers. Applications can, however, populate this - * part of the contract with custom identifiers if so desired. - */ -export interface OrderList { - /** - * One or more identifiers that refer to the order list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An optional human-readable summary of the order list - */ - name?: string; - /** - * An array of order contexts that forms the list. - */ - orders: OrderElement[]; - type: "fdc3.orderList"; - [property: string]: any; -} - -/** - * @experimental context type representing an order. To be used with OMS and EMS systems. - * - * This type currently only defines a required `id` field, which should provide a reference - * to the order in one or more systems, an optional human readable `name` field to be used - * to summarize the order and an optional `details` field that may be used to provide - * additional detail about the order, including a context representing a `product`, which - * may be extended with arbitrary properties. The `details.product` field is currently typed - * as a unspecified Context type, but both `details` and `details.product` are expected to - * be standardized in future. - */ -export interface OrderElement { - /** - * Optional additional details about the order, which may include a product element that is - * an, as yet undefined but extensible, Context - */ - details?: FluffyOrderDetails; - /** - * One or more identifiers that refer to the order in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * An optional human-readable summary of the order. - */ - name?: string; - type: "fdc3.order"; - [property: string]: any; -} - -/** - * Optional additional details about the order, which may include a product element that is - * an, as yet undefined but extensible, Context - */ -export interface FluffyOrderDetails { - product?: ProductObject; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * An entity that can be used when referencing private companies and other organizations - * where a specific instrument is not available or desired e.g. CRM and News workflows. - * - * It is valid to include extra properties and metadata as part of the organization payload, - * but the minimum requirement is for at least one specified identifier to be provided. - */ -export interface Organization { - /** - * Identifiers for the organization, at least one must be provided. - */ - id: OrganizationIdentifiers; - /** - * An optional human-readable name of the organization - */ - name?: string; - type: "fdc3.organization"; - [property: string]: any; -} - -/** - * Identifiers for the organization, at least one must be provided. - */ -export interface OrganizationIdentifiers { - /** - * FactSet Permanent Identifier representing the organization - */ - FDS_ID?: string; - /** - * The Legal Entity Identifier (LEI) is a 20-character, alpha-numeric code based on the ISO - * 17442 standard developed by the International Organization for Standardization (ISO). It - * connects to key reference information that enables clear and unique identification of - * legal entities participating in financial transactions. - */ - LEI?: string; - /** - * Refinitiv Permanent Identifiers, or PermID for the organization - */ - PERMID?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A financial portfolio made up of multiple positions (holdings) in several instruments. - * Contrast this with e.g. the [InstrumentList](InstrumentList) type, which is just a list - * of instruments. - * - * This is a good example of how types can be composed and extended with extra properties to - * define more complex types. - * - * The Portfolio type consists of an array of [Position](Position) types, each of which - * refers to a single [Instrument](Instrument) and a holding amount for that instrument. - * - * The portfolio schema does not explicitly include identifiers in the `id` section, as - * there bis not a common standard for such identifiers. Applications can, however, populate - * this part of the contract with custom identifiers if so desired. - */ -export interface Portfolio { - /** - * One or more identifiers that refer to the portfolio in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An optional human-readable name for the portfolio - */ - name?: string; - /** - * The List of Positions which make up the Portfolio - */ - positions: PositionElement[]; - type: "fdc3.portfolio"; - [property: string]: any; -} - -/** - * A financial position made up of an instrument and a holding in that instrument. This type - * is a good example of how new context types can be composed from existing types. - * - * In this case, the instrument and the holding amount for that instrument are required - * values. - * - * The [Position](Position) type goes hand-in-hand with the [Portfolio](Portfolio) type, - * which represents multiple holdings in a combination of instruments. - * - * The position schema does not explicitly include identifiers in the `id` section, as there - * is not a common standard for such identifiers. Applications can, however, populate this - * part of the contract with custom identifiers if so desired. - */ -export interface PositionElement { - /** - * The amount of the holding, e.g. a number of shares - */ - holding: number; - /** - * One or more identifiers that refer to the position in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - instrument: InstrumentElement; - /** - * An optional human-readable name for the position - */ - name?: string; - type: "fdc3.position"; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A financial position made up of an instrument and a holding in that instrument. This type - * is a good example of how new context types can be composed from existing types. - * - * In this case, the instrument and the holding amount for that instrument are required - * values. - * - * The [Position](Position) type goes hand-in-hand with the [Portfolio](Portfolio) type, - * which represents multiple holdings in a combination of instruments. - * - * The position schema does not explicitly include identifiers in the `id` section, as there - * is not a common standard for such identifiers. Applications can, however, populate this - * part of the contract with custom identifiers if so desired. - */ -export interface Position { - /** - * The amount of the holding, e.g. a number of shares - */ - holding: number; - /** - * One or more identifiers that refer to the position in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - instrument: InstrumentElement; - /** - * An optional human-readable name for the position - */ - name?: string; - type: "fdc3.position"; - [property: string]: any; -} - -/** - * @experimental context type representing a tradable product. To be used with OMS and EMS - * systems. - * - * This type is currently only loosely defined as an extensible context object, with an - * optional instrument field. - * - * The Product schema does not explicitly include identifiers in the id section, as there is - * not a common standard for such identifiers. Applications can, however, populate this part - * of the contract with custom identifiers if so desired. - */ -export interface Product { - /** - * One or more identifiers that refer to the product. Specific key names for systems are - * expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * A financial instrument that relates to the definition of this product - */ - instrument?: InstrumentElement; - /** - * A human-readable summary of the product. - */ - name?: string; - type: "fdc3.product"; - [property: string]: any; -} - -/** - * A context representing a period of time. Any user interfaces that represent or visualize - * events or activity over time can be filtered or focused on a particular time period, - * e.g.: - * - * - A pricing chart - * - A trade blotter - * - A record of client contact/activity in a CRM - * - * Example use cases: - * - * - User may want to view pricing/trades/customer activity for a security over a particular - * time period, the time range might be specified as the context for the `ViewChart` intent - * OR it might be embedded in another context (e.g. a context representing a chart to plot). - * - User filters a visualization (e.g. a pricing chart) to show a particular period, the - * `TimeRange` is broadcast and other visualizations (e.g. a heatmap of activity by - * instrument, or industry sector etc.) receive it and filter themselves to show data over - * the same range. - * - * Notes: - * - * - A `TimeRange` may be closed (i.e. `startTime` and `endTime` are both known) or open - * (i.e. only one of `startTime` or `endTime` is known). - * - Ranges corresponding to dates (e.g. `2022-05-12` to `2022-05-19`) should be specified - * using times as this prevents issues with timezone conversions and inclusive/exclusive - * date ranges. - * - String fields representing times are encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html). - * - A timezone indicator should be specified, e.g. `"2022-05-12T15:18:03Z"` or - * `"2022-05-12T16:18:03+01:00"` - * - Times MAY be specified with millisecond precision, e.g. `"2022-05-12T15:18:03.349Z"` - */ -export interface TimeRange { - /** - * The end time of the range, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. - */ - endTime?: Date; - /** - * The start time of the range, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator. - */ - startTime?: Date; - type: "fdc3.timeRange"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * @experimental context type representing a trade. To be used with execution systems. - * - * This type currently only defines a required `id` field, which should provide a reference - * to the trade in one or more systems, an optional human readable `name` field to be used - * to summarize the trade and a required `product` field that may be used to provide - * additional detail about the trade, which is currently typed as a unspecified Context - * type, but `product` is expected to be standardized in future. - * - * The Trade schema does not explicitly include identifiers in the id section, as there is - * not a common standard for such identifiers. Applications can, however, populate this part - * of the contract with custom identifiers if so desired. - */ -export interface Trade { - /** - * One or more identifiers that refer to the trade in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * A human-readable summary of the trade. - */ - name?: string; - /** - * A product that is the subject of the trade. - */ - product: ProductObject; - type: "fdc3.trade"; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * @experimental A list of trades. Use this type for use cases that require not just a - * single trade, but multiple. - * - * The TradeList schema does not explicitly include identifiers in the id section, as there - * is not a common standard for such identifiers. Applications can, however, populate this - * part of the contract with custom identifiers if so desired. - */ -export interface TradeList { - /** - * One or more identifiers that refer to the trade list in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id?: { [key: string]: string }; - /** - * An optional human-readable name for the trade list - */ - name?: string; - /** - * An array of trade contexts that forms the list. - */ - trades: TradeElement[]; - type: "fdc3.tradeList"; - [property: string]: any; -} - -/** - * @experimental context type representing a trade. To be used with execution systems. - * - * This type currently only defines a required `id` field, which should provide a reference - * to the trade in one or more systems, an optional human readable `name` field to be used - * to summarize the trade and a required `product` field that may be used to provide - * additional detail about the trade, which is currently typed as a unspecified Context - * type, but `product` is expected to be standardized in future. - * - * The Trade schema does not explicitly include identifiers in the id section, as there is - * not a common standard for such identifiers. Applications can, however, populate this part - * of the contract with custom identifiers if so desired. - */ -export interface TradeElement { - /** - * One or more identifiers that refer to the trade in an OMS, EMS or related system. - * Specific key names for systems are expected to be standardized in future. - */ - id: { [key: string]: string }; - /** - * A human-readable summary of the trade. - */ - name?: string; - /** - * A product that is the subject of the trade. - */ - product: ProductObject; - type: "fdc3.trade"; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A context type representing the result of a transaction initiated via FDC3, which SHOULD - * be returned as an `IntentResult` by intents that create, retrieve, update or delete - * content or records in another application. Its purpose is to provide a status and message - * (where needed) for the transaction and MAY wrap a returned context object. - */ -export interface TransactionResult { - /** - * A context object returned by the transaction, possibly with updated data. - */ - context?: ContextElement; - /** - * A human readable message describing the outcome of the transaction. - */ - message?: string; - /** - * The status of the transaction being reported. - */ - status: TransactionStatus; - type: "fdc3.transactionResult"; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * The status of the transaction being reported. - */ -export type TransactionStatus = "Created" | "Deleted" | "Updated" | "Failed"; - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -/** - * A context type representing the price and value of a holding. - */ -export interface Valuation { - /** - * The valuation currency, which should conform to 3 character alphabetic codes defined in - * [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) - */ - CURRENCY_ISOCODE: string; - /** - * The time at which this valuation expires, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included. - */ - expiryTime?: Date; - /** - * The price per unit the the valuation is based on. - */ - price?: number; - type: "fdc3.valuation"; - /** - * The time at which the valuation was performed, encoded according to [ISO - * 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included. - */ - valuationTime?: Date; - /** - * The value of the holding, expresses in the nominated currency. - */ - value: number; - id?: { [key: string]: any }; - name?: string; - [property: string]: any; -} - -/** - * Free text to be used for a keyword search - * - * `interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or - * `'Meeting'` although other string values are permitted. - */ - -// Converts JSON strings to/from your types -// and asserts the results of JSON.parse at runtime -export class Convert { - public static toAction(json: string): Action { - return cast(JSON.parse(json), r("Action")); - } - - public static actionToJson(value: Action): string { - return JSON.stringify(uncast(value, r("Action")), null, 2); - } - - public static toChart(json: string): Chart { - return cast(JSON.parse(json), r("Chart")); - } - - public static chartToJson(value: Chart): string { - return JSON.stringify(uncast(value, r("Chart")), null, 2); - } - - public static toChatInitSettings(json: string): ChatInitSettings { - return cast(JSON.parse(json), r("ChatInitSettings")); - } - - public static chatInitSettingsToJson(value: ChatInitSettings): string { - return JSON.stringify(uncast(value, r("ChatInitSettings")), null, 2); - } - - public static toChatMessage(json: string): ChatMessage { - return cast(JSON.parse(json), r("ChatMessage")); - } - - public static chatMessageToJson(value: ChatMessage): string { - return JSON.stringify(uncast(value, r("ChatMessage")), null, 2); - } - - public static toChatRoom(json: string): ChatRoom { - return cast(JSON.parse(json), r("ChatRoom")); - } - - public static chatRoomToJson(value: ChatRoom): string { - return JSON.stringify(uncast(value, r("ChatRoom")), null, 2); - } - - public static toChatSearchCriteria(json: string): ChatSearchCriteria { - return cast(JSON.parse(json), r("ChatSearchCriteria")); - } - - public static chatSearchCriteriaToJson(value: ChatSearchCriteria): string { - return JSON.stringify(uncast(value, r("ChatSearchCriteria")), null, 2); - } - - public static toContact(json: string): Contact { - return cast(JSON.parse(json), r("Contact")); - } - - public static contactToJson(value: Contact): string { - return JSON.stringify(uncast(value, r("Contact")), null, 2); - } - - public static toContactList(json: string): ContactList { - return cast(JSON.parse(json), r("ContactList")); - } - - public static contactListToJson(value: ContactList): string { - return JSON.stringify(uncast(value, r("ContactList")), null, 2); - } - - public static toContext(json: string): Context { - return cast(JSON.parse(json), r("Context")); - } - - public static contextToJson(value: Context): string { - return JSON.stringify(uncast(value, r("Context")), null, 2); - } - - public static toCountry(json: string): Country { - return cast(JSON.parse(json), r("Country")); - } - - public static countryToJson(value: Country): string { - return JSON.stringify(uncast(value, r("Country")), null, 2); - } - - public static toCurrency(json: string): Currency { - return cast(JSON.parse(json), r("Currency")); - } - - public static currencyToJson(value: Currency): string { - return JSON.stringify(uncast(value, r("Currency")), null, 2); - } - - public static toEmail(json: string): Email { - return cast(JSON.parse(json), r("Email")); - } - - public static emailToJson(value: Email): string { - return JSON.stringify(uncast(value, r("Email")), null, 2); - } - - public static toFileAttachment(json: string): FileAttachment { - return cast(JSON.parse(json), r("FileAttachment")); - } - - public static fileAttachmentToJson(value: FileAttachment): string { - return JSON.stringify(uncast(value, r("FileAttachment")), null, 2); - } - - public static toInstrument(json: string): Instrument { - return cast(JSON.parse(json), r("Instrument")); - } - - public static instrumentToJson(value: Instrument): string { - return JSON.stringify(uncast(value, r("Instrument")), null, 2); - } - - public static toInstrumentList(json: string): InstrumentList { - return cast(JSON.parse(json), r("InstrumentList")); - } - - public static instrumentListToJson(value: InstrumentList): string { - return JSON.stringify(uncast(value, r("InstrumentList")), null, 2); - } - - public static toInteraction(json: string): Interaction { - return cast(JSON.parse(json), r("Interaction")); - } - - public static interactionToJson(value: Interaction): string { - return JSON.stringify(uncast(value, r("Interaction")), null, 2); - } - - public static toMessage(json: string): Message { - return cast(JSON.parse(json), r("Message")); - } - - public static messageToJson(value: Message): string { - return JSON.stringify(uncast(value, r("Message")), null, 2); - } - - public static toNothing(json: string): Nothing { - return cast(JSON.parse(json), r("Nothing")); - } - - public static nothingToJson(value: Nothing): string { - return JSON.stringify(uncast(value, r("Nothing")), null, 2); - } - - public static toOrder(json: string): Order { - return cast(JSON.parse(json), r("Order")); - } - - public static orderToJson(value: Order): string { - return JSON.stringify(uncast(value, r("Order")), null, 2); - } - - public static toOrderList(json: string): OrderList { - return cast(JSON.parse(json), r("OrderList")); - } - - public static orderListToJson(value: OrderList): string { - return JSON.stringify(uncast(value, r("OrderList")), null, 2); - } - - public static toOrganization(json: string): Organization { - return cast(JSON.parse(json), r("Organization")); - } - - public static organizationToJson(value: Organization): string { - return JSON.stringify(uncast(value, r("Organization")), null, 2); - } - - public static toPortfolio(json: string): Portfolio { - return cast(JSON.parse(json), r("Portfolio")); - } - - public static portfolioToJson(value: Portfolio): string { - return JSON.stringify(uncast(value, r("Portfolio")), null, 2); - } - - public static toPosition(json: string): Position { - return cast(JSON.parse(json), r("Position")); - } - - public static positionToJson(value: Position): string { - return JSON.stringify(uncast(value, r("Position")), null, 2); - } - - public static toProduct(json: string): Product { - return cast(JSON.parse(json), r("Product")); - } - - public static productToJson(value: Product): string { - return JSON.stringify(uncast(value, r("Product")), null, 2); - } - - public static toTimeRange(json: string): TimeRange { - return cast(JSON.parse(json), r("TimeRange")); - } - - public static timeRangeToJson(value: TimeRange): string { - return JSON.stringify(uncast(value, r("TimeRange")), null, 2); - } - - public static toTrade(json: string): Trade { - return cast(JSON.parse(json), r("Trade")); - } - - public static tradeToJson(value: Trade): string { - return JSON.stringify(uncast(value, r("Trade")), null, 2); - } - - public static toTradeList(json: string): TradeList { - return cast(JSON.parse(json), r("TradeList")); - } - - public static tradeListToJson(value: TradeList): string { - return JSON.stringify(uncast(value, r("TradeList")), null, 2); - } - - public static toTransactionResult(json: string): TransactionResult { - return cast(JSON.parse(json), r("TransactionResult")); - } - - public static transactionResultToJson(value: TransactionResult): string { - return JSON.stringify(uncast(value, r("TransactionResult")), null, 2); - } - - public static toValuation(json: string): Valuation { - return cast(JSON.parse(json), r("Valuation")); - } - - public static valuationToJson(value: Valuation): string { - return JSON.stringify(uncast(value, r("Valuation")), null, 2); - } -} - -function invalidValue(typ: any, val: any, key: any, parent: any = ''): never { - const prettyTyp = prettyTypeName(typ); - const parentText = parent ? ` on ${parent}` : ''; - const keyText = key ? ` for key "${key}"` : ''; - throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`); -} - -function prettyTypeName(typ: any): string { - if (Array.isArray(typ)) { - if (typ.length === 2 && typ[0] === undefined) { - return `an optional ${prettyTypeName(typ[1])}`; - } else { - return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`; - } - } else if (typeof typ === "object" && typ.literal !== undefined) { - return typ.literal; - } else { - return typeof typ; - } -} - -function jsonToJSProps(typ: any): any { - if (typ.jsonToJS === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ }); - typ.jsonToJS = map; - } - return typ.jsonToJS; -} - -function jsToJSONProps(typ: any): any { - if (typ.jsToJSON === undefined) { - const map: any = {}; - typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ }); - typ.jsToJSON = map; - } - return typ.jsToJSON; -} - -function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any { - function transformPrimitive(typ: string, val: any): any { - if (typeof typ === typeof val) return val; - return invalidValue(typ, val, key, parent); - } - - function transformUnion(typs: any[], val: any): any { - // val must validate against one typ in typs - const l = typs.length; - for (let i = 0; i < l; i++) { - const typ = typs[i]; - try { - return transform(val, typ, getProps); - } catch (_) {} - } - return invalidValue(typs, val, key, parent); - } - - function transformEnum(cases: string[], val: any): any { - if (cases.indexOf(val) !== -1) return val; - return invalidValue(cases.map(a => { return l(a); }), val, key, parent); - } - - function transformArray(typ: any, val: any): any { - // val must be an array with no invalid elements - if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent); - return val.map(el => transform(el, typ, getProps)); - } - - function transformDate(val: any): any { - if (val === null) { - return null; - } - const d = new Date(val); - if (isNaN(d.valueOf())) { - return invalidValue(l("Date"), val, key, parent); - } - return d; - } - - function transformObject(props: { [k: string]: any }, additional: any, val: any): any { - if (val === null || typeof val !== "object" || Array.isArray(val)) { - return invalidValue(l(ref || "object"), val, key, parent); - } - const result: any = {}; - Object.getOwnPropertyNames(props).forEach(key => { - const prop = props[key]; - const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; - result[prop.key] = transform(v, prop.typ, getProps, key, ref); - }); - Object.getOwnPropertyNames(val).forEach(key => { - if (!Object.prototype.hasOwnProperty.call(props, key)) { - result[key] = transform(val[key], additional, getProps, key, ref); - } - }); - return result; - } - - if (typ === "any") return val; - if (typ === null) { - if (val === null) return val; - return invalidValue(typ, val, key, parent); - } - if (typ === false) return invalidValue(typ, val, key, parent); - let ref: any = undefined; - while (typeof typ === "object" && typ.ref !== undefined) { - ref = typ.ref; - typ = typeMap[typ.ref]; - } - if (Array.isArray(typ)) return transformEnum(typ, val); - if (typeof typ === "object") { - return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) - : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) - : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) - : invalidValue(typ, val, key, parent); - } - // Numbers can be parsed by Date but shouldn't be. - if (typ === Date && typeof val !== "number") return transformDate(val); - return transformPrimitive(typ, val); -} - -function cast(val: any, typ: any): T { - return transform(val, typ, jsonToJSProps); -} - -function uncast(val: T, typ: any): any { - return transform(val, typ, jsToJSONProps); -} - -function l(typ: any) { - return { literal: typ }; -} - -function a(typ: any) { - return { arrayItems: typ }; -} - -function u(...typs: any[]) { - return { unionMembers: typs }; -} - -function o(props: any[], additional: any) { - return { props, additional }; -} - -function m(additional: any) { - return { props: [], additional }; -} - -function r(name: string) { - return { ref: name }; -} - -const typeMap: any = { - "Action": o([ - { json: "action", js: "action", typ: u(undefined, r("ActionType")) }, - { json: "app", js: "app", typ: u(undefined, r("AppIdentifier")) }, - { json: "channelId", js: "channelId", typ: u(undefined, "") }, - { json: "context", js: "context", typ: r("ContextElement") }, - { json: "intent", js: "intent", typ: u(undefined, "") }, - { json: "title", js: "title", typ: "" }, - { json: "type", js: "type", typ: r("ActionTypeEnum") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "AppIdentifier": o([ - { json: "appId", js: "appId", typ: "" }, - { json: "desktopAgent", js: "desktopAgent", typ: u(undefined, "") }, - { json: "instanceId", js: "instanceId", typ: u(undefined, "") }, - ], "any"), - "ContextElement": o([ - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: "" }, - ], "any"), - "Chart": o([ - { json: "instruments", js: "instruments", typ: a(r("InstrumentElement")) }, - { json: "otherConfig", js: "otherConfig", typ: u(undefined, a(r("ContextElement"))) }, - { json: "range", js: "range", typ: u(undefined, r("TimeRangeObject")) }, - { json: "style", js: "style", typ: u(undefined, r("ChartStyle")) }, - { json: "type", js: "type", typ: r("ChartType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "InstrumentElement": o([ - { json: "id", js: "id", typ: r("PurpleInstrumentIdentifiers") }, - { json: "market", js: "market", typ: u(undefined, r("OrganizationMarket")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("PurpleInteractionType") }, - ], "any"), - "PurpleInstrumentIdentifiers": o([ - { json: "BBG", js: "BBG", typ: u(undefined, "") }, - { json: "CUSIP", js: "CUSIP", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - { json: "FIGI", js: "FIGI", typ: u(undefined, "") }, - { json: "ISIN", js: "ISIN", typ: u(undefined, "") }, - { json: "PERMID", js: "PERMID", typ: u(undefined, "") }, - { json: "RIC", js: "RIC", typ: u(undefined, "") }, - { json: "SEDOL", js: "SEDOL", typ: u(undefined, "") }, - { json: "ticker", js: "ticker", typ: u(undefined, "") }, - ], "any"), - "OrganizationMarket": o([ - { json: "BBG", js: "BBG", typ: u(undefined, "") }, - { json: "COUNTRY_ISOALPHA2", js: "COUNTRY_ISOALPHA2", typ: u(undefined, "") }, - { json: "MIC", js: "MIC", typ: u(undefined, "") }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "TimeRangeObject": o([ - { json: "endTime", js: "endTime", typ: u(undefined, Date) }, - { json: "startTime", js: "startTime", typ: u(undefined, Date) }, - { json: "type", js: "type", typ: r("TimeRangeType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "ChatInitSettings": o([ - { json: "chatName", js: "chatName", typ: u(undefined, "") }, - { json: "members", js: "members", typ: u(undefined, r("ContactListObject")) }, - { json: "message", js: "message", typ: u(undefined, u(r("MessageObject"), "")) }, - { json: "options", js: "options", typ: u(undefined, r("ChatOptions")) }, - { json: "type", js: "type", typ: r("ChatInitSettingsType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "ContactListObject": o([ - { json: "contacts", js: "contacts", typ: a(r("ContactElement")) }, - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("ContactListType") }, - ], "any"), - "ContactElement": o([ - { json: "id", js: "id", typ: r("PurpleContactIdentifiers") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("FluffyInteractionType") }, - ], "any"), - "PurpleContactIdentifiers": o([ - { json: "email", js: "email", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - ], "any"), - "MessageObject": o([ - { json: "entities", js: "entities", typ: u(undefined, m(r("EntityValue"))) }, - { json: "text", js: "text", typ: u(undefined, r("PurpleMessageText")) }, - { json: "type", js: "type", typ: r("MessageType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "EntityValue": o([ - { json: "action", js: "action", typ: u(undefined, r("ActionType")) }, - { json: "app", js: "app", typ: u(undefined, r("AppIdentifier")) }, - { json: "channelId", js: "channelId", typ: u(undefined, "") }, - { json: "context", js: "context", typ: u(undefined, r("ContextElement")) }, - { json: "intent", js: "intent", typ: u(undefined, "") }, - { json: "title", js: "title", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("EntityType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "data", js: "data", typ: u(undefined, r("EntityData")) }, - ], "any"), - "EntityData": o([ - { json: "dataUri", js: "dataUri", typ: "" }, - { json: "name", js: "name", typ: "" }, - ], "any"), - "PurpleMessageText": o([ - { json: "text/markdown", js: "text/markdown", typ: u(undefined, "") }, - { json: "text/plain", js: "text/plain", typ: u(undefined, "") }, - ], "any"), - "ChatOptions": o([ - { json: "allowAddUser", js: "allowAddUser", typ: u(undefined, true) }, - { json: "allowHistoryBrowsing", js: "allowHistoryBrowsing", typ: u(undefined, true) }, - { json: "allowMessageCopy", js: "allowMessageCopy", typ: u(undefined, true) }, - { json: "groupRecipients", js: "groupRecipients", typ: u(undefined, true) }, - { json: "isPublic", js: "isPublic", typ: u(undefined, true) }, - ], "any"), - "ChatMessage": o([ - { json: "chatRoom", js: "chatRoom", typ: r("ChatRoomObject") }, - { json: "message", js: "message", typ: r("MessageObject") }, - { json: "type", js: "type", typ: r("ChatMessageType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "ChatRoomObject": o([ - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "providerName", js: "providerName", typ: "" }, - { json: "type", js: "type", typ: r("ChatRoomType") }, - { json: "url", js: "url", typ: u(undefined, "") }, - ], "any"), - "ChatRoom": o([ - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "providerName", js: "providerName", typ: "" }, - { json: "type", js: "type", typ: r("ChatRoomType") }, - { json: "url", js: "url", typ: u(undefined, "") }, - ], "any"), - "ChatSearchCriteria": o([ - { json: "criteria", js: "criteria", typ: a(u(r("OrganizationObject"), "")) }, - { json: "type", js: "type", typ: r("ChatSearchCriteriaType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "OrganizationObject": o([ - { json: "id", js: "id", typ: r("Identifiers") }, - { json: "market", js: "market", typ: u(undefined, r("OrganizationMarket")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("TentacledInteractionType") }, - ], "any"), - "Identifiers": o([ - { json: "BBG", js: "BBG", typ: u(undefined, "") }, - { json: "CUSIP", js: "CUSIP", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - { json: "FIGI", js: "FIGI", typ: u(undefined, "") }, - { json: "ISIN", js: "ISIN", typ: u(undefined, "") }, - { json: "PERMID", js: "PERMID", typ: u(undefined, "") }, - { json: "RIC", js: "RIC", typ: u(undefined, "") }, - { json: "SEDOL", js: "SEDOL", typ: u(undefined, "") }, - { json: "ticker", js: "ticker", typ: u(undefined, "") }, - { json: "LEI", js: "LEI", typ: u(undefined, "") }, - { json: "email", js: "email", typ: u(undefined, "") }, - ], "any"), - "Contact": o([ - { json: "id", js: "id", typ: r("FluffyContactIdentifiers") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("FluffyInteractionType") }, - ], "any"), - "FluffyContactIdentifiers": o([ - { json: "email", js: "email", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - ], "any"), - "ContactList": o([ - { json: "contacts", js: "contacts", typ: a(r("ContactElement")) }, - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("ContactListType") }, - ], "any"), - "Context": o([ - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: "" }, - ], "any"), - "Country": o([ - { json: "id", js: "id", typ: r("CountryID") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("CountryType") }, - ], "any"), - "CountryID": o([ - { json: "COUNTRY_ISOALPHA2", js: "COUNTRY_ISOALPHA2", typ: u(undefined, "") }, - { json: "COUNTRY_ISOALPHA3", js: "COUNTRY_ISOALPHA3", typ: u(undefined, "") }, - { json: "ISOALPHA2", js: "ISOALPHA2", typ: u(undefined, "") }, - { json: "ISOALPHA3", js: "ISOALPHA3", typ: u(undefined, "") }, - ], "any"), - "Currency": o([ - { json: "id", js: "id", typ: r("CurrencyID") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("CurrencyType") }, - ], "any"), - "CurrencyID": o([ - { json: "CURRENCY_ISOCODE", js: "CURRENCY_ISOCODE", typ: u(undefined, "") }, - ], "any"), - "Email": o([ - { json: "recipients", js: "recipients", typ: r("EmailRecipients") }, - { json: "subject", js: "subject", typ: u(undefined, "") }, - { json: "textBody", js: "textBody", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("EmailType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "EmailRecipients": o([ - { json: "id", js: "id", typ: u(undefined, r("ContactTIdentifiers")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("EmailRecipientsType") }, - { json: "contacts", js: "contacts", typ: u(undefined, a(r("ContactElement"))) }, - ], "any"), - "ContactTIdentifiers": o([ - { json: "email", js: "email", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - ], "any"), - "FileAttachment": o([ - { json: "data", js: "data", typ: r("FileAttachmentData") }, - { json: "type", js: "type", typ: r("FileAttachmentType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "FileAttachmentData": o([ - { json: "dataUri", js: "dataUri", typ: "" }, - { json: "name", js: "name", typ: "" }, - ], "any"), - "Instrument": o([ - { json: "id", js: "id", typ: r("FluffyInstrumentIdentifiers") }, - { json: "market", js: "market", typ: u(undefined, r("PurpleMarket")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("PurpleInteractionType") }, - ], "any"), - "FluffyInstrumentIdentifiers": o([ - { json: "BBG", js: "BBG", typ: u(undefined, "") }, - { json: "CUSIP", js: "CUSIP", typ: u(undefined, "") }, - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - { json: "FIGI", js: "FIGI", typ: u(undefined, "") }, - { json: "ISIN", js: "ISIN", typ: u(undefined, "") }, - { json: "PERMID", js: "PERMID", typ: u(undefined, "") }, - { json: "RIC", js: "RIC", typ: u(undefined, "") }, - { json: "SEDOL", js: "SEDOL", typ: u(undefined, "") }, - { json: "ticker", js: "ticker", typ: u(undefined, "") }, - ], "any"), - "PurpleMarket": o([ - { json: "BBG", js: "BBG", typ: u(undefined, "") }, - { json: "COUNTRY_ISOALPHA2", js: "COUNTRY_ISOALPHA2", typ: u(undefined, "") }, - { json: "MIC", js: "MIC", typ: u(undefined, "") }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "InstrumentList": o([ - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "instruments", js: "instruments", typ: a(r("InstrumentElement")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("InstrumentListType") }, - ], "any"), - "Interaction": o([ - { json: "description", js: "description", typ: "" }, - { json: "id", js: "id", typ: u(undefined, r("InteractionID")) }, - { json: "initiator", js: "initiator", typ: u(undefined, r("ContactElement")) }, - { json: "interactionType", js: "interactionType", typ: "" }, - { json: "origin", js: "origin", typ: u(undefined, "") }, - { json: "participants", js: "participants", typ: r("ContactListObject") }, - { json: "timeRange", js: "timeRange", typ: r("TimeRangeObject") }, - { json: "type", js: "type", typ: r("InteractionType") }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "InteractionID": o([ - { json: "SALESFORCE", js: "SALESFORCE", typ: u(undefined, "") }, - { json: "SINGLETRACK", js: "SINGLETRACK", typ: u(undefined, "") }, - { json: "URI", js: "URI", typ: u(undefined, "") }, - ], "any"), - "Message": o([ - { json: "entities", js: "entities", typ: u(undefined, m(r("EntityValue"))) }, - { json: "text", js: "text", typ: u(undefined, r("FluffyMessageText")) }, - { json: "type", js: "type", typ: r("MessageType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "FluffyMessageText": o([ - { json: "text/markdown", js: "text/markdown", typ: u(undefined, "") }, - { json: "text/plain", js: "text/plain", typ: u(undefined, "") }, - ], "any"), - "Nothing": o([ - { json: "type", js: "type", typ: r("NothingType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "Order": o([ - { json: "details", js: "details", typ: u(undefined, r("PurpleOrderDetails")) }, - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("OrderType") }, - ], "any"), - "PurpleOrderDetails": o([ - { json: "product", js: "product", typ: u(undefined, r("ProductObject")) }, - ], "any"), - "ProductObject": o([ - { json: "id", js: "id", typ: m("") }, - { json: "instrument", js: "instrument", typ: u(undefined, r("InstrumentElement")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("ProductType") }, - ], "any"), - "OrderList": o([ - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "orders", js: "orders", typ: a(r("OrderElement")) }, - { json: "type", js: "type", typ: r("OrderListType") }, - ], "any"), - "OrderElement": o([ - { json: "details", js: "details", typ: u(undefined, r("FluffyOrderDetails")) }, - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("OrderType") }, - ], "any"), - "FluffyOrderDetails": o([ - { json: "product", js: "product", typ: u(undefined, r("ProductObject")) }, - ], "any"), - "Organization": o([ - { json: "id", js: "id", typ: r("OrganizationIdentifiers") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("StickyInteractionType") }, - ], "any"), - "OrganizationIdentifiers": o([ - { json: "FDS_ID", js: "FDS_ID", typ: u(undefined, "") }, - { json: "LEI", js: "LEI", typ: u(undefined, "") }, - { json: "PERMID", js: "PERMID", typ: u(undefined, "") }, - ], "any"), - "Portfolio": o([ - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "positions", js: "positions", typ: a(r("PositionElement")) }, - { json: "type", js: "type", typ: r("PortfolioType") }, - ], "any"), - "PositionElement": o([ - { json: "holding", js: "holding", typ: 3.14 }, - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "instrument", js: "instrument", typ: r("InstrumentElement") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("PositionType") }, - ], "any"), - "Position": o([ - { json: "holding", js: "holding", typ: 3.14 }, - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "instrument", js: "instrument", typ: r("InstrumentElement") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("PositionType") }, - ], "any"), - "Product": o([ - { json: "id", js: "id", typ: m("") }, - { json: "instrument", js: "instrument", typ: u(undefined, r("InstrumentElement")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "type", js: "type", typ: r("ProductType") }, - ], "any"), - "TimeRange": o([ - { json: "endTime", js: "endTime", typ: u(undefined, Date) }, - { json: "startTime", js: "startTime", typ: u(undefined, Date) }, - { json: "type", js: "type", typ: r("TimeRangeType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "Trade": o([ - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "product", js: "product", typ: r("ProductObject") }, - { json: "type", js: "type", typ: r("TradeType") }, - ], "any"), - "TradeList": o([ - { json: "id", js: "id", typ: u(undefined, m("")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "trades", js: "trades", typ: a(r("TradeElement")) }, - { json: "type", js: "type", typ: r("TradeListType") }, - ], "any"), - "TradeElement": o([ - { json: "id", js: "id", typ: m("") }, - { json: "name", js: "name", typ: u(undefined, "") }, - { json: "product", js: "product", typ: r("ProductObject") }, - { json: "type", js: "type", typ: r("TradeType") }, - ], "any"), - "TransactionResult": o([ - { json: "context", js: "context", typ: u(undefined, r("ContextElement")) }, - { json: "message", js: "message", typ: u(undefined, "") }, - { json: "status", js: "status", typ: r("TransactionStatus") }, - { json: "type", js: "type", typ: r("TransactionResultType") }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "Valuation": o([ - { json: "CURRENCY_ISOCODE", js: "CURRENCY_ISOCODE", typ: "" }, - { json: "expiryTime", js: "expiryTime", typ: u(undefined, Date) }, - { json: "price", js: "price", typ: u(undefined, 3.14) }, - { json: "type", js: "type", typ: r("ValuationType") }, - { json: "valuationTime", js: "valuationTime", typ: u(undefined, Date) }, - { json: "value", js: "value", typ: 3.14 }, - { json: "id", js: "id", typ: u(undefined, m("any")) }, - { json: "name", js: "name", typ: u(undefined, "") }, - ], "any"), - "ActionType": [ - "broadcast", - "raiseIntent", - ], - "ActionTypeEnum": [ - "fdc3.action", - ], - "PurpleInteractionType": [ - "fdc3.instrument", - ], - "TimeRangeType": [ - "fdc3.timeRange", - ], - "ChartStyle": [ - "bar", - "candle", - "custom", - "heatmap", - "histogram", - "line", - "mountain", - "pie", - "scatter", - "stacked-bar", - ], - "ChartType": [ - "fdc3.chart", - ], - "FluffyInteractionType": [ - "fdc3.contact", - ], - "ContactListType": [ - "fdc3.contactList", - ], - "EntityType": [ - "fdc3.action", - "fdc3.fileAttachment", - ], - "MessageType": [ - "fdc3.message", - ], - "ChatInitSettingsType": [ - "fdc3.chat.initSettings", - ], - "ChatRoomType": [ - "fdc3.chat.room", - ], - "ChatMessageType": [ - "fdc3.chat.message", - ], - "TentacledInteractionType": [ - "fdc3.contact", - "fdc3.instrument", - "fdc3.organization", - ], - "ChatSearchCriteriaType": [ - "fdc3.chat.searchCriteria", - ], - "CountryType": [ - "fdc3.country", - ], - "CurrencyType": [ - "fdc3.currency", - ], - "EmailRecipientsType": [ - "fdc3.contact", - "fdc3.contactList", - ], - "EmailType": [ - "fdc3.email", - ], - "FileAttachmentType": [ - "fdc3.fileAttachment", - ], - "InstrumentListType": [ - "fdc3.instrumentList", - ], - "InteractionType": [ - "fdc3.interaction", - ], - "NothingType": [ - "fdc3.nothing", - ], - "ProductType": [ - "fdc3.product", - ], - "OrderType": [ - "fdc3.order", - ], - "OrderListType": [ - "fdc3.orderList", - ], - "StickyInteractionType": [ - "fdc3.organization", - ], - "PositionType": [ - "fdc3.position", - ], - "PortfolioType": [ - "fdc3.portfolio", - ], - "TradeType": [ - "fdc3.trade", - ], - "TradeListType": [ - "fdc3.tradeList", - ], - "TransactionStatus": [ - "Created", - "Deleted", - "Failed", - "Updated", - ], - "TransactionResultType": [ - "fdc3.transactionResult", - ], - "ValuationType": [ - "fdc3.valuation", - ], -}; diff --git a/src/internal/typeHelpers.ts b/src/internal/typeHelpers.ts deleted file mode 100644 index bc3583497..000000000 --- a/src/internal/typeHelpers.ts +++ /dev/null @@ -1,12 +0,0 @@ -type AtLeastOne = [T, ...T[]]; - -/** - * Ensures at compile time that the given string tuple is exhaustive on a given union type, i.e. contains ALL possible values of the given UNION_TYPE. - */ -export const exhaustiveStringTuple = () => >( - ...tuple: L extends any - ? Exclude extends never - ? L - : Exclude[] - : never -) => tuple; diff --git a/toolbox/fdc3-explained/1.0/main.js b/toolbox/fdc3-explained/1.0/main.js index 13242324b..223bd8342 100644 --- a/toolbox/fdc3-explained/1.0/main.js +++ b/toolbox/fdc3-explained/1.0/main.js @@ -3,7 +3,6 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ - // enable application when FDC3 is available document.addEventListener('DOMContentLoaded', () => { fdc3Init(enablePage); @@ -11,7 +10,7 @@ document.addEventListener('DOMContentLoaded', () => { // check if FDC3 is available function fdc3Init(callback) { - let fdc3Tries = 10 + let fdc3Tries = 10; const onFDC3Ready = () => { if (window.fdc3) { @@ -22,14 +21,14 @@ function fdc3Init(callback) { window.setTimeout(onFDC3Ready, 100); } } - } + }; onFDC3Ready(); } -const providerDetails = document.getElementById("providerDetails") -const broadcastButton = document.getElementById("broadcastButton") -const broadcastText = document.getElementById("broadcastText") +const providerDetails = document.getElementById('providerDetails'); +const broadcastButton = document.getElementById('broadcastButton'); +const broadcastText = document.getElementById('broadcastText'); function enablePage() { console.log('FDC3 is available'); @@ -47,7 +46,7 @@ function enablePage() { broadcastText.disabled = false; } -function updateProviderDetails(details){ +function updateProviderDetails(details) { providerDetails.innerText = details; } diff --git a/toolbox/fdc3-explained/1.1/main.js b/toolbox/fdc3-explained/1.1/main.js index db11fc8b5..ae43309a9 100644 --- a/toolbox/fdc3-explained/1.1/main.js +++ b/toolbox/fdc3-explained/1.1/main.js @@ -56,7 +56,6 @@ function displayFDC3Support() { } function getPlatform() { - // TODO: add G42 and FDC3 Desktop Agent to vendors // NOTE: conceptually replaced with fdc3.getInfo if (window.FSBL) { @@ -68,7 +67,7 @@ function getPlatform() { } } -function updateProviderDetails(details){ +function updateProviderDetails(details) { const providerDetails = document.getElementById('providerDetails'); providerDetails.innerText = details; } @@ -109,7 +108,9 @@ function setUpEventListeners() { document.getElementById('join-channel__btn').addEventListener('click', joinChannel); - document.getElementById('leave-channel__btn').addEventListener('click', () => { fdc3.leaveCurrentChannel(); }); + document.getElementById('leave-channel__btn').addEventListener('click', () => { + fdc3.leaveCurrentChannel(); + }); document.getElementById('broadcast__btn').addEventListener('click', broadcastFDC3Context); diff --git a/toolbox/fdc3-explained/1.1/styles.css b/toolbox/fdc3-explained/1.1/styles.css index f264a1cca..385afc6ff 100644 --- a/toolbox/fdc3-explained/1.1/styles.css +++ b/toolbox/fdc3-explained/1.1/styles.css @@ -6,9 +6,9 @@ @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP&display=swap'); body { - font-family: "Noto Sans JP",sans-serif; - margin:0; - padding:0; + font-family: 'Noto Sans JP', sans-serif; + margin: 0; + padding: 0; background-color: white; } @@ -19,13 +19,13 @@ body { place-content: center; } table { - border:0; + border: 0; } -tr{ - border:0; +tr { + border: 0; } -td{ - border:0; +td { + border: 0; } textarea { width: 400px; diff --git a/toolbox/fdc3-explained/1.2/main.js b/toolbox/fdc3-explained/1.2/main.js index 5f41901d8..d4ec481a8 100644 --- a/toolbox/fdc3-explained/1.2/main.js +++ b/toolbox/fdc3-explained/1.2/main.js @@ -66,12 +66,12 @@ function getPlatform() { updateFDC3Version(`${fdc3Info.fdc3Version}`); } -function updateProviderDetails(details){ +function updateProviderDetails(details) { const providerDetails = document.getElementById('providerDetails'); providerDetails.innerText = details; } -function updateFDC3Version(details){ +function updateFDC3Version(details) { const fdc3Details = document.getElementById('fdc3Details'); fdc3Details.innerText = details; } @@ -113,15 +113,17 @@ function setUpEventListeners() { document.getElementById('join-channel__btn').addEventListener('click', joinChannel); - document.getElementById('leave-channel__btn').addEventListener('click', () => { fdc3.leaveCurrentChannel(); }); + document.getElementById('leave-channel__btn').addEventListener('click', () => { + fdc3.leaveCurrentChannel(); + }); document.getElementById('broadcast__btn').addEventListener('click', broadcastFDC3Context); document.getElementById('raise-intent__btn').addEventListener('click', raiseIntent); document.getElementById('get_context__btn').addEventListener('click', event => { - let contextType = document.getElementById('context-type').value; - getContext(contextType); + let contextType = document.getElementById('context-type').value; + getContext(contextType); }); } @@ -167,21 +169,18 @@ async function getContext(contextType) { // if context type is passed in then only listen on that specific context if (contextType) { - contextListener = fdc3.addContextListener( - contextType, - context => displayContext(JSON.stringify(context, null, 2)) + contextListener = fdc3.addContextListener(contextType, context => + displayContext(JSON.stringify(context, null, 2)) ); } else { - contextListener = fdc3.addContextListener( - context => displayContext(JSON.stringify(context, null, 2)) - ); + contextListener = fdc3.addContextListener(context => displayContext(JSON.stringify(context, null, 2))); } } catch (error) { console.error('Unable to add a context listener', error); } } -function displayContext(text){ +function displayContext(text) { let contextResultBox = document.getElementById('context-result'); contextResultBox.innerText = text; } diff --git a/toolbox/fdc3-explained/1.2/styles.css b/toolbox/fdc3-explained/1.2/styles.css index 3ac85c94b..fe3e2942f 100644 --- a/toolbox/fdc3-explained/1.2/styles.css +++ b/toolbox/fdc3-explained/1.2/styles.css @@ -3,10 +3,10 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ -@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+JP&display=swap"); +@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP&display=swap'); .body { - font-family: "Noto Sans JP", sans-serif; + font-family: 'Noto Sans JP', sans-serif; margin: 0; padding: 0; background-color: #284b63; @@ -36,7 +36,9 @@ button { } button:active { outline: transparent; - box-shadow: inset #3c3c3c70 2px 3px 3px 0px, #03a9f433 1px 2px 0px 0px; + box-shadow: + inset #3c3c3c70 2px 3px 3px 0px, + #03a9f433 1px 2px 0px 0px; transform: translateY(2px); transition: ease-out 0.1s; } @@ -45,7 +47,8 @@ button:focus { } input { background: #e8f7ff; - box-shadow: inset -2px -2px 2px 0px rgb(255 255 255 / 12%), + box-shadow: + inset -2px -2px 2px 0px rgb(255 255 255 / 12%), inset 2px 3px 6px 2px rgb(0 0 0 / 19%); border-radius: 6px; border: 2px solid transparent; @@ -58,7 +61,8 @@ input:focus { } textarea { background: #e8f7ff; - box-shadow: inset -3px -5px 5px 1px rgb(255 255 255 / 12%), + box-shadow: + inset -3px -5px 5px 1px rgb(255 255 255 / 12%), inset 2px 3px 6px 2px rgb(0 0 0 / 19%); border-radius: 6px; border: 2px solid transparent; diff --git a/toolbox/fdc3-for-web/demo/.gitignore b/toolbox/fdc3-for-web/demo/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/toolbox/fdc3-for-web/demo/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/toolbox/fdc3-for-web/demo/README.md b/toolbox/fdc3-for-web/demo/README.md new file mode 100644 index 000000000..9f7057a64 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/README.md @@ -0,0 +1,99 @@ +# FDC3 Demo Desktop Agent + +This repository contains a [FDC3 2.0 Conformant](../../fdc3-conformance/README.md) Desktop Agent reference implementation, built on top of the [FDC3 Web Implementation](../fdc3-web-impl/README.md). + +## Running The Demo + +From the root of the repository, run: + +```bash + +npm install +npm run build +npm run dev + +``` + +If all goes well, you should see the following message in the console: + +``` +Server is listening on port 4000. Head to http://localhost:4000/static/da/index.html +``` + +And the web page will load in Chrome looking like this: + +![Demo Running In Chrome](./images/demo.png) + +## Features + +The demo Desktop Agent provides the following features: + + +### 1. Browser-Based Desktop Agent + +![Console](./images/console.png) + +All FDC3 state is maintained in-browser with the exception of some very simple routing (expressed in `src/server/main.ts`) that links the various connections together. Therefore, refreshing the Desktop Agent's window will reset the state of the Desktop Agent. + +This means that you can view FDC3 communications within the Demo Desktop Agent's browser window, as shown in the above screenshot. + +### 2. Tabs or Frames + +![Tabs or Frames](./images/tab1.png) + +`demo` supports launching of FDC3 Apps as either tabs or frames. You can choose the approach with the drop-down on the demo page. + +### 3. Both Parent Post-Message and Iframe Communication Approaches + +![IFrame or Parent Post Message](./images/tab2.png) + +FDC3 WCP supports both communication from the App to the Desktop Agent via direct parent window postMessage and via postMessage to an iframe. `demo` supports both approaches and you can choose the approach with the middle drop-down on the demo page. + +### 4. Intent Resolver / Channel Selector UI + +![Choosing The UI](./images/tab3.png) + +FDC3 WCP supports the ability for Desktop Agents to specify UI for resolving intents or selecting channels, and FDC3 also provides a default implementation which Desktop Agent implementers can use if they want. `demo` allows the user to choose between `demo`'s own Channel Selector and Intent Resolver or the Default Web FDC3 ones (running either on localhost or on the fdc3.finos.org website). This is done with the right-most drop-down on the launch page. + +#### Channel Selectors + +|Mode | Default Web FDC3 UI | Demo UI | +|---------------|---------------------|---------| +|Collapsed |![Default Collapsed](./images/channel-selector/default-collapsed.png)|![Demo Collapsed](./images/channel-selector/demo-collapsed.png)| +|Expanded |![Default Expanded](./images/channel-selector/default-expanded.png)|![Demo Expanded](./images/channel-selector/demo-expanded.png)| + +**Note:** The Demo UI Channel Selector also supports **dragging** when in expanded mode. You can reposition it on the screen by dragging on the six circles on the right of the title bar. + +#### Intent Resolvers + +Here are screenshots of the two different UIs provided for intent resolution: + +![Default](./images/intent-resolver/default.png) ![Demo Implementation](./images/intent-resolver/demo-implementation.png) + +### 5. App Directory Loaded From URL + +![AppD Configuration](./images/appd.png) + +The Demo Desktop Agent doesn't provide UI for selecting the app directory, however it is trivial to change this by modifying the `dummy-desktop-agent.ts` file. You are able to specify as many different app directories to load as you want. Note, `appd.json` and `local-conformance-2_0.v2.json` are provided in the `static/da` directory for you. + +The `appd.json` file is a simple JSON file that specifies some demo apps (see below). The `local-conformance-2_0.v2.json` file is for running 2.0 conformance tests. + +## Demo Applications + +As shown in the screenshot above, there are 7 demo applications provided by Demo. These attempt to exercise the functionality of FDC3 in a simple way. They are: + +- **Broadcaster**: When you hit "Press Me To Broadcast", it joins User Channel 1 and then begins periodically broadcasting simple messages, until it gets to 50 messages and stops. + +- **Receiver**: This also joins User Channel 1, and logs the contents of any messages it receives. Tip: Try changing the user channel using the channel selector in either of these two apps to see what happens. + +- **Receiver and Broadcaster**: A single App combining the functionality of the two above. It will broadcast messages and log them. + +- **FDC3 Workbench**: The venerable [FDC3 Workbench](../../fdc3-workbench/README.md), which provides a simple UI for exercising all of the interoperability features of FDC3. Tip: try running a few of these and testing sending messages via channels between the instances. + +- **View News Intent Listener**: One of two apps that listens for the `ViewNews` intent, logs the context it receives on screen and responds with an `fdc3.test` context. Tip: This is useful for testing out intent resolution. Try going into the FDC3 Workbench and raising a `ViewNews` intent with an `fdc3.instrument` context and you'll see an intent resolver pop up. + +- **View News and View Quote Intent Listener**: Similar to the above, but also responds to the `ViewQuote` intent. tip: As this is the only app responding to `ViewQuote`, you will not see an intent resolver when you raise `ViewQuote` with an `fdc3.instrument`. + +- **Intent Result**: On launch, raises a `ViewQuote` intent with an `fdc3.instrument` context. This is useful for testing out intent resolution without having to bother with the FDC3 Workbench. + +- **Intent Result 2**: On launch, raises a `ViewNews` intent with an `fdc3.instrument` context. Tip: Try changing the intent resolver in the UI to the default one and see what happens. \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/eslint.config.mjs b/toolbox/fdc3-for-web/demo/eslint.config.mjs new file mode 100644 index 000000000..c7018a2c8 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, +]; diff --git a/toolbox/fdc3-for-web/demo/images/appd.png b/toolbox/fdc3-for-web/demo/images/appd.png new file mode 100644 index 000000000..cd928308e Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/appd.png differ diff --git a/toolbox/fdc3-for-web/demo/images/channel-selector/default-collapsed.png b/toolbox/fdc3-for-web/demo/images/channel-selector/default-collapsed.png new file mode 100644 index 000000000..83ac206d0 Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/channel-selector/default-collapsed.png differ diff --git a/toolbox/fdc3-for-web/demo/images/channel-selector/default-expanded.png b/toolbox/fdc3-for-web/demo/images/channel-selector/default-expanded.png new file mode 100644 index 000000000..8253dc1cb Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/channel-selector/default-expanded.png differ diff --git a/toolbox/fdc3-for-web/demo/images/channel-selector/demo-collapsed.png b/toolbox/fdc3-for-web/demo/images/channel-selector/demo-collapsed.png new file mode 100644 index 000000000..181002ce1 Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/channel-selector/demo-collapsed.png differ diff --git a/toolbox/fdc3-for-web/demo/images/channel-selector/demo-expanded.png b/toolbox/fdc3-for-web/demo/images/channel-selector/demo-expanded.png new file mode 100644 index 000000000..33fce4c10 Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/channel-selector/demo-expanded.png differ diff --git a/toolbox/fdc3-for-web/demo/images/console.png b/toolbox/fdc3-for-web/demo/images/console.png new file mode 100644 index 000000000..e5010bead Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/console.png differ diff --git a/toolbox/fdc3-for-web/demo/images/demo.png b/toolbox/fdc3-for-web/demo/images/demo.png new file mode 100644 index 000000000..afca9601a Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/demo.png differ diff --git a/toolbox/fdc3-for-web/demo/images/intent-resolver/default.png b/toolbox/fdc3-for-web/demo/images/intent-resolver/default.png new file mode 100644 index 000000000..87b70790a Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/intent-resolver/default.png differ diff --git a/toolbox/fdc3-for-web/demo/images/intent-resolver/demo-implementation.png b/toolbox/fdc3-for-web/demo/images/intent-resolver/demo-implementation.png new file mode 100644 index 000000000..251fa387b Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/intent-resolver/demo-implementation.png differ diff --git a/toolbox/fdc3-for-web/demo/images/tab1.png b/toolbox/fdc3-for-web/demo/images/tab1.png new file mode 100644 index 000000000..413dcbdf8 Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/tab1.png differ diff --git a/toolbox/fdc3-for-web/demo/images/tab2.png b/toolbox/fdc3-for-web/demo/images/tab2.png new file mode 100644 index 000000000..3a556dc94 Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/tab2.png differ diff --git a/toolbox/fdc3-for-web/demo/images/tab3.png b/toolbox/fdc3-for-web/demo/images/tab3.png new file mode 100644 index 000000000..d82285d7c Binary files /dev/null and b/toolbox/fdc3-for-web/demo/images/tab3.png differ diff --git a/toolbox/fdc3-for-web/demo/package.json b/toolbox/fdc3-for-web/demo/package.json new file mode 100644 index 000000000..a585a499f --- /dev/null +++ b/toolbox/fdc3-for-web/demo/package.json @@ -0,0 +1,36 @@ +{ + "name": "@finos/demo", + "private": true, + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "scripts": { + "dev": "nodemon -w src/server src/server/main.ts", + "lint": "eslint src/" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/color": "^4.2.0", + "@types/express": "^4.17.21", + "@types/node": "^20.16.11", + "color": "^4.2.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.13.0", + "nodemon": "^3.1.7", + "rimraf": "^6.0.1", + "typescript-eslint": "^8.17.0", + "vite": "^5.4.9" + }, + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.5.12", + "express": "^4.21.1", + "socket.io": "^4.8.0", + "socket.io-client": "^4.8.0", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1", + "vite-express": "^0.15.0" + } +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app1.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app1.ts new file mode 100644 index 000000000..92e057f26 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app1.ts @@ -0,0 +1,34 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +function createContext(i: number) { + return { + type: 'demo.counter', + count: i, + }; +} + +/** + * Calling this function should get the fdc3 DesktopAgent and then + * broadcast 50 context elements to the default channel. + * + * Can be called any number of times. + */ +async function startBroadcasting() { + console.log('starting...'); + const fdc3 = await getAgent(); + console.log('got api...'); + const cc = await fdc3.getCurrentChannel(); + + if (cc == null) { + const channels = await fdc3.getUserChannels(); + await fdc3.joinUserChannel(channels[0].id); + } + for (let index = 0; index < 50; index++) { + setTimeout(() => fdc3.broadcast(createContext(index)), index * 1000); + } +} + +window.addEventListener('load', () => { + const broadcast = document.getElementById('broadcast'); + broadcast?.addEventListener('click', () => startBroadcasting()); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app2.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app2.ts new file mode 100644 index 000000000..59ec32113 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app2.ts @@ -0,0 +1,25 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +/** + * This demonstrates using the API via a promise + */ +getAgent().then(async fdc3 => { + console.log('in promise'); + const log = document.getElementById('log'); + const msg = document.createElement('p'); + const info = await fdc3.getInfo(); + msg.textContent = 'FDC3 Loaded: ' + JSON.stringify(info); + log?.appendChild(msg); + + const cc = await fdc3.getCurrentChannel(); + if (cc == null) { + const channels = await fdc3.getUserChannels(); + await fdc3.joinUserChannel(channels[0].id); + } + + fdc3.addContextListener(null, context => { + const msg = document.createElement('p'); + msg.textContent = 'Received: ' + JSON.stringify(context); + log?.appendChild(msg); + }); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app3.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app3.ts new file mode 100644 index 000000000..125001577 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app3.ts @@ -0,0 +1,7 @@ +import './app1'; +import './app2'; + +/** + * This demonstrates getting two separate APIs in the same app, and using them for + * intra-app comms. + */ diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app4.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app4.ts new file mode 100644 index 000000000..c0dca6a73 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app4.ts @@ -0,0 +1,23 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +/** + * This demonstrates using the API via a promise + */ +getAgent().then(async fdc3 => { + console.log('in promise'); + + fdc3.addIntentListener('ViewNews', async context => { + const msg = document.createElement('p'); + msg.textContent = 'Received News!: ' + JSON.stringify(context); + const log = document.getElementById('log'); + log?.appendChild(msg); + + return { + type: 'fdc3.test', + id: { + from: 'app4', + intent: 'ViewNews', + }, + }; + }); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app5.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app5.ts new file mode 100644 index 000000000..59a438d46 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app5.ts @@ -0,0 +1,36 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +/** + * This demonstrates using the API via a promise + */ +getAgent().then(async fdc3 => { + console.log('in promise'); + + fdc3.addIntentListener('ViewNews', async context => { + const msg = document.createElement('p'); + msg.textContent = 'Received News!: ' + JSON.stringify(context); + const log = document.getElementById('log'); + log?.appendChild(msg); + return { + type: 'fdc3.test', + id: { + from: 'app5', + intent: 'ViewNews', + }, + }; + }); + + fdc3.addIntentListener('ViewQuote', async context => { + const msg = document.createElement('p'); + msg.textContent = 'Received Quote!: ' + JSON.stringify(context); + const log = document.getElementById('log'); + log?.appendChild(msg); + return { + type: 'fdc3.test', + id: { + from: 'app5', + intent: 'ViewQuote', + }, + }; + }); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app6.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app6.ts new file mode 100644 index 000000000..5b777139d --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app6.ts @@ -0,0 +1,19 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +/** + * This demonstrates using the API via a promise + */ +getAgent().then(async fdc3 => { + console.log('in promise'); + const log = document.getElementById('log'); + const reso = await fdc3.raiseIntent('ViewQuote', { + type: 'fdc3.instrument', + id: { + isin: 'Abc123', + }, + }); + + log!.textContent = `Got resolution: ${JSON.stringify(reso)}`; + const result = await reso.getResult(); + log!.textContent += `Got result: ${JSON.stringify(result)}`; +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/apps/app7.ts b/toolbox/fdc3-for-web/demo/src/client/apps/app7.ts new file mode 100644 index 000000000..8d2686daf --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/apps/app7.ts @@ -0,0 +1,23 @@ +import { getAgent } from '@finos/fdc3-get-agent'; + +/** + * This demonstrates using the API via a promise + */ +getAgent().then(async fdc3 => { + console.log('in promise'); + const log = document.getElementById('log'); + const reso = await fdc3.raiseIntent('ViewNews', { + type: 'fdc3.instrument', + id: { + isin: 'Abc123', + }, + }); + + if (log) { + log.textContent = `Got resolution: ${JSON.stringify(reso)}`; + const result = await reso.getResult(); + log.textContent += `Got result: ${JSON.stringify(result)}`; + } else { + console.error("Unable to load resolution as the log element didn't exist!"); + } +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/da/DemoServerContext.ts b/toolbox/fdc3-for-web/demo/src/client/da/DemoServerContext.ts new file mode 100644 index 000000000..4ea46f349 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/da/DemoServerContext.ts @@ -0,0 +1,282 @@ +import { + AppRegistration, + Directory, + DirectoryApp, + FDC3Server, + InstanceID, + ServerContext, + State, +} from '@finos/fdc3-web-impl'; +import { Socket } from 'socket.io-client'; +import { v4 as uuid } from 'uuid'; +import { FDC3_DA_EVENT } from '../../message-types'; +import { AppIdentifier, AppIntent, OpenError } from '@finos/fdc3'; + +enum Opener { + Tab, + Frame, +} + +type RunningAppRegistration = AppRegistration & { + window: Window; + url: string; +}; + +type LaunchingAppRegistration = AppRegistration & { + windowPromise: Promise; + url: string; +}; + +type DemoAppRegistration = RunningAppRegistration | LaunchingAppRegistration; + +//Type guard used to check if application launch details have a URL +function isWebAppLaunchDetails(details: object): details is { url: string } { + return (details as { url: string }).url !== undefined; +} + +//Type guard used to check if application is still launching (we are waiting on the window reference) +function isLaunchingAppRegistration( + details: RunningAppRegistration | LaunchingAppRegistration +): details is LaunchingAppRegistration { + return !!(details as LaunchingAppRegistration).windowPromise; +} + +//Type guard used to check if application has been launched (and we have received the window reference) +function isRunningAppRegistration( + details: RunningAppRegistration | LaunchingAppRegistration +): details is RunningAppRegistration { + return !!(details as RunningAppRegistration).window; +} + +export class DemoServerContext implements ServerContext { + private readonly socket: Socket; + private readonly directory: Directory; + private connections: (RunningAppRegistration | LaunchingAppRegistration)[] = []; + private server: FDC3Server | null = null; + + constructor(socket: Socket, directory: Directory) { + this.socket = socket; + this.directory = directory; + } + + setFDC3Server(server: FDC3Server): void { + this.server = server; + } + + async narrowIntents(_raiser: AppIdentifier, appIntents: AppIntent[] /*, _context: Context*/): Promise { + return appIntents; + } + + /** + * Sets the appId, url, state and either the window or a Promise for a given connection UUID. + */ + setInstanceDetails(uuid: InstanceID, meta: RunningAppRegistration | LaunchingAppRegistration): void { + //remove any existing records with this uuid + this.connections = this.connections.filter(ca => ca.instanceId !== uuid); + + const instanceDetails = { + ...meta, + instanceId: uuid, + }; + this.connections.push(instanceDetails); + + if (isLaunchingAppRegistration(meta)) { + //If the window wasn't fully realized yet, monitor the window promise so that it + // sets window when resolved. + meta.windowPromise.then((window: Window | null) => { + if (window) { + const launchedMeta: RunningAppRegistration = { + window: window, + url: meta.url, + appId: meta.appId, + instanceId: meta.instanceId, + state: meta.state, + }; + //will replace any existing record + this.setInstanceDetails(uuid, launchedMeta); + } else { + //delete this record as launch failed + this.connections = this.connections.filter(ca => ca.instanceId !== uuid); + console.error( + 'We did not receive a window reference after launching app: ', + meta.url, + '\nn.b. this may occur if a popup blocker prevented launch or the Cross-Origin-Opener-Policy opener policy is set' + ); + } + }); + } + } + + async getInstanceForWindow(window: Window): Promise { + const registration = this.connections.filter(isRunningAppRegistration).find(i => i.window == window); + if (registration) { + return registration; + } + + //check for as yet unrealized windows and then wait on those... + const launchingApps = this.connections.filter(isLaunchingAppRegistration); + + if (launchingApps.length == 0) { + console.warn('Could not locate an app registration for a window and there are no window launches in progress!'); + return; + } else { + //we need to wait on all currently launching windows as it could be any one of those + return new Promise(resolve => { + const toMonitor = launchingApps.length; + let doneCount = 0; + launchingApps.forEach(launchingApp => { + launchingApp.windowPromise.then(realizedWindow => { + doneCount++; + if (realizedWindow == window) { + //note that this record will separately be converting itself into a RunningAppRegistration + resolve({ + window: realizedWindow, + url: launchingApp.url, + appId: launchingApp.appId, + instanceId: launchingApp.instanceId, + state: launchingApp.state, + }); + } else if (doneCount >= toMonitor) { + //we did not find it :-( + resolve(undefined); + } + }); + }); + }); + } + } + + getInstanceDetails(uuid: InstanceID): DemoAppRegistration | undefined { + return this.connections.find(i => i.instanceId == uuid); + } + + getOpener(): Opener { + const cb = document.getElementById('opener') as HTMLInputElement; + const val = cb.value; + const out: Opener = Opener[val as keyof typeof Opener]; //Works with --noImplicitAny + return out; + } + + createUUID(): string { + return uuid(); + } + + /** + * Post an outgoing message to a particular app + */ + async post(message: object, to: InstanceID): Promise { + this.socket.emit(FDC3_DA_EVENT, message, to); + } + + openFrame(url: string): Promise { + const iframe = document.createElement('iframe'); + iframe.setAttribute('src', url); + iframe.style.width = '640px'; + iframe.style.height = '480px'; + document.body.appendChild(iframe); + + //wait for load event, after which contentWindow should not be null + const loadPromise = new Promise(resolve => { + iframe.onload = () => resolve(iframe.contentWindow); + }); + return loadPromise; + } + + openTab(url: string): Promise { + //n.b. There are cases where the window reference returned is null + // That can happen if the Cross-Origin-Opener-Policy opener policy is set (see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy) + // or a browser pop-up blocker gets in the way... + return Promise.resolve(window.open(url, '_blank')); + } + + async openUrl(url: string): Promise { + const opener = this.getOpener(); + switch (opener) { + case Opener.Tab: + return this.openTab(url); + case Opener.Frame: + return this.openFrame(url); + } + } + + async open(appId: string): Promise { + const details: DirectoryApp[] = this.directory.retrieveAppsById(appId) as DirectoryApp[]; + if (details.length > 0) { + const launchDetails = details[0].details; + if (isWebAppLaunchDetails(launchDetails)) { + const url = launchDetails.url ?? undefined; + + //We do not await the window or frame opening here as that can cause a race condition + // where the app loads and attempts to connect before we call `this.setInstanceDetails`. + //const window = await this.openUrl(url); + const windowPromise = this.openUrl(url); + const instanceId: InstanceID = this.createUUID(); + const metadata: LaunchingAppRegistration = { + appId, + instanceId, + windowPromise, + url, + state: State.Pending, + }; + + this.setInstanceDetails(instanceId, metadata); + return instanceId; + } else { + console.error('Unable to launch app without a URL, app: ', details[0]); + throw new Error(OpenError.ErrorOnLaunch); + } + } + + throw new Error(OpenError.AppNotFound); + } + + async getConnectedApps(): Promise { + return (await this.getAllApps()).filter(ca => ca.state == State.Connected); + } + + async isAppConnected(app: InstanceID): Promise { + const found = this.connections.find(a => a.instanceId == app && a.state == State.Connected); + return found != null; + } + + async setAppState(app: InstanceID, newState: State): Promise { + const found = this.connections.find(a => a.instanceId == app); + + //if this is a new termination (which might be due to a heartbeat) then notify the server + // if we were already terminated, don't bother as the server will notify us back and + // create a loop + if (found) { + const currentState = found.state; + if (currentState !== State.Terminated && newState === State.Terminated) { + this.server?.cleanup(app); + } + found.state = newState; + } + } + + async getAllApps(): Promise { + return this.connections.map(x => { + return { + appId: x.appId, + instanceId: x.instanceId, + state: x.state, + }; + }); + } + + log(message: string): void { + console.log(message); + } + + provider(): string { + return 'FDC3-Web-Demo'; + } + + providerVersion(): string { + return '0.1'; + } + + fdc3Version(): string { + return '2.0'; + } +} diff --git a/toolbox/fdc3-for-web/demo/src/client/da/FDC3_2_1_JSONDirectory.ts b/toolbox/fdc3-for-web/demo/src/client/da/FDC3_2_1_JSONDirectory.ts new file mode 100644 index 000000000..48b89dd2c --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/da/FDC3_2_1_JSONDirectory.ts @@ -0,0 +1,29 @@ +import { BasicDirectory } from '@finos/fdc3-web-impl/src/directory/BasicDirectory'; +import { DirectoryApp } from '@finos/fdc3-web-impl/src/directory/DirectoryInterface'; + +async function loadRemotely(u: string) { + const response = await fetch(u); + return await response.json(); +} + +async function load(url: string): Promise { + if (url.startsWith('http')) { + return await loadRemotely(url).then(convertToDirectoryList); + } else { + return await loadRemotely(window.location.origin + url).then(convertToDirectoryList); + } +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const convertToDirectoryList = (data: any) => { + return data.applications as DirectoryApp[]; +}; + +export class FDC3_2_1_JSONDirectory extends BasicDirectory { + constructor() { + super([]); + } + + async load(url: string) { + this.allApps = await load(url); + } +} diff --git a/toolbox/fdc3-for-web/demo/src/client/da/dummy-desktop-agent.ts b/toolbox/fdc3-for-web/demo/src/client/da/dummy-desktop-agent.ts new file mode 100644 index 000000000..090c5dd37 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/da/dummy-desktop-agent.ts @@ -0,0 +1,220 @@ +import { io } from 'socket.io-client'; +import { v4 as uuid } from 'uuid'; +import { APP_GOODBYE, APP_HELLO, DA_HELLO, FDC3_APP_EVENT } from '../../message-types'; +import { DemoServerContext } from './DemoServerContext'; +import { FDC3_2_1_JSONDirectory } from './FDC3_2_1_JSONDirectory'; +import { AppRegistration, DefaultFDC3Server, DirectoryApp, ServerContext } from '@finos/fdc3-web-impl'; +import { ChannelState, ChannelType } from '@finos/fdc3-web-impl/src/handlers/BroadcastHandler'; +import { link, UI, UI_URLS } from './util'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { WebConnectionProtocol3Handshake } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type WebConnectionProtocol2LoadURL = BrowserTypes.WebConnectionProtocol2LoadURL; + +function createAppStartButton(app: DirectoryApp, sc: ServerContext): HTMLDivElement { + const div: HTMLDivElement = document.createElement('div'); + div.classList.add('app'); + const h3 = document.createElement('h3'); + h3.textContent = app.title; + div.appendChild(h3); + const button = document.createElement('button'); + button.textContent = 'Start'; + button.onclick = () => sc.open(app.appId); + div.appendChild(button); + const p = document.createElement('p'); + p.textContent = app.description ?? ''; + div.appendChild(p); + return div; +} + +enum Approach { + IFRAME, + PARENT_POST_MESSAGE, +} + +function getApproach(): Approach { + const cb = document.getElementById('approach') as HTMLInputElement; + const val = cb.value; + const out: Approach = Approach[val as keyof typeof Approach]; //Works with --noImplicitAny + return out; +} + +function getUIKey(): UI { + const cb = document.getElementById('ui') as HTMLInputElement; + const val = cb.value; + const out: UI = UI[val as keyof typeof UI]; //Works with --noImplicitAny + return out; +} + +window.addEventListener('load', () => { + const desktopAgentUUID = uuid(); + + const socket = io(); + + socket.on('connect', async () => { + socket.emit(DA_HELLO, desktopAgentUUID); + + const directory = new FDC3_2_1_JSONDirectory(); + await directory.load('/static/da/appd.json'); + //await directory.load('/static/da/local-conformance-2_0.v2.json'); + const sc = new DemoServerContext(socket, directory); + + const channelDetails: ChannelState[] = [ + { + id: 'fdc3.channel.1', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 1', + color: 'red', + glyph: '1', + }, + }, + { + id: 'fdc3.channel.2', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 2', + color: 'orange', + glyph: '2', + }, + }, + { + id: 'fdc3.channel.3', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 3', + color: 'yellow', + glyph: '3', + }, + }, + { + id: 'fdc3.channel.4', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 4', + color: 'green', + glyph: '4', + }, + }, + { + id: 'fdc3.channel.5', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 5', + color: 'cyan', + glyph: '5', + }, + }, + { + id: 'fdc3.channel.6', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 6', + color: 'blue', + glyph: '6', + }, + }, + { + id: 'fdc3.channel.7', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 7', + color: 'magenta', + glyph: '7', + }, + }, + { + id: 'fdc3.channel.8', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Channel 8', + color: 'purple', + glyph: '8', + }, + }, + ]; + const fdc3Server = new DefaultFDC3Server(sc, directory, channelDetails, true, 20000, 10017); + + socket.on(FDC3_APP_EVENT, (msg, from) => { + fdc3Server.receive(msg, from); + }); + + socket.on(APP_GOODBYE, (id: string) => { + fdc3Server.cleanup(id); + }); + + // let's create buttons for some apps + const appList = document.getElementById('app-list') as HTMLOListElement; + directory.retrieveAllApps().forEach(app => { + appList.appendChild(createAppStartButton(app, sc)); + }); + + // set up Desktop Agent Proxy interface here + // disabling rule for checks on origin of messages - this could be improved by validating for origins we know we are working with + // nosemgrep: javascript.browser.security.insufficient-postmessage-origin-validation.insufficient-postmessage-origin-validation + window.addEventListener('message', async e => { + const event = e as MessageEvent; + const data = event.data; + const source = event.source as Window; + const origin = event.origin; + + console.log('Received: ' + JSON.stringify(event.data)); + if (data.type == 'WCP1Hello') { + const instance = await sc.getInstanceForWindow(source); + if (instance) { + if (getApproach() == Approach.IFRAME) { + const message: WebConnectionProtocol2LoadURL = { + type: 'WCP2LoadUrl', + meta: { + connectionAttemptUuid: data.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + iframeUrl: + window.location.origin + + `/static/da/embed.html?&desktopAgentId=${desktopAgentUUID}&instanceId=${instance.instanceId}&UI=${getUIKey()}`, + }, + }; + + source.postMessage(message, origin); + } else { + const channel = new MessageChannel(); + link(socket, channel, instance.instanceId); + socket.emit(APP_HELLO, desktopAgentUUID, instance.instanceId); + const ui = UI_URLS[getUIKey()]; + + // send the other end of the channel to the app + const message: WebConnectionProtocol3Handshake = { + type: 'WCP3Handshake', + meta: { + connectionAttemptUuid: data.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + fdc3Version: '2.2', + ...ui, + }, + }; + source.postMessage(message, origin, [channel.port1]); + } + } else { + let sourceName; + try { + sourceName = source.name; + } catch (e: unknown) { + sourceName = `{a cross-origin window: ${(e as Error).message ?? e}}`; + } + console.error(`Couldn't locate an instance for window: ${sourceName}`); + } + } + }); + }); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/da/embed.ts b/toolbox/fdc3-for-web/demo/src/client/da/embed.ts new file mode 100644 index 000000000..daa75bd4a --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/da/embed.ts @@ -0,0 +1,90 @@ +import { io } from 'socket.io-client'; +import { link, UI, UI_URLS } from './util'; +import { APP_HELLO } from '../../message-types'; +import { isWebConnectionProtocol1Hello } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +const appWindow = window.parent; + +function getQueryVariable(variable: string): string { + const query = window.location.search.substring(1); + const vars = query.split('&'); + for (let i = 0; i < vars.length; i++) { + const pair = vars[i].split('='); + if (pair[0] == variable) { + return pair[1]; + } + } + + return ''; +} + +function getSource(): string { + return getQueryVariable('instanceId'); +} + +function getDesktopAgentId(): string { + return getQueryVariable('desktopAgentId'); +} + +function getUIKey(): UI { + const ui = getQueryVariable('UI'); + return parseInt(ui) as UI; +} + +const helloListener = (e: MessageEvent) => { + const messageData = e.data; + const eventSource = e.source; + let eventSourceName; + try { + eventSourceName = (eventSource as Window)?.name; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (e: unknown) { + eventSourceName = `{a cross-origin window} `; + } + if (!eventSourceName) { + eventSourceName = '{no window name set} '; + } + + if (isWebConnectionProtocol1Hello(messageData)) { + console.debug( + 'Communication iframe adaptor received hello message from: ', + eventSourceName, + eventSource == appWindow ? '(parent window): ' : '(NOT parent win): ', + messageData + ); + + window.removeEventListener('message', helloListener); + + const socket = io(); + const channel = new MessageChannel(); + const source = getSource(); + const desktopAgentUUID = getDesktopAgentId(); + + socket.on('connect', () => { + link(socket, channel, source); + + socket.emit(APP_HELLO, desktopAgentUUID, source); + + const ui = UI_URLS[getUIKey()]; + + // send the other end of the channel to the app + appWindow.postMessage( + { + type: 'WCP3Handshake', + meta: { + connectionAttemptUuid: messageData.meta.connectionAttemptUuid, + timestamp: new Date(), + }, + payload: { + fdc3Version: '2.2', + ...ui, + }, + }, + '*', + [channel.port1] + ); + }); + } +}; + +window.addEventListener('message', helloListener); diff --git a/toolbox/fdc3-for-web/demo/src/client/da/util.ts b/toolbox/fdc3-for-web/demo/src/client/da/util.ts new file mode 100644 index 000000000..bf46aa087 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/da/util.ts @@ -0,0 +1,36 @@ +import { InstanceID } from '@finos/fdc3-web-impl'; +import { Socket } from 'socket.io-client'; +import { FDC3_APP_EVENT, FDC3_DA_EVENT } from '../../message-types'; + +export enum UI { + DEFAULT, + DEMO, + LOCAL, +} + +export const UI_URLS = { + [UI.DEMO]: { + intentResolverUrl: window.location.origin + '/static/da/intent-resolver.html', + channelSelectorUrl: window.location.origin + '/static/da/channel-selector.html', + }, + [UI.DEFAULT]: { + /* REPLACE THIS URL WITH true BEFORE RELEASE */ + intentResolverUrl: 'https://deploy-preview-1309--fdc3.netlify.app/toolbox/fdc3-reference-ui/intent_resolver.html', + channelSelectorUrl: 'https://deploy-preview-1309--fdc3.netlify.app/toolbox/fdc3-reference-ui/channel_selector.html', + }, + [UI.LOCAL]: { + intentResolverUrl: 'http://localhost:4002/intent_resolver.html', + channelSelectorUrl: 'http://localhost:4002/channel_selector.html', + }, +}; + +export function link(socket: Socket, channel: MessageChannel, source: InstanceID) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + socket.on(FDC3_DA_EVENT, (data: any) => { + channel.port2.postMessage(data); + }); + + channel.port2.onmessage = function (event) { + socket.emit(FDC3_APP_EVENT, event.data, source); + }; +} diff --git a/toolbox/fdc3-for-web/demo/src/client/ui/channel-selector.ts b/toolbox/fdc3-for-web/demo/src/client/ui/channel-selector.ts new file mode 100644 index 000000000..362a4b038 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/ui/channel-selector.ts @@ -0,0 +1,185 @@ +import { selectHighestContrast } from './contrast'; +import { dragElement } from './drag'; +import { + Channel, + Fdc3UserInterfaceChannelSelected, + Fdc3UserInterfaceHello, + Fdc3UserInterfaceRestyle, + isFdc3UserInterfaceChannels, + isFdc3UserInterfaceHandshake, + UpdatedCSS, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +let channels: Channel[] = []; +let channelId: string | null = null; + +export const DEFAULT_COLLAPSED_CSS: UpdatedCSS = { + width: '50px', + height: '50px', + position: 'fixed', + zIndex: '1000', +}; + +const DEFAULT_EXPANDED_CSS: UpdatedCSS = { + left: '0', + right: '0', + top: '0', + bottom: '0', + position: 'fixed', + zIndex: '1000', +}; + +export type Position = { + left: string; + top: string; + bottom: string; + right: string; +}; + +const position: Position = { + right: '10px', + bottom: '10px', + left: '', + top: '', +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const debug = (...params: any[]) => { + console.debug('Demo Channel Selector: ', ...params); +}; + +window.addEventListener('load', () => { + const parent = window.parent; + const logo = document.getElementById('logo')!; + const close = document.getElementById('close')!; + const drag = document.getElementById('drag')!; + const selector = document.getElementById('selector')!; + const list = document.getElementById('channel-list')!; + + const mc = new MessageChannel(); + const myPort = mc.port1; + myPort.start(); + + // ISSUE: 1302 + const helloMessage: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + initialCSS: { + ...DEFAULT_COLLAPSED_CSS, + ...position, + }, + implementationDetails: 'Demo Channel Selector v1.0', + }, + }; + parent.postMessage(helloMessage, '*', [mc.port2]); + debug('Sent hello message: ', helloMessage); + + function changeSize(expanded: boolean) { + document.body.setAttribute('data-expanded', 'none'); + if (expanded) { + const message: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: DEFAULT_EXPANDED_CSS }, + }; + myPort.postMessage(message); + debug('Setting expanded styles: ', message); + console.debug(); + selector.style.left = position.left; + selector.style.top = position.top; + selector.style.right = position.right; + selector.style.bottom = position.bottom; + setTimeout(() => { + document.body.setAttribute('data-expanded', 'selector'); + }, 20); + } else { + const message: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: { ...DEFAULT_COLLAPSED_CSS, ...position } }, + }; + debug('Setting collapsed styles: ', message); + myPort.postMessage(message); + setTimeout(() => { + document.body.setAttribute('data-expanded', 'logo'); + }, 20); + } + } + + myPort.addEventListener('message', e => { + if (isFdc3UserInterfaceHandshake(e.data)) { + // ok, port is ready, send the iframe position details + const message: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: { ...DEFAULT_COLLAPSED_CSS, ...position } }, + }; + myPort.postMessage(message); + debug('Received handshake, sending initial restyle: ', message); + } else if (isFdc3UserInterfaceChannels(e.data)) { + debug('Received channel details: ', e.data); + channels = e.data.payload.userChannels; + channelId = e.data.payload.selected; + + const selectedColor = + (channelId ? channels.find(c => c.id == channelId)?.displayMetadata?.color : null) ?? 'white'; + logo.style.backgroundColor = selectedColor; + } + }); + + close.addEventListener('click', () => { + changeSize(false); + }); + + logo.addEventListener('click', () => { + list.innerHTML = ''; + + //populate with channels + channels.forEach(channel => { + const li = document.createElement('div'); + const bgColor = channel.displayMetadata?.color ?? 'white'; + li.style.backgroundColor = bgColor; + li.style.color = selectHighestContrast(bgColor, 'white', 'black'); + const description = document.createElement('em'); + description.textContent = channel.id == channelId ? ' SELECTED ' : ''; + li.textContent = channel.displayMetadata?.name ?? channel.id; + + li.appendChild(description); + list.appendChild(li); + li.onclick = () => { + changeSize(false); + channelId = channel.id; + const message: Fdc3UserInterfaceChannelSelected = { + type: 'Fdc3UserInterfaceChannelSelected', + payload: { + selected: channel.id, + }, + }; + myPort.postMessage(message); + }; + }); + + //add an element for deselecting the channel + const li = document.createElement('div'); + li.style.backgroundColor = 'white'; + li.style.color = 'black'; + const description = document.createElement('em'); + description.textContent = channelId == null ? ' SELECTED ' : ''; + li.textContent = 'NONE'; + + li.appendChild(description); + list.appendChild(li); + li.onclick = () => { + changeSize(false); + channelId = null; + const message: Fdc3UserInterfaceChannelSelected = { + type: 'Fdc3UserInterfaceChannelSelected', + payload: { + selected: null, + }, + }; + myPort.postMessage(message); + }; + + changeSize(true); + }); + + dragElement(drag, selector, position); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/ui/contrast.ts b/toolbox/fdc3-for-web/demo/src/client/ui/contrast.ts new file mode 100644 index 000000000..b07f3cfe3 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/ui/contrast.ts @@ -0,0 +1,17 @@ +import Color from 'color'; + +export function selectHighestContrast(bgColorCSS: string, ...candidates: string[]) { + const bgColor = Color(bgColorCSS); + const contrasts: number[] = candidates.map(candidate => { + return bgColor.contrast(Color(candidate)); + }); + let bestCandidate = candidates[0], + highestContrast = contrasts[0]; + for (let i = 1; i < contrasts.length; i++) { + if (contrasts[i] > highestContrast) { + bestCandidate = candidates[i]; + highestContrast = contrasts[i]; + } + } + return bestCandidate; +} diff --git a/toolbox/fdc3-for-web/demo/src/client/ui/drag.ts b/toolbox/fdc3-for-web/demo/src/client/ui/drag.ts new file mode 100644 index 000000000..d551712b3 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/ui/drag.ts @@ -0,0 +1,56 @@ +import { Position } from './channel-selector'; + +export function dragElement(drag: HTMLElement, selector: HTMLElement, position: Position) { + let posXDrag = 0, + posYDrag = 0, + posXStart = 0, + posYStart = 0; + let top = 0, + left = 0, + screenX = 0, + screenY = 0; + + drag.onmousedown = dragMouseDown; + + globalThis.window.onresize = () => { + screenX = window.innerWidth; + screenY = window.innerHeight; + }; + + function updatePosition() { + position.left = left < screenX / 2 ? `${Math.max(left, 0)}px` : ''; + position.top = top < screenY / 2 ? `${Math.max(top, 0)}px` : ''; + position.right = left > screenX / 2 ? `${Math.max(screenX - left - selector.offsetWidth, 0)}px` : ''; + position.bottom = top > screenY / 2 ? `${Math.max(screenY - top - selector.offsetHeight, 0)}px` : ''; + } + + function dragMouseDown(e: MouseEvent) { + console.debug('Channel Selector - DragMouseDown starting'); + e.preventDefault(); + // get the mouse cursor position at startup: + posXStart = e.clientX; + posYStart = e.clientY; + document.onmousemove = elementDrag; + document.onmouseup = closeDragElement; + } + + function elementDrag(e: MouseEvent) { + e.preventDefault(); + // calculate the new cursor position: + posXDrag = posXStart - e.clientX; + posYDrag = posYStart - e.clientY; + posXStart = e.clientX; + posYStart = e.clientY; + // set the element's new position: + top = Math.max(selector.offsetTop - posYDrag, 0); + left = Math.max(selector.offsetLeft - posXDrag, 0); + selector.style.top = top + 'px'; + selector.style.left = left + 'px'; + updatePosition(); + } + + function closeDragElement() { + document.onmouseup = null; + document.onmousemove = null; + } +} diff --git a/toolbox/fdc3-for-web/demo/src/client/ui/intent-resolver.ts b/toolbox/fdc3-for-web/demo/src/client/ui/intent-resolver.ts new file mode 100644 index 000000000..b17316417 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/ui/intent-resolver.ts @@ -0,0 +1,131 @@ +import { + Fdc3UserInterfaceHello, + Fdc3UserInterfaceResolve, + Fdc3UserInterfaceResolveAction, + Fdc3UserInterfaceRestyle, + isFdc3UserInterfaceHandshake, + isFdc3UserInterfaceResolve, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AppIdentifier } from '@finos/fdc3-standard'; + +const DEFAULT_COLLAPSED_CSS = { + position: 'fixed', + display: 'none', + zIndex: '1000', + right: '0', + bottom: '0', + width: '0', + height: '0', +}; + +const DEFAULT_EXPANDED_CSS = { + position: 'fixed', + display: 'block', + zIndex: '1000', + left: '10%', + top: '10%', + right: '10%', + bottom: '10%', +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const debug = (...params: any[]) => { + console.debug('Demo Intent Resolver: ', ...params); +}; + +window.addEventListener('load', () => { + const parent = window.parent; + + const mc = new MessageChannel(); + const myPort = mc.port1; + myPort.start(); + + const list = document.getElementById('intent-list')!; + + // ISSUE: 1302 + const helloMessage: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + initialCSS: DEFAULT_COLLAPSED_CSS, + implementationDetails: 'Demo Intent Resolver v1.0', + }, + }; + parent.postMessage(helloMessage, '*', [mc.port2]); + debug('Sent hello message: ', helloMessage); + + function callback(intent: string | null, app: AppIdentifier | null) { + const restyleMessage: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: DEFAULT_COLLAPSED_CSS }, + }; + myPort.postMessage(restyleMessage); + debug('Setting collapsed styles: ', restyleMessage); + + if (intent && app) { + const message: Fdc3UserInterfaceResolveAction = { + type: 'Fdc3UserInterfaceResolveAction', + payload: { + action: 'click', + appIdentifier: app, + intent: intent, + }, + }; + myPort.postMessage(message); + debug('Sent resolution: ', message); + } else { + const message: Fdc3UserInterfaceResolveAction = { + type: 'Fdc3UserInterfaceResolveAction', + payload: { + action: 'cancel', + }, + }; + myPort.postMessage(message); + debug('Sent cancellation: ', message); + } + } + + myPort.addEventListener('message', e => { + if (isFdc3UserInterfaceHandshake(e.data)) { + const message: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: DEFAULT_COLLAPSED_CSS }, + }; + myPort.postMessage(message); + debug('Received handshake, sending initial restyle: ', message); + } else if (isFdc3UserInterfaceResolve(e.data)) { + const message: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { updatedCSS: DEFAULT_EXPANDED_CSS }, + }; + myPort.postMessage(message); + debug('Received request for resolution, setting expanded styles: ', message); + Array.from(list.children).forEach(i => i.remove()); + const details: Fdc3UserInterfaceResolve['payload'] = e.data.payload; + details.appIntents.forEach(intent => { + intent.apps.forEach(app => { + const li = document.createElement('li'); + const a = document.createElement('a'); + const description = document.createElement('em'); + + if (app.instanceId) { + description.textContent = `${intent.intent.displayName ?? ''} on app instance ${app.instanceId} of ${app.appId}`; + } else { + description.textContent = ` ${intent.intent.displayName ?? ''} on a new instance of ${app.appId}`; + } + + a.textContent = intent.intent.name; + + li.appendChild(a); + li.appendChild(description); + list.appendChild(li); + a.setAttribute('href', '#'); + a.onclick = () => callback(intent.intent.name, app); + }); + }); + } + }); + + document.getElementById('cancel')!.addEventListener('click', () => { + callback(null, null); + }); +}); diff --git a/toolbox/fdc3-for-web/demo/src/client/vite-env.d.ts b/toolbox/fdc3-for-web/demo/src/client/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/client/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/toolbox/fdc3-for-web/demo/src/message-types.ts b/toolbox/fdc3-for-web/demo/src/message-types.ts new file mode 100644 index 000000000..d6d08f96a --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/message-types.ts @@ -0,0 +1,5 @@ +export const DA_HELLO = 'da-hello'; +export const APP_HELLO = 'app-hello'; +export const APP_GOODBYE = 'app-goodbye'; +export const FDC3_APP_EVENT = 'fdc3-app-event'; +export const FDC3_DA_EVENT = 'fdc3-da-event'; diff --git a/toolbox/fdc3-for-web/demo/src/server/main.ts b/toolbox/fdc3-for-web/demo/src/server/main.ts new file mode 100644 index 000000000..6aba8031d --- /dev/null +++ b/toolbox/fdc3-for-web/demo/src/server/main.ts @@ -0,0 +1,104 @@ +import express from 'express'; +import ViteExpress from 'vite-express'; +import { Server, Socket } from 'socket.io'; +import { APP_GOODBYE, APP_HELLO, DA_HELLO, FDC3_APP_EVENT, FDC3_DA_EVENT } from '../message-types'; + +const app = express(); + +app.get('/iframe', (_, res) => { + res.send('Hello Vite + TypeScript!'); +}); + +const httpServer = ViteExpress.listen(app, 4000, () => + console.log('Server is listening on port 4000. Head to http://localhost:4000/static/da/index.html') +); + +const io = new Server(httpServer); + +type ConnectedWorld = { + server: Socket; + apps: Map; +}; + +enum ConnectionType { + APP, + DA, +} + +const instances: Map = new Map(); + +io.on('connection', (socket: Socket) => { + let myInstance: ConnectedWorld | undefined; + let myId: string | undefined; + let connectionType: ConnectionType | undefined; + + socket.on(DA_HELLO, function (id) { + myId = id; + const instance: ConnectedWorld = instances.get(id) ?? { + server: socket, + apps: new Map(), + }; + + instance.server = socket; + instances.set(id, instance); + connectionType = ConnectionType.DA; + console.log('instances ' + instances.size); + myInstance = instance; + console.log('Desktop Agent connected: ' + id); + }); + + socket.on(APP_HELLO, function (id: string, appId: string) { + const instance = instances.get(id); + + if (instance != undefined) { + console.log(`An app connected to DA ${id} with id ${appId}`); + instance.apps.set(appId, socket); + myInstance = instance; + connectionType = ConnectionType.APP; + myId = appId; + } else { + console.log('App Tried Connecting to non-existent DA Instance ' + id + ' ' + myId); + } + }); + + socket.on(FDC3_APP_EVENT, function (data, from): void { + // message from app to da + + if (myInstance == null && data.type == 'intentResolutionChoice') { + // message from app's intent resolver + myInstance = Array.from(instances.values()).find(cw => cw.apps.get(from)); + } + + if (myInstance == null && data.type == 'channelSelectionChoice') { + // message from app's channelSelector + myInstance = Array.from(instances.values()).find(cw => cw.apps.get(from)); + } + + if (myInstance != undefined) { + myInstance.server.emit(FDC3_APP_EVENT, data, from); + } + }); + + socket.on(FDC3_DA_EVENT, function (data, to): void { + // send message to app + const destSocket = myInstance?.apps.get(to); + if (destSocket) { + destSocket.emit(FDC3_DA_EVENT, data, to); + } else { + console.log('Failed to send message to app ' + to); + } + }); + + socket.on('disconnect', function (): void { + if (myInstance) { + if (connectionType == ConnectionType.DA) { + console.log('DA disconnected: ' + myId); + instances.delete(myId!); + } else { + myInstance.apps.delete(myId!); + console.log(`App Disconnected: ${myId} ( ${myInstance.apps.size} remaining )`); + myInstance.server.emit(APP_GOODBYE, myId!); + } + } + }); +}); diff --git a/toolbox/fdc3-for-web/demo/static/app1/index.html b/toolbox/fdc3-for-web/demo/static/app1/index.html new file mode 100644 index 000000000..2da728d63 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app1/index.html @@ -0,0 +1,14 @@ + + + + App 1 + + + + + +

FDC3 For the Web App1

+ + + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app2/index.html b/toolbox/fdc3-for-web/demo/static/app2/index.html new file mode 100644 index 000000000..b0b625690 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app2/index.html @@ -0,0 +1,14 @@ + + + + App 2 + + + + + +

FDC3 For the Web App2

+
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app3/index.html b/toolbox/fdc3-for-web/demo/static/app3/index.html new file mode 100644 index 000000000..940226e05 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app3/index.html @@ -0,0 +1,15 @@ + + + + App 3 + + + + + +

FDC3 For the Web App3

+ +
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app4/index.html b/toolbox/fdc3-for-web/demo/static/app4/index.html new file mode 100644 index 000000000..fba1d2d2c --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app4/index.html @@ -0,0 +1,15 @@ + + + + App 4 + + + + + +

FDC3 For the Web App4

+

Listens for the ViewNews intent...

+
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app5/index.html b/toolbox/fdc3-for-web/demo/static/app5/index.html new file mode 100644 index 000000000..1e174205a --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app5/index.html @@ -0,0 +1,15 @@ + + + + App 5 + + + + + +

FDC3 For the Web App5

+

Listens for the ViewNews + ViewQuote intents

+
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app6/index.html b/toolbox/fdc3-for-web/demo/static/app6/index.html new file mode 100644 index 000000000..52faa4325 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app6/index.html @@ -0,0 +1,15 @@ + + + + App 6 + + + + + +

FDC3 For the Web App6

+

Asks for an intent result

+
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/app7/index.html b/toolbox/fdc3-for-web/demo/static/app7/index.html new file mode 100644 index 000000000..a50a907b1 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/app7/index.html @@ -0,0 +1,15 @@ + + + + App 7 + + + + + +

FDC3 For the Web App7

+

Asks for an intent result, involves intent resolver

+
+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/da/appd.json b/toolbox/fdc3-for-web/demo/static/da/appd.json new file mode 100644 index 000000000..1178bf7d9 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/appd.json @@ -0,0 +1,147 @@ +{ + "applications": [ + { + "appId": "app1", + "name": "App One", + "title": "Broadcaster", + "description": "App will connect to the desktop agent and broadcast on the red channel when you hit the button", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app1/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + }, + { + "appId": "app2", + "name": "App Two", + "title": "Receiver", + "description": "App will connect to the desktop agent on startup and listen to messages on the red channel", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app2/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + }, + { + "appId": "app3", + "name": "App Three", + "title": "Receiver & Broadcaster", + "description": "App creates two APIs to the desktop agent, broadcasts in one and listens in the other.", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app3/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + }, + { + "appId": "workbench", + "name": "FDC3 Workbench", + "title": "FDC3 Workbench", + "description": "Part of the WebFDC3 Demo - Port of the FDC3 Workbench. Must be started separately on localhost:4001", + "type": "web", + "details": { + "url": "http://localhost:4001/toolbox/fdc3-workbench/" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + }, + { + "appId": "app4", + "name": "App Four", + "title": "View News Intent Listener", + "description": "Listens for the ViewNews intent only", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app4/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [], + "interop": { + "intents": { + "listensFor": { + "ViewNews": { + "displayName": "View News", + "contexts": [ + "fdc3.instrument" + ] + } + } + } + } + }, + { + "appId": "app5", + "name": "App Five", + "title": "View News + View Quote Intent Listener", + "description": "Listens for the ViewNews intent only", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app5/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [], + "interop": { + "intents": { + "listensFor": { + "ViewNews": { + "displayName": "View News", + "contexts": [ + "fdc3.instrument" + ] + }, + "ViewQuote": { + "displayName": "View Quote", + "contexts": [ + "fdc3.instrument" + ] + } + } + } + } + }, + { + "appId": "app6", + "name": "App Six", + "title": "Intent Result", + "description": "App asks for the result of a ViewQuote intent", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app6/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + }, + { + "appId": "app7", + "name": "App Seven", + "title": "Intent Result 2", + "description": "App asks for the result of a ViewNews intent", + "type": "web", + "details": { + "url": "http://localhost:4000/static/app7/index.html" + }, + "hostManifests": {}, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [] + } + ], + "message": "OK" +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/da/channel-selector.html b/toolbox/fdc3-for-web/demo/static/da/channel-selector.html new file mode 100644 index 000000000..ff9b0c75f --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/channel-selector.html @@ -0,0 +1,115 @@ + + + Desktop Agent Intent Resolver + + + + + + + + +
+
+ +
+
+

Channel Selector

+ Drag + Drag +
+
+
blib
+
blib
+
blib
+
blib
+
+
+ + + diff --git a/toolbox/fdc3-for-web/demo/static/da/channel.svg b/toolbox/fdc3-for-web/demo/static/da/channel.svg new file mode 100644 index 000000000..7fe283d4b --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/channel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/toolbox/fdc3-for-web/demo/static/da/close.svg b/toolbox/fdc3-for-web/demo/static/da/close.svg new file mode 100644 index 000000000..db7ac2802 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/close.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/toolbox/fdc3-for-web/demo/static/da/corner.png b/toolbox/fdc3-for-web/demo/static/da/corner.png new file mode 100644 index 000000000..42800245d Binary files /dev/null and b/toolbox/fdc3-for-web/demo/static/da/corner.png differ diff --git a/toolbox/fdc3-for-web/demo/static/da/drag.svg b/toolbox/fdc3-for-web/demo/static/da/drag.svg new file mode 100644 index 000000000..d3ae3e10c --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/drag.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/toolbox/fdc3-for-web/demo/static/da/embed.html b/toolbox/fdc3-for-web/demo/static/da/embed.html new file mode 100644 index 000000000..47b6c0893 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/embed.html @@ -0,0 +1,13 @@ + + + + Desktop Agent + + + + + +

Embedded iframe - never seen!

+ + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/da/index.html b/toolbox/fdc3-for-web/demo/static/da/index.html new file mode 100644 index 000000000..e10667411 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/index.html @@ -0,0 +1,67 @@ + + + + Desktop Agent + + + + + + +

Demo Desktop Agent

+ + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/da/intent-resolver.html b/toolbox/fdc3-for-web/demo/static/da/intent-resolver.html new file mode 100644 index 000000000..49cb0abcb --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/intent-resolver.html @@ -0,0 +1,13 @@ + + + Desktop Agent Intent Resolver + + + + + +

Intent Resolution

+
    + + + diff --git a/toolbox/fdc3-for-web/demo/static/da/local-conformance-2_0.v2.json b/toolbox/fdc3-for-web/demo/static/da/local-conformance-2_0.v2.json new file mode 100644 index 000000000..4d4105b5b --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/da/local-conformance-2_0.v2.json @@ -0,0 +1,847 @@ +{ + "applications": [ + { + "appId": "Conformance1", + "name": "Conformance1", + "title": "FDC3 2.0 Conformance Framework", + "description": "FDC3 2.0 Conformance testing framework - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/app/index.html" + }, + "screenshots": [{ + "src": "https://directory.fdc3.finos.org/assets/app/Conformance1.png" + }], + "hostManifests": { + "sail": { + "inject-api": "2.0" + }, + "Finsemble": { + "window": { + "top": "center", + "left": "0", + "width": 800, + "height": 900 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": true + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + }, + "interop": { + "joinMultipleChannels": false + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "ConformanceListener": { + "contexts": ["fdc3.nothing"] + } + } + } + } + }, + { + "appId": "ChannelsAppId", + "name": "ChannelsApp", + "title": "Channels App", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/channels" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + }, + "interop": { + "joinMultipleChannels": false + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }] + }, + { + "appId": "IntentAppAId", + "name": "IntentAppA", + "title": "Intent App A", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-a" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "aTestingIntent": { + "displayName": "A Testing Intent", + "contexts": ["testContextX", "testContextZ"] + }, + "sharedTestingIntent1": { + "displayName": "Shared Testing Intent 1", + "contexts": ["testContextX"] + } + } + } + } + }, + { + "appId": "IntentAppBId", + "name": "IntentAppB", + "title": "Intent App B", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-b" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent1": { + "displayName": "Shared Testing Intent 1", + "contexts": ["testContextX", "testContextY"], + "resultType": "testContextY" + } + } + } + } + }, + { + "appId": "IntentAppCId", + "name": "IntentAppC", + "title": "Intent App C", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-c" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "cTestingIntent": { + "displayName": "C Testing Intent", + "contexts": ["testContextX"], + "resultType": "testContextZ" + } + } + } + } + }, + { + "appId": "IntentAppDId", + "name": "IntentAppD", + "title": "Intent App D", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-d" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextX"], + "resultType": "testContextZ" + } + } + } + } + }, + { + "appId": "IntentAppEId", + "name": "IntentAppE", + "title": "Intent App E", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-e" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextY"], + "resultType": "channel" + } + } + } + } + }, + { + "appId": "IntentAppFId", + "name": "IntentAppF", + "title": "Intent App F", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-f" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextY"], + "resultType": "channel" + } + } + } + } + }, + { + "appId": "IntentAppGId", + "name": "IntentAppG", + "title": "Intent App G", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-g" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextY"] + } + } + } + } + }, + { + "appId": "IntentAppHId", + "name": "IntentAppH", + "title": "Intent App H", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-h" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextY"], + "resultType": "testContextZ" + } + } + } + } + }, + { + "appId": "IntentAppIId", + "name": "IntentAppI", + "title": "Intent App I", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-i" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "sharedTestingIntent2": { + "displayName": "Shared Testing Intent 2", + "contexts": ["testContextY"], + "resultType": "testContextZ" + } + } + } + } + }, + { + "appId": "IntentAppJId", + "name": "IntentAppJ", + "title": "Intent App J", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-j" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "privateChannelIsPrivate": { + "displayName": "J Testing Intent", + "contexts": ["privateChannelDetails"], + "resultType": "privateChannelIsPrivateResult" + } + } + } + } + }, + { + "appId": "IntentAppKId", + "name": "IntentAppK", + "title": "Intent App K", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/intent-k" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "interop": { + "intents": { + "listensFor": { + "kTestingIntent": { + "displayName": "K Testing Intent", + "contexts": ["testContextX"], + "resultType": "channel" + } + } + } + } + }, + { + "appId": "OpenAppAId", + "name": "OpenAppA", + "title": "Open App A", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/open-a" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }] + }, + { + "appId": "OpenAppBId", + "name": "OpenAppB", + "title": "Open App B", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "type": "web", + "details": { + "url": "http://localhost:3001/v2.0/open-b" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }] + }, + { + "appId": "MockAppId", + "name": "MockApp", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "details": { + "url": "http://localhost:3001/v2.0/general" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + }, + "interop": { + "joinMultipleChannels": false + } + } + }, + "version": "1.0.0", + "publisher": "FINOS", + "type": "web", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }] + }, + { + "appId": "MetadataAppId", + "name": "MetadataApp", + "title": "App Title", + "description": "Part of the FDC3 2.0 Conformance Tests - developed for FINOS by Scott Logic", + "details": { + "url": "http://localhost:3001/v2.0/metadata" + }, + "hostManifests": { + "sail": { + "inject-api": "2.0", + "searchable": false, + "forceNewWindow": true + }, + "Finsemble": { + "window": { + "top": "center", + "right": 0, + "width": 600, + "height": 400 + }, + "foreign": { + "components": { + "App Launcher": { + "launchableByUser": false + }, + "Window Manager": { + "FSBLHeader": true, + "titlebarType": "injected" + } + } + }, + "interop": { + "intents": { + "listensFor": { + } + } + } + } + }, + "version": "1.0.0", + "tooltip": "placeholder", + "publisher": "FINOS", + "type": "web", + "icons": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }], + "screenshots": [{ + "src": "http://localhost:3001/finos-icon-256.png" + }] + } + ], + "message": "OK" +} diff --git a/toolbox/fdc3-for-web/demo/static/dnd/index.html b/toolbox/fdc3-for-web/demo/static/dnd/index.html new file mode 100644 index 000000000..e50aea8c5 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/dnd/index.html @@ -0,0 +1,32 @@ + + + Drag and Drop Demo + + + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    + +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    + + + + + + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/dnd/movable.html b/toolbox/fdc3-for-web/demo/static/dnd/movable.html new file mode 100644 index 000000000..8e3de96b8 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/dnd/movable.html @@ -0,0 +1,116 @@ + + + + + + + +
    + + +
    + +
    +Drag Me + +
    + + + + + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/static/embed/index.html b/toolbox/fdc3-for-web/demo/static/embed/index.html new file mode 100644 index 000000000..cd43e7623 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/static/embed/index.html @@ -0,0 +1,16 @@ + + + + Desktop Agent - Embedded Communications Agent + + + + + +

    + Nothing to see here +

    + + + + \ No newline at end of file diff --git a/toolbox/fdc3-for-web/demo/tsconfig.json b/toolbox/fdc3-for-web/demo/tsconfig.json new file mode 100644 index 000000000..82975fe97 --- /dev/null +++ b/toolbox/fdc3-for-web/demo/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "NodeNext", + "lib": [ + "ESNext", + "DOM" + ], + "moduleResolution": "NodeNext", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../../../packages/fdc3-standard" + }, + { + "path": "../../../packages/fdc3-get-agent" + }, + { + "path": "../fdc3-web-impl" + } + ] +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/README.md b/toolbox/fdc3-for-web/fdc3-web-impl/README.md new file mode 100644 index 000000000..0e4fda834 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/README.md @@ -0,0 +1,17 @@ +# FDC3 Web Implementation + +This repository contains a [FDC3 2.0 Conformant](../../fdc3-conformance/README.md), headless implementation of the FDC3 DACP protocol. + +This package forms the basis of the implementation of the FDC3 Desktop Agent reference implementation, found in [the demo module](../demo/README.md) as well as the web-version of [FDC3-Sail](https://github.com/finos/FDC3-Sail/). + +It is expected that Desktop Agent implementations can either use this package as the basis for their own FDC3 implementation, use the tests provided here to test their implementation or rake inspiration from the codebase to implement their own FDC3 Desktop Agent from scratch. + +## How This Works + +There are three main types of component here: + +- **MessageHandlers**: These are the core of the FDC3 implementation. They are responsible for handling incoming messages from apps and responding to them correctly. There are four defined, breaking up the functionality of FDC3: `BroadcastHandler` (handing channels and broadcasting), `IntentHandler` (handling intents, intent resolution etc.), `OpenHandler` (handling app launches) and `HeartbeatHandler` (handling app liveness and disconnection). + + - **FDC3Server**: This is the main entry point for the FDC3 implementation. It is responsible for setting up the message handlers and starting the server, implemented by `BasicFDC3Server` and `DefaultFDC3Server` classes. + + - **ServerContext**: This interface is responsible for maintaining the state of the server. `ServerContext` really determines how FDC3 is run: how messages are sent, how apps are launched, how intents are resolved etc. It is the main point of customization for an FDC3 implementation. If you are implementing an FDC3 Desktop Agent, you will need to implement this class yourself. See the [Demo](../demo/README.md), which implements this in-browser as `DemoServerContext`. \ No newline at end of file diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/cucumber.yml b/toolbox/fdc3-for-web/fdc3-web-impl/cucumber.yml new file mode 100644 index 000000000..2572a0c7b --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/cucumber.yml @@ -0,0 +1,15 @@ +default: + format: + - html:cucumber-report.html + - "@cucumber/pretty-formatter" + - junit:test-results.xml + paths: + - test/features/*.feature + require: + - test/step-definitions/*.steps.ts + - test/support/*.ts + - test/world/index.ts + requireModule: + - ts-node/register + tags: "not @failing" + diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/eslint.config.mjs b/toolbox/fdc3-for-web/fdc3-web-impl/eslint.config.mjs new file mode 100644 index 000000000..c7018a2c8 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, +]; diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/package.json b/toolbox/fdc3-for-web/fdc3-web-impl/package.json new file mode 100644 index 000000000..27e104058 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/package.json @@ -0,0 +1,61 @@ +{ + "name": "@finos/fdc3-web-impl", + "version": "2.2.0-alpha.3", + "author": "Fintech Open Source Foundation (FINOS)", + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, + "publishConfig": { + "tag": "latest" + }, + "license": "Apache-2.0", + "files": [ + "dist" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "scripts": { + "clean": "rimraf dist cucumber-report.html coverage .nyc_output node_modules test-results.xml generated", + "directory-openapi": "npx openapi-typescript ../../../packages/fdc3-standard/src/app-directory/specification/appd.schema.json --output generated/directory-schema.ts", + "test": "npm run directory-openapi && tsc && nyc --reporter=lcov --reporter=text --reporter json cucumber-js", + "build": "npm run directory-openapi && tsc --module es2022", + "lint": "eslint src/" + }, + "dependencies": { + "@finos/fdc3-standard": "2.2.0-alpha.3", + "@types/uuid": "^10.0.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@cucumber/cucumber": "10.3.1", + "@cucumber/html-formatter": "11.0.4", + "@cucumber/pretty-formatter": "1.0.1", + "@eslint/js": "^9.16.0", + "@finos/testing": "2.2.0-alpha.3", + "@types/expect": "24.3.0", + "@types/lodash": "4.14.167", + "@types/node": "^20.16.11", + "@types/uuid": "^10.0.0", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "cucumber-console-formatter": "1.0.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "3.3.1", + "expect": "^29.7.0", + "globals": "^15.13.0", + "is-ci": "2.0.0", + "jsonpath-plus": "^10.1.0", + "nyc": "17.1.0", + "openapi-typescript": "^6.7.6", + "prettier": "3.4.1", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "uuid": "^9.0.1" + } +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/BasicFDC3Server.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/BasicFDC3Server.ts new file mode 100644 index 000000000..d5cefd69f --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/BasicFDC3Server.ts @@ -0,0 +1,85 @@ +import { FDC3Server } from './FDC3Server'; +import { AppRegistration, InstanceID, ServerContext, State } from './ServerContext'; +import { BroadcastHandler, ChannelState } from './handlers/BroadcastHandler'; +import { IntentHandler } from './handlers/IntentHandler'; +import { Directory } from './directory/DirectoryInterface'; +import { OpenHandler } from './handlers/OpenHandler'; +import { HeartbeatHandler } from './handlers/HeartbeatHandler'; +import { + AppRequestMessage, + WebConnectionProtocol4ValidateAppIdentity, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +export interface MessageHandler { + /** + * Handles an AgentRequestMessage from the messaging source. This function + * is called by BasicFDC3Server on every message received and should only + * process those it supports. + */ + accept( + msg: AppRequestMessage | WebConnectionProtocol4ValidateAppIdentity | WebConnectionProtocol6Goodbye, + sc: ServerContext, + from: InstanceID + ): Promise; + + /** + * Clean-up any state relating to a instance that has disconnected. + */ + cleanup(instanceId: InstanceID, sc: ServerContext): void; + + shutdown(): void; +} + +/** + * This defers all functionality to either MessageHandler's or the ServerContext objects. + */ +export class BasicFDC3Server implements FDC3Server { + readonly handlers: MessageHandler[]; + private sc: ServerContext; + + constructor(handlers: MessageHandler[], sc: ServerContext) { + this.handlers = handlers; + this.sc = sc; + } + + cleanup(instanceId: InstanceID): void { + this.handlers.forEach(handler => handler.cleanup(instanceId, this.sc)); + this.sc.setAppState(instanceId, State.Terminated); + } + + async receive( + message: AppRequestMessage | WebConnectionProtocol4ValidateAppIdentity | WebConnectionProtocol6Goodbye, + from: InstanceID + ): Promise { + const promises = this.handlers.map(h => h.accept(message, this.sc, from)); + await Promise.allSettled(promises); + } + + shutdown(): void { + this.handlers.forEach(h => h.shutdown()); + } +} + +export class DefaultFDC3Server extends BasicFDC3Server { + constructor( + sc: ServerContext, + directory: Directory, + userChannels: ChannelState[], + heartbeats: boolean, + intentTimeoutMs: number = 20000, + openHandlerTimeoutMs: number = 10000 + ) { + const handlers: MessageHandler[] = [ + new BroadcastHandler(userChannels), + new IntentHandler(directory, intentTimeoutMs), + new OpenHandler(directory, openHandlerTimeoutMs), + ]; + + if (heartbeats) { + handlers.push(new HeartbeatHandler(openHandlerTimeoutMs / 10, openHandlerTimeoutMs / 2, openHandlerTimeoutMs)); + } + + super(handlers, sc); + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/FDC3Server.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/FDC3Server.ts new file mode 100644 index 000000000..1f4f8c6af --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/FDC3Server.ts @@ -0,0 +1,16 @@ +import { InstanceID } from './ServerContext'; +import { BrowserTypes } from '@finos/fdc3-schema'; + +type AppRequestMessage = BrowserTypes.AppRequestMessage; + +export interface FDC3Server { + /** + * Receive an incoming message + */ + receive(message: AppRequestMessage, from: InstanceID): Promise; + + /** + * Cleanup state relating to an instance that has disconnected + */ + cleanup(instanceId: InstanceID): void; +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/ServerContext.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/ServerContext.ts new file mode 100644 index 000000000..f59cec41f --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/ServerContext.ts @@ -0,0 +1,113 @@ +import { AppIdentifier, AppIntent } from '@finos/fdc3-standard'; +import { Context } from '@finos/fdc3-context'; +import { FDC3Server } from './FDC3Server'; + +export enum State { + Pending /* App has started, but not completed FDC3 Handshake */, + Connected /* App has completed FDC3 handshake */, + NotResponding /* App has not responded to a heartbeat */, + Terminated /* App has sent a termination message */, +} + +export type AppRegistration = { + state: State; + appId: string; + instanceId: InstanceID; +}; + +/** + * This is a unique, long, unguessable string that identifies a particular instance of an app. + * All messages arriving at the desktop agent will have this UUID attached to them. + * It is important that this is unguessable as it is a shared secret used to identify the app + * when reconnecting after navigation or refresh. + */ +export type InstanceID = string; + +/** + * Handles messaging to apps and opening apps + */ +export interface ServerContext { + /** + * UUID for outgoing message + */ + createUUID(): string; + + /** + * Post an outgoing message to a particular app + */ + post(message: object, instanceId: InstanceID): Promise; + + /** + * Opens a new instance of an application. + * Promise completes once the application window is opened + */ + open(appId: string): Promise; + + /** Set the FDC3Server instance associated with this context. This reference is + * used to notify the server to cleanup state for apps that have been terminated. + * The FDC3Server is passed a ServerContext when created and should call this fn + * in its constructor. + */ + setFDC3Server(server: FDC3Server): void; + + /** + * Registers a particular instance id with a given app id + */ + setInstanceDetails(uuid: InstanceID, details: X): void; + + /** + * Returns the connection details for a particular instance of an app. + * Used in a variety of MessageHandler classes to retrieve details for + * an app and when validating an app's identity when connecting. + */ + getInstanceDetails(uuid: InstanceID): X | undefined; + + /** + * Registers an app as connected to the desktop agent. + */ + setAppState(app: InstanceID, state: State): Promise; + + /** + * Returns the list of apps open and connected to FDC3 at the current time. + * Note, it is the implementor's job to ensure this list is + * up-to-date in the event of app crashes or disconnections. + */ + getConnectedApps(): Promise; + + /** + * Return the list of all apps that have ever been registered with the ServerContext. + */ + getAllApps(): Promise; + + /** + * Helper function for determining if an app is currently open and connected to the da + */ + isAppConnected(app: InstanceID): Promise; + + /** + * Allows you to write a log message somewhere + */ + log(message: string): void; + + /** + * Name of the provider of this desktop agent server + */ + provider(): string; + + /** + * Version of the provider of this desktop agent server + */ + providerVersion(): string; + + /** + * Supported version of the FDC3 API of the desktop agent server. + */ + fdc3Version(): string; + + /** + * This is called prior to returning intents to the client. It is a + * an opportunity for the server to either present an intent resolver + * or otherwise mess with the available intents, or do nothing. + */ + narrowIntents(raiser: AppIdentifier, IappIntents: AppIntent[], context: Context): Promise; +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/BasicDirectory.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/BasicDirectory.ts new file mode 100644 index 000000000..fc007ff39 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/BasicDirectory.ts @@ -0,0 +1,90 @@ +import { Directory, DirectoryApp, DirectoryIntent } from './DirectoryInterface'; + +export function genericResultTypeSame(real: string | undefined, required: string | undefined) { + if (required == undefined) { + return true; + } else if (real == required) { + return true; + } else if (real == undefined) { + return false; // required is not undefined, so asking for something + } else if (real.startsWith('channel<') && required == 'channel') { + return true; + } else { + return false; + } +} + +/** + * Basic directory implementation that allows queries over a set of apps. + */ +export class BasicDirectory implements Directory { + allApps: DirectoryApp[]; + + constructor(apps: DirectoryApp[]) { + this.allApps = apps; + } + + private intentMatches( + i: DirectoryIntent, + contextType: string | undefined, + intentName: string | undefined, + resultType: string | undefined + ): boolean { + const out = + (intentName == undefined || i.intentName == intentName) && + (contextType == undefined || (i.contexts ?? []).includes(contextType)) && + genericResultTypeSame(i.resultType, resultType); + return out; + } + + private retrieveIntentsForApp(a: DirectoryApp): DirectoryIntent[] { + const lf = a.interop?.intents?.listensFor ?? {}; + const lfa = Object.entries(lf); + const lfAugmented = lfa.map(([key, value]) => { + return { + intentName: key, + ...value, + appId: a.appId, + }; + }); + return lfAugmented; + } + + retrieveAllIntents(): DirectoryIntent[] { + const allIntents = this.retrieveAllApps().flatMap(a => this.retrieveIntentsForApp(a)); + + return allIntents; + } + + retrieveIntents( + contextType: string | undefined, + intentName: string | undefined, + resultType: string | undefined + ): DirectoryIntent[] { + const matchingIntents = this.retrieveAllIntents().filter(i => + this.intentMatches(i, contextType, intentName, resultType) + ); + return matchingIntents; + } + + retrieveApps( + contextType: string | undefined, + intentName?: string | undefined, + resultType?: string | undefined + ): DirectoryApp[] { + const result = this.retrieveAllApps().filter( + a => + this.retrieveIntentsForApp(a).filter(i => this.intentMatches(i, contextType, intentName, resultType)).length > 0 + ); + + return result; + } + + retrieveAppsById(appId: string): DirectoryApp[] { + return this.retrieveAllApps().filter(a => a.appId == appId); + } + + retrieveAllApps(): DirectoryApp[] { + return this.allApps; + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/DirectoryInterface.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/DirectoryInterface.ts new file mode 100644 index 000000000..29778f6d2 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/directory/DirectoryInterface.ts @@ -0,0 +1,32 @@ +import { components } from '../../generated/directory-schema'; + +type schemas = components['schemas']; + +export type DirectoryIntent = schemas['Intent'] & { intentName: string; appId: string }; +export type DirectoryApp = schemas['Application']; +export type WebAppDetails = schemas['WebAppDetails']; + +/** + * This interface wraps the functionality of the FDC3 Directory structure (stored in JSON), + * providing lookup calls to functions that would be handled by inspecting the directory/directories JSON definitions. + */ + +export interface Directory { + retrieveAllApps(): DirectoryApp[]; + + retrieveApps( + contextType: string | undefined, + intentName: string | undefined, + resultType: string | undefined + ): DirectoryApp[]; + + retrieveAllIntents(): DirectoryIntent[]; + + retrieveIntents( + contextType: string | undefined, + intentName?: string | undefined, + resultType?: string + ): DirectoryIntent[]; + + retrieveAppsById(appId: string): DirectoryApp[]; +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/BroadcastHandler.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/BroadcastHandler.ts new file mode 100644 index 000000000..663bfb270 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/BroadcastHandler.ts @@ -0,0 +1,549 @@ +import { MessageHandler } from '../BasicFDC3Server'; +import { AppRegistration, InstanceID, ServerContext } from '../ServerContext'; +import { Context } from '@finos/fdc3-context'; +import { AppIdentifier, ChannelError, DisplayMetadata, PrivateChannelEventTypes } from '@finos/fdc3-standard'; +import { successResponse, errorResponse, FullAppIdentifier, onlyUnique } from './support'; +import { + AddContextListenerRequest, + AgentResponseMessage, + AppRequestMessage, + BroadcastRequest, + ContextListenerUnsubscribeRequest, + CreatePrivateChannelRequest, + GetCurrentChannelRequest, + GetCurrentContextRequest, + GetOrCreateChannelRequest, + GetUserChannelsRequest, + JoinUserChannelRequest, + LeaveCurrentChannelRequest, + PrivateChannelAddEventListenerRequest, + PrivateChannelDisconnectRequest, + PrivateChannelOnAddContextListenerEvent, + PrivateChannelOnDisconnectEvent, + PrivateChannelOnUnsubscribeEvent, + PrivateChannelUnsubscribeEventListenerRequest, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type PrivateChannelEvents = + | PrivateChannelOnAddContextListenerEvent + | PrivateChannelOnUnsubscribeEvent + | PrivateChannelOnDisconnectEvent; + +type ContextListenerRegistration = { + appId: string; + instanceId: string; + listenerUuid: string; + channelId: string | null; + contextType: string | null; + userChannelListener: boolean; +}; + +type PrivateChannelEventListener = { + appId: string; + instanceId: string; + channelId: string; + eventType: PrivateChannelEventTypes | null; + listenerUuid: string; +}; + +export enum ChannelType { + 'user', + 'app', + 'private', +} + +export type ChannelState = { + id: string; + type: ChannelType; + context: Context[]; + displayMetadata: DisplayMetadata; +}; + +export class BroadcastHandler implements MessageHandler { + private contextListeners: ContextListenerRegistration[] = []; + private eventListeners: PrivateChannelEventListener[] = []; + private readonly state: ChannelState[] = []; + private readonly currentChannel: { [instanceId: string]: ChannelState } = {}; + + constructor(initialChannelState: ChannelState[]) { + this.state = initialChannelState; + } + + shutdown(): void {} + + cleanup(instanceId: InstanceID, sc: ServerContext): void { + const toUnsubscribe = this.contextListeners.filter(r => r.instanceId == instanceId); + + //handle privateChannel disconnects + const privateChannelsToUnsubscribe = toUnsubscribe.filter( + u => this.state.find(chan => chan.id == u.channelId)?.type == ChannelType.private + ); + + const privateChannelsToDisconnect = new Set(); + privateChannelsToUnsubscribe.forEach(u => { + this.invokePrivateChannelEventListeners( + u.channelId, + 'unsubscribe', + 'privateChannelOnUnsubscribeEvent', + sc, + u.contextType ?? undefined + ); + if (u.channelId) { + privateChannelsToDisconnect.add(u.channelId); + } + }); + + privateChannelsToDisconnect.forEach(chan => { + this.invokePrivateChannelEventListeners(chan, 'disconnect', 'privateChannelOnDisconnectEvent', sc); + }); + + //clean up state entries + this.contextListeners = this.contextListeners.filter(listener => listener.instanceId !== instanceId); + this.eventListeners = this.eventListeners.filter(listener => listener.instanceId !== instanceId); + } + + getCurrentChannel(from: FullAppIdentifier): ChannelState | null { + return this.currentChannel[from.instanceId]; + } + + getChannelById(id: string | null): ChannelState | null { + if (id == null) { + return null; + } + return this.state.find(c => c.id == id) ?? null; + } + + convertChannelTypeToString(type: ChannelType): string { + switch (type) { + case ChannelType.app: + return 'app'; + case ChannelType.user: + return 'user'; + case ChannelType.private: + return 'private'; + } + } + + getListeners(appId: AppIdentifier) { + return this.contextListeners.filter(r => r.instanceId == appId.instanceId); + } + + moveUserChannelListeners(app: AppIdentifier, channelId: string | null) { + this.getListeners(app) + .filter(l => l.userChannelListener) + .forEach(l => { + l.channelId = channelId; + }); + } + + updateChannelState(channelId: string, context: Context) { + const cs = this.getChannelById(channelId); + if (cs) { + cs.context = cs.context.filter(c => c.type != context.type); + cs.context.unshift(context); + } + } + + async accept(msg: AppRequestMessage, sc: ServerContext, uuid: InstanceID) { + const from = sc.getInstanceDetails(uuid); + + if (from == null) { + // this handler only deals with connected apps + return; + } + + try { + switch (msg.type as string | null) { + // app channels registration + case 'getOrCreateChannelRequest': + return this.handleGetOrCreateRequest(msg as GetOrCreateChannelRequest, sc, from); + + // user channel management + case 'getUserChannelsRequest': + return this.handleGetUserChannelsRequest(msg as GetUserChannelsRequest, sc, from); + case 'leaveCurrentChannelRequest': + return this.handleLeaveCurrentChannelRequest(msg as LeaveCurrentChannelRequest, sc, from); + case 'joinUserChannelRequest': + return this.handleJoinUserChannelRequest(msg as JoinUserChannelRequest, sc, from); + case 'getCurrentChannelRequest': + return this.handleGetCurrentChannelRequest(msg as GetCurrentChannelRequest, sc, from); + + // general broadcast + case 'broadcastRequest': + return this.handleBroadcastRequest(msg as BroadcastRequest, sc, from); + + // context listeners + case 'addContextListenerRequest': + return this.handleAddContextListenerRequest(msg as AddContextListenerRequest, sc, from); + case 'contextListenerUnsubscribeRequest': + return this.handleContextListenerUnsubscribeRequest(msg as ContextListenerUnsubscribeRequest, sc, from); + + // private channels create/disconnect + case 'createPrivateChannelRequest': + return this.handleCreatePrivateChannelRequest(msg as CreatePrivateChannelRequest, sc, from); + case 'privateChannelDisconnectRequest': + return this.handlePrivateChannelDisconnectRequest(msg as PrivateChannelDisconnectRequest, sc, from); + + // private channel event listeners + case 'privateChannelAddEventListenerRequest': + return this.handlePrivateChannelAddEventListenerRequest( + msg as PrivateChannelAddEventListenerRequest, + from, + sc + ); + case 'privateChannelUnsubscribeEventListenerRequest': + return this.handlePrivateChannelUnsubscribeEventListenerRequest( + msg as PrivateChannelUnsubscribeEventListenerRequest, + sc, + from + ); + + // handling state synchronization of channels + case 'getCurrentContextRequest': + return this.handleGetCurrentContextRequest(msg as GetCurrentContextRequest, sc, from); + } + } catch (e) { + const responseType = msg.type.replace(new RegExp('Request$'), 'Response'); + errorResponse(sc, msg, from, (e as Error).message ?? e, responseType as AgentResponseMessage['type']); + } + } + + handleCreatePrivateChannelRequest( + arg0: CreatePrivateChannelRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const id = sc.createUUID(); + this.state.push({ + id, + type: ChannelType.private, + context: [], + displayMetadata: {}, + }); + + successResponse( + sc, + arg0, + from, + { privateChannel: { id, type: this.convertChannelTypeToString(ChannelType.private) } }, + 'createPrivateChannelResponse' + ); + } + + handleGetCurrentContextRequest( + arg0: GetCurrentContextRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const channel = this.getChannelById(arg0.payload.channelId); + const type = arg0.payload.contextType; + + if (channel) { + const context = type ? (channel.context.find(c => c.type == type) ?? null) : (channel.context[0] ?? null); + successResponse(sc, arg0, from, { context: context }, 'getCurrentContextResponse'); + } else { + errorResponse(sc, arg0, from, ChannelError.NoChannelFound, 'getCurrentContextResponse'); + } + } + + handlePrivateChannelUnsubscribeEventListenerRequest( + arg0: PrivateChannelUnsubscribeEventListenerRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const i = this.eventListeners.findIndex(r => r.listenerUuid == arg0.payload.listenerUUID); + if (i > -1) { + this.eventListeners.splice(i, 1); + successResponse(sc, arg0, from, {}, 'privateChannelUnsubscribeEventListenerResponse'); + } else { + errorResponse(sc, arg0, from, 'ListenerNotFound', 'privateChannelUnsubscribeEventListenerResponse'); + } + } + + handlePrivateChannelDisconnectRequest( + arg0: PrivateChannelDisconnectRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const toUnsubscribe = this.contextListeners + .filter(r => r.appId == from.appId && r.instanceId == from.instanceId) + .filter(r => r.channelId == arg0.payload.channelId); + + toUnsubscribe.forEach(u => { + this.invokePrivateChannelEventListeners( + arg0.payload.channelId, + 'unsubscribe', + 'privateChannelOnUnsubscribeEvent', + sc, + u.contextType ?? undefined + ); + }); + + this.contextListeners = this.contextListeners.filter(r => !toUnsubscribe.includes(r)); + this.invokePrivateChannelEventListeners( + arg0.payload.channelId, + 'disconnect', + 'privateChannelOnDisconnectEvent', + sc + ); + successResponse(sc, arg0, from, {}, 'privateChannelDisconnectResponse'); + } + + handleContextListenerUnsubscribeRequest( + arg0: ContextListenerUnsubscribeRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const i = this.contextListeners.findIndex( + r => r.listenerUuid == arg0.payload.listenerUUID && r.instanceId == from.instanceId + ); + + if (i > -1) { + const rl = this.contextListeners[i]; + const channel = this.getChannelById(rl.channelId); + this.invokePrivateChannelEventListeners( + channel?.id ?? null, + 'unsubscribe', + 'privateChannelOnUnsubscribeEvent', + sc, + rl.contextType ?? undefined + ); + this.contextListeners.splice(i, 1); + successResponse(sc, arg0, from, {}, 'contextListenerUnsubscribeResponse'); + } else { + errorResponse(sc, arg0, from, 'ListenerNotFound', 'contextListenerUnsubscribeResponse'); + } + } + + handleAddContextListenerRequest( + arg0: AddContextListenerRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + let channelId = null; + let channelType = ChannelType.user; + + if (arg0.payload?.channelId) { + const channel = this.getChannelById(arg0.payload?.channelId); + channelType = channel?.type ?? ChannelType.user; + + if (channel == null) { + errorResponse(sc, arg0, from, ChannelError.NoChannelFound, 'addContextListenerResponse'); + return; + } else { + channelId = channel.id; + } + } + + const lr: ContextListenerRegistration = { + appId: from.appId, + instanceId: from.instanceId ?? 'no-instance-id', + channelId: channelId, + listenerUuid: sc.createUUID(), + contextType: arg0.payload.contextType, + userChannelListener: channelType == ChannelType.user, + }; + + this.contextListeners.push(lr); + this.invokePrivateChannelEventListeners( + channelId, + 'addContextListener', + 'privateChannelOnAddContextListenerEvent', + sc, + arg0.payload.contextType ?? undefined + ); + successResponse(sc, arg0, from, { listenerUUID: lr.listenerUuid }, 'addContextListenerResponse'); + } + + handleBroadcastRequest(arg0: BroadcastRequest, sc: ServerContext, from: FullAppIdentifier) { + const matchingListeners = this.contextListeners + .filter(r => r.channelId == arg0.payload.channelId) + .filter(r => r.contextType == null || r.contextType == arg0.payload.context.type); + + const matchingApps: FullAppIdentifier[] = matchingListeners + .map(r => { + return { appId: r.appId, instanceId: r.instanceId }; + }) + .filter(onlyUnique); + + matchingApps.forEach(app => { + sc.post( + { + meta: { + eventUuid: sc.createUUID(), + timestamp: new Date(), + }, + type: 'broadcastEvent', + payload: { + channelId: arg0.payload.channelId, + context: arg0.payload.context, + }, + }, + app.instanceId + ); + }); + + this.updateChannelState(arg0.payload.channelId, arg0.payload.context); + successResponse(sc, arg0, from, {}, 'broadcastResponse'); + } + + handleGetCurrentChannelRequest( + arg0: GetCurrentChannelRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const currentChannel = this.getCurrentChannel(from); + if (currentChannel) { + successResponse( + sc, + arg0, + from, + { + channel: { + id: currentChannel.id, + type: this.convertChannelTypeToString(currentChannel.type), + displayMetadata: currentChannel.displayMetadata, + }, + }, + 'getCurrentChannelResponse' + ); + } else { + successResponse(sc, arg0, from, { channel: null }, 'getCurrentChannelResponse'); + } + } + + handleJoinUserChannelRequest( + arg0: JoinUserChannelRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + // check it's a user channel + const newChannel = this.getChannelById(arg0.payload.channelId); + if (newChannel == null || newChannel.type != ChannelType.user) { + return errorResponse(sc, arg0, from, ChannelError.NoChannelFound, 'joinUserChannelResponse'); + } + + // join it. + const instanceId = from.instanceId ?? 'no-instance-id'; + this.currentChannel[instanceId] = newChannel; + this.moveUserChannelListeners(from, newChannel.id); + successResponse(sc, arg0, from, {}, 'joinUserChannelResponse'); + } + + handleLeaveCurrentChannelRequest( + arg0: LeaveCurrentChannelRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const instanceId = from.instanceId ?? 'no-instance-id'; + const currentChannel = this.currentChannel[instanceId]; + if (currentChannel) { + delete this.currentChannel[instanceId]; + this.moveUserChannelListeners(from, null); + } + successResponse(sc, arg0, from, {}, 'leaveCurrentChannelResponse'); + } + + handleGetOrCreateRequest( + arg0: GetOrCreateChannelRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const id = arg0.payload.channelId; + let channel = this.getChannelById(id); + if (channel) { + if (channel.type != ChannelType.app) { + errorResponse(sc, arg0, from, ChannelError.AccessDenied, 'getOrCreateChannelResponse'); + return; + } + } + + channel = { + id: id, + type: ChannelType.app, + context: [], + displayMetadata: {}, + }; + this.state.push(channel); + successResponse(sc, arg0, from, { channel: { id: channel.id, type: channel.type } }, 'getOrCreateChannelResponse'); + } + + handleGetUserChannelsRequest( + arg0: GetUserChannelsRequest, + sc: ServerContext, + from: FullAppIdentifier + ) { + const userChannels = this.state.filter(c => c.type == ChannelType.user); + successResponse( + sc, + arg0, + from, + { + userChannels: userChannels.map(c => ({ + id: c.id, + type: this.convertChannelTypeToString(c.type), + displayMetadata: c.displayMetadata, + })), + }, + 'getUserChannelsResponse' + ); + } + + handlePrivateChannelAddEventListenerRequest( + arg0: PrivateChannelAddEventListenerRequest, + from: FullAppIdentifier, + sc: ServerContext + ) { + const channel = this.getChannelById(arg0.payload.privateChannelId); + + if (channel == null || channel.type != ChannelType.private) { + errorResponse(sc, arg0, from, ChannelError.NoChannelFound, 'privateChannelAddEventListenerResponse'); + } else { + const el = { + appId: from.appId, + instanceId: from.instanceId, + channelId: arg0.payload.privateChannelId, + eventType: arg0.payload.listenerType, + listenerUuid: sc.createUUID(), + } as PrivateChannelEventListener; + this.eventListeners.push(el); + successResponse(sc, arg0, from, { listenerUUID: el.listenerUuid }, 'privateChannelAddEventListenerResponse'); + } + } + + invokePrivateChannelEventListeners( + privateChannelId: string | null, + eventType: PrivateChannelEventTypes, + messageType: + | 'privateChannelOnAddContextListenerEvent' + | 'privateChannelOnUnsubscribeEvent' + | 'privateChannelOnDisconnectEvent', + sc: ServerContext, + contextType?: string + ) { + if (privateChannelId) { + const msg: PrivateChannelEvents = { + type: messageType, + meta: { + eventUuid: sc.createUUID(), + timestamp: new Date(), + }, + payload: { + privateChannelId, + contextType: contextType, + }, + } as PrivateChannelEvents; //Typescript doesn't like comparing an object with a union property (messageType) with a union of object types + + console.log('invokePrivateChannelEventListeners msg: ', msg); + this.eventListeners + .filter( + listener => + listener.channelId == privateChannelId && (listener.eventType == eventType || listener.eventType == null) + ) + .forEach(e => { + console.log(`invokePrivateChannelEventListeners: posting to instance ${e.instanceId}`); + sc.post(msg, e.instanceId); + }); + } + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/HeartbeatHandler.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/HeartbeatHandler.ts new file mode 100644 index 000000000..a1c0cbbbe --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/HeartbeatHandler.ts @@ -0,0 +1,142 @@ +import { MessageHandler } from '../BasicFDC3Server'; +import { AppRegistration, InstanceID, ServerContext, State } from '../ServerContext'; +import { + AppRequestMessage, + HeartbeatEvent, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { FullAppIdentifier } from './support'; + +type HeartbeatDetails = { + instanceId: string; + time: number; + state: string; +}; + +function convertToText(s?: State): string { + if (s == undefined) { + return 'Unknown'; + } else { + switch (s) { + case State.Pending: + return 'Pending'; + case State.Connected: + return 'Connected'; + case State.NotResponding: + return 'Not Responding'; + case State.Terminated: + return 'Terminated'; + } + } +} + +/* + * Handles heartbeat pings and responses + */ +export class HeartbeatHandler implements MessageHandler { + private readonly contexts: ServerContext[] = []; + private readonly lastHeartbeats: Map = new Map(); + private readonly timerFunction: NodeJS.Timeout; + + constructor(pingInterval: number = 1000, disconnectedAfter: number = 5000, deadAfter: number = 20000) { + this.timerFunction = setInterval(() => { + this.contexts.forEach(async sc => { + const apps = await sc.getAllApps(); + apps + .filter(app => app.state == State.Connected || app.state == State.NotResponding) + .forEach(app => { + const now = new Date().getTime(); + this.sendHeartbeat(sc, app); + + // check when the last heartbeat happened + const lastHeartbeat = this.lastHeartbeats.get(app.instanceId); + const currentState = app.state; + + if (lastHeartbeat != undefined) { + const timeSinceLastHeartbeat = now - lastHeartbeat; + + if (timeSinceLastHeartbeat < disconnectedAfter && currentState != State.Connected) { + console.error( + `Heartbeat from ${app.instanceId} for ${timeSinceLastHeartbeat}ms. App is considered connected.` + ); + sc.setAppState(app.instanceId, State.Connected); + } else if (timeSinceLastHeartbeat > disconnectedAfter && currentState == State.Connected) { + console.error( + `No heartbeat from ${app.instanceId} for ${timeSinceLastHeartbeat}ms. App is considered not responding.` + ); + sc.setAppState(app.instanceId, State.NotResponding); + } else if (timeSinceLastHeartbeat > deadAfter && currentState == State.NotResponding) { + console.error( + `No heartbeat from ${app.instanceId} for ${timeSinceLastHeartbeat}ms. App is considered terminated.` + ); + sc.setAppState(app.instanceId, State.Terminated); + } else { + // no action + } + } else { + // start the clock + this.lastHeartbeats.set(app.instanceId, now); + } + }); + }); + }, pingInterval); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + cleanup(_instanceId: InstanceID, _sc: ServerContext): void { + //TODO: Consider whether to clean-up last heartbeat times + } + + heartbeatTimes(): HeartbeatDetails[] { + const now = new Date().getTime(); + return Array.from(this.lastHeartbeats) + .map(e => { + return { + instanceId: e[0], + time: now - e[1], + state: convertToText(this.contexts.map(sc => sc.getInstanceDetails(e[0])).reduce((a, b) => a || b)?.state), + } as HeartbeatDetails; + }) + .filter(e => e.state != 'Terminated'); + } + + shutdown(): void { + clearInterval(this.timerFunction); + } + + async accept( + msg: AppRequestMessage | WebConnectionProtocol6Goodbye, + sc: ServerContext, + from: InstanceID + ): Promise { + if (!this.contexts.includes(sc)) { + this.contexts.push(sc); + } + + if (msg.type == 'heartbeatAcknowledgementRequest') { + const app = sc.getInstanceDetails(from); + if (app) { + this.lastHeartbeats.set(app.instanceId, new Date().getTime()); + } + } + + if (msg.type == 'WCP6Goodbye') { + const app = sc.getInstanceDetails(from); + if (app) { + sc.setAppState(from, State.Terminated); + } + } + } + + async sendHeartbeat(sc: ServerContext, app: FullAppIdentifier): Promise { + const event: HeartbeatEvent = { + type: 'heartbeatEvent', + meta: { + timestamp: new Date(), + eventUuid: sc.createUUID(), + }, + payload: {}, + }; + sc.post(event, app.instanceId); + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/IntentHandler.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/IntentHandler.ts new file mode 100644 index 000000000..4145599c2 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/IntentHandler.ts @@ -0,0 +1,676 @@ +import { MessageHandler } from '../BasicFDC3Server'; +import { AppRegistration, InstanceID, ServerContext } from '../ServerContext'; +import { Directory, DirectoryIntent } from '../directory/DirectoryInterface'; +import { Context } from '@finos/fdc3-context'; +import { AppIntent, ResolveError, AppIdentifier } from '@finos/fdc3-standard'; +import { + errorResponse, + errorResponseId, + FullAppIdentifier, + isFullAppIdentifier, + successResponse, + successResponseId, +} from './support'; +import { + IntentEvent, + FindIntentsByContextRequest, + FindIntentRequest, + AddIntentListenerRequest, + IntentListenerUnsubscribeRequest, + RaiseIntentRequest, + RaiseIntentForContextRequest, + IntentResultRequest, + AppRequestMessage, + AgentResponseMessage, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type ListenerRegistration = { + appId: string; + instanceId: string; + intentName: string; + listenerUUID: string; +}; + +type IntentRequest = { + intent: string; + context: Context; + requestUuid: string; + from: FullAppIdentifier; + type: 'raiseIntentResponse' | 'raiseIntentForContextResponse'; +}; + +/** + * Re-writes the request to forward it on to the target application + */ +async function forwardRequest( + arg0: IntentRequest, + to: FullAppIdentifier, + sc: ServerContext, + ih: IntentHandler +): Promise { + const out: IntentEvent = { + type: 'intentEvent', + payload: { + context: arg0.context, + intent: arg0.intent, + originatingApp: { + appId: arg0.from.appId, + instanceId: arg0.from.instanceId, + }, + raiseIntentRequestUuid: arg0.requestUuid, + }, + meta: { + eventUuid: sc.createUUID(), + timestamp: new Date(), + }, + }; + + // register the resolution destination + ih.pendingResolutions.set(arg0.requestUuid, arg0.from); + await sc.post(out, to.instanceId); + successResponseId( + sc, + arg0.requestUuid, + arg0.from, + { + intentResolution: { + intent: arg0.intent, + source: { appId: to.appId, instanceId: to.instanceId }, //make sure we're not carrying any excess fields from internal state + }, + }, + arg0.type + ); +} + +/** + * A pending intent is one for an app that hasn't registered it's intent listener yet. + * (Possibly it is being opened) + * + * Pending intents wait for that registration and then message the app. + */ +class PendingIntent { + complete: boolean = false; + r: IntentRequest; + appId: AppIdentifier; + sc: ServerContext; + ih: IntentHandler; + + constructor(r: IntentRequest, sc: ServerContext, ih: IntentHandler, appId: AppIdentifier) { + this.r = r; + this.appId = appId; + this.sc = sc; + this.ih = ih; + + // handle the timeout + setTimeout(() => { + if (!this.complete) { + errorResponseId(sc, r.requestUuid, r.from, ResolveError.IntentDeliveryFailed, r.type); + this.ih.pendingIntents.delete(this); + } + }, ih.timeoutMs); + } + + async accept(arg0: ListenerRegistration): Promise { + if ( + arg0.appId == this.appId.appId && + arg0.intentName == this.r.intent && + (arg0.instanceId == this.appId.instanceId || this.appId.instanceId == undefined) + ) { + this.complete = true; + this.ih.pendingIntents.delete(this); + forwardRequest(this.r, { appId: arg0.appId, instanceId: arg0.instanceId }, this.sc, this.ih); + } + } +} + +export class IntentHandler implements MessageHandler { + private readonly directory: Directory; + private registrations: ListenerRegistration[] = []; + readonly pendingIntents: Set = new Set(); + readonly pendingResolutions: Map = new Map(); + readonly timeoutMs: number; + + constructor(d: Directory, timeoutMs: number) { + this.directory = d; + this.timeoutMs = timeoutMs; + } + + cleanup(instanceId: InstanceID /*, _sc: ServerContext */): void { + this.registrations = this.registrations.filter(reg => reg.instanceId != instanceId); + //don't clean up pendingIntents as some apps may load + + //cleanup pendingResolutions + this.pendingResolutions.forEach((val, key) => { + if (val.instanceId === instanceId) { + this.pendingResolutions.delete(key); + } + }); + } + + shutdown(): void {} + + async narrowIntents( + raiser: AppIdentifier, + appIntents: AppIntent[], + context: Context, + sc: ServerContext + ): Promise { + const out = await sc.narrowIntents(raiser, appIntents, context); + return out; + } + + async accept(msg: AppRequestMessage, sc: ServerContext, uuid: InstanceID): Promise { + const from = sc.getInstanceDetails(uuid); + + if (from == null) { + // this handler only deals with connected apps + return; + } + + try { + switch (msg.type as string) { + // finding intents + case 'findIntentsByContextRequest': + return await this.findIntentsByContextRequest(msg as FindIntentsByContextRequest, sc, from); + case 'findIntentRequest': + return await this.findIntentRequest(msg as FindIntentRequest, sc, from); + + // listeners + case 'addIntentListenerRequest': + return await this.onAddIntentListener(msg as AddIntentListenerRequest, sc, from); + case 'intentListenerUnsubscribeRequest': + return await this.onUnsubscribe(msg as IntentListenerUnsubscribeRequest, sc, from); + + // raising intents and returning results + case 'raiseIntentRequest': + return await this.raiseIntentRequest(msg as RaiseIntentRequest, sc, from); + case 'raiseIntentForContextRequest': + return await this.raiseIntentForContextRequest(msg as RaiseIntentForContextRequest, sc, from); + case 'intentResultRequest': + return await this.intentResultRequest(msg as IntentResultRequest, sc, from); + } + } catch (e) { + const responseType = msg.type.replace(new RegExp('Request$'), 'Response') as AgentResponseMessage['type']; + errorResponse(sc, msg, from, (e as Error).message ?? e, responseType); + } + } + + /** + * Called when target app handles an intent + */ + intentResultRequest( + arg0: IntentResultRequest, + sc: ServerContext, + from: FullAppIdentifier + ): void | PromiseLike { + const requestId = arg0.payload.raiseIntentRequestUuid; + const to = this.pendingResolutions.get(requestId); + if (to) { + // post the result to the app that raised the intent + // if its still connected, otherwise do nothing + successResponseId( + sc, + requestId, + to, + { + intentResult: arg0.payload.intentResult, + }, + 'raiseIntentResultResponse' + ); + + this.pendingResolutions.delete(requestId); + } + // respond to the app that handled the intent + successResponse(sc, arg0, from, {}, 'intentResultResponse'); + } + + onUnsubscribe( + arg0: IntentListenerUnsubscribeRequest, + sc: ServerContext, + from: FullAppIdentifier + ): void { + const id = arg0.payload.listenerUUID; + const fi = this.registrations.findIndex(e => e.listenerUUID == id); + if (fi > -1) { + this.registrations.splice(fi, 1); + successResponse(sc, arg0, from, {}, 'intentListenerUnsubscribeResponse'); + } else { + errorResponse(sc, arg0, from, 'Non-Existent Listener', 'intentListenerUnsubscribeResponse'); + } + } + + onAddIntentListener( + arg0: AddIntentListenerRequest, + sc: ServerContext, + from: FullAppIdentifier + ): void { + const lr: ListenerRegistration = { + appId: from.appId, + instanceId: from.instanceId, + intentName: arg0.payload.intent, + listenerUUID: sc.createUUID(), + }; + + this.registrations.push(lr); + successResponse( + sc, + arg0, + from, + { + listenerUUID: lr.listenerUUID, + }, + 'addIntentListenerResponse' + ); + + // see if this intent listener is the destination for any pending intents + for (const x of this.pendingIntents) { + x.accept(lr); + if (x.complete) { + this.pendingIntents.delete(x); + } + } + } + + hasListener(instanceId: string, intentName: string): boolean { + return this.registrations.find(r => r.instanceId == instanceId && r.intentName == intentName) != null; + } + + async getRunningApps(appId: string, sc: ServerContext): Promise { + return (await sc.getConnectedApps()).filter(a => a.appId == appId); + } + + async startWithPendingIntent( + arg0: IntentRequest, + sc: ServerContext, + target: AppIdentifier + ): Promise { + // app exists but needs starting + const pi = new PendingIntent(arg0, sc, this, target); + this.pendingIntents.add(pi); + sc.open(target.appId).then(() => { + return undefined; + }); + } + + createAppIntents(ir: IntentRequest[], target: AppIdentifier[]): AppIntent[] { + return ir.map(r => { + return { + intent: { + name: r.intent, + displayName: r.intent, + }, + apps: target, + }; + }); + } + + async raiseIntentRequestToSpecificInstance( + arg0: IntentRequest[], + sc: ServerContext, + target: FullAppIdentifier + ): Promise { + if (!(await sc.isAppConnected(target.instanceId))) { + // instance doesn't exist + return errorResponseId( + sc, + arg0[0].requestUuid, + arg0[0].from, + ResolveError.TargetInstanceUnavailable, + arg0[0].type + ); + } + + const requestsWithListeners = arg0.filter(r => this.hasListener(target.instanceId, r.intent)); + + if (requestsWithListeners.length == 0) { + this.createPendingIntentIfAllowed(arg0[0], sc, target); + } else { + // ok, deliver to the current running app. + return forwardRequest(requestsWithListeners[0], target, sc, this); + } + } + + async createPendingIntentIfAllowed(ir: IntentRequest, sc: ServerContext, target: AppIdentifier) { + // if this app declares that it supports the intent, we'll create a pending intent + const matchingIntents: DirectoryIntent[] = this.directory.retrieveIntents(ir.context.type, ir.intent, undefined); + const declared = matchingIntents.find(i => i.appId == target.appId); + + if (declared) { + // maybe listener hasn't been registered yet - create a pending intent + const pi = new PendingIntent(ir, sc, this, target); + this.pendingIntents.add(pi); + } else { + errorResponseId(sc, ir.requestUuid, ir.from, ResolveError.NoAppsFound, ir.type); + } + } + + async raiseIntentRequestToSpecificAppId( + arg0: IntentRequest[], + sc: ServerContext, + target: AppIdentifier + ): Promise { + // dealing with a specific app, which may or may not be open + const runningApps = await this.getRunningApps(target.appId, sc); + + const appIntents = this.createAppIntents(arg0, [...runningApps, { appId: target.appId }]); + + const narrowedAppIntents = await this.narrowIntents(arg0[0].from, appIntents, arg0[0].context, sc); + + if (narrowedAppIntents.length == 1) { + if (narrowedAppIntents[0].apps.length == 2 && narrowedAppIntents[0].apps[0].instanceId) { + // single running instance + return this.raiseIntentRequestToSpecificInstance(arg0, sc, runningApps[0]); + } else if (narrowedAppIntents[0].apps.length == 1) { + // no running instance, single app + const appRecords = this.directory.retrieveAppsById(target.appId); + if (appRecords.length >= 1) { + const ir: IntentRequest = { + ...arg0[0], + intent: narrowedAppIntents[0].intent.name, + }; + return this.startWithPendingIntent(ir, sc, target); + } else { + // app doesn't exist + return errorResponseId( + sc, + arg0[0].requestUuid, + arg0[0].from, + ResolveError.TargetAppUnavailable, + arg0[0].type + ); + } + } + } + + // need to use the resolver to choose a running app instance + + if (arg0[0].type == 'raiseIntentResponse') { + return successResponseId( + sc, + arg0[0].requestUuid, + arg0[0].from, + { + appIntent: narrowedAppIntents[0], + }, + arg0[0].type + ); + } else { + // raise intent for context + return successResponseId( + sc, + arg0[0].requestUuid, + arg0[0].from, + { + appIntents: narrowedAppIntents, + }, + arg0[0].type + ); + } + } + + oneAppOnly(appIntent: AppIntent): boolean { + const apps = appIntent.apps.map(a => a.appId); + const uniqueApps = apps.filter((v, i, a) => a.indexOf(v) === i).length; + return uniqueApps == 1; + } + + async raiseIntentToAnyApp(arg0: IntentRequest[], sc: ServerContext): Promise { + const connectedApps = await sc.getConnectedApps(); + const matchingIntents = arg0.flatMap(i => this.directory.retrieveIntents(i.context.type, i.intent, undefined)); + const uniqueIntentNames = matchingIntents.map(i => i.intentName).filter((v, i, a) => a.indexOf(v) === i); + + const appIntents: AppIntent[] = uniqueIntentNames.map(i => { + const directoryAppsWithIntent = matchingIntents.filter(mi => mi.intentName == i).map(mi => mi.appId); + const runningApps = connectedApps.filter(ca => directoryAppsWithIntent.includes(ca.appId)); + + return { + intent: { + name: i, + displayName: i, + }, + apps: [ + ...runningApps, + ...directoryAppsWithIntent.map(d => { + return { appId: d }; + }), + ], + }; + }); + + const narrowedAppIntents = await this.narrowIntents(arg0[0].from, appIntents, arg0[0].context, sc); + + if (narrowedAppIntents.length == 0) { + // nothing can resolve the intent, fail + return errorResponseId(sc, arg0[0].requestUuid, arg0[0].from, ResolveError.NoAppsFound, arg0[0].type); + } + + if (narrowedAppIntents.length == 1) { + const theAppIntent = narrowedAppIntents[0]; + if (this.oneAppOnly(theAppIntent)) { + const instanceCount = theAppIntent.apps.filter(a => a.instanceId).length; + const ir: IntentRequest = { + ...arg0[0], + intent: narrowedAppIntents[0].intent.name, + }; + if (instanceCount == 1 && isFullAppIdentifier(theAppIntent.apps[0])) { + // app is running + return forwardRequest(ir, theAppIntent.apps[0], sc, this); + } else if (instanceCount == 0) { + return this.startWithPendingIntent(ir, sc, theAppIntent.apps[0]); + } + } + } + + if (arg0[0].type == 'raiseIntentResponse') { + // raise intent + return successResponseId( + sc, + arg0[0].requestUuid, + arg0[0].from, + { + appIntent: narrowedAppIntents[0], + }, + arg0[0].type + ); + } else { + // raise intent for context + return successResponseId(sc, arg0[0].requestUuid, arg0[0].from, { appIntents: narrowedAppIntents }, arg0[0].type); + } + } + + async raiseIntentRequest( + arg0: RaiseIntentRequest, + sc: ServerContext, + from: FullAppIdentifier + ): Promise { + const intentRequest: IntentRequest = { + context: arg0.payload.context, + from, + intent: arg0.payload.intent, + requestUuid: arg0.meta.requestUuid, + type: 'raiseIntentResponse', + }; + + const target = arg0.payload.app; + if (target) { + if (isFullAppIdentifier(target)) { + return this.raiseIntentRequestToSpecificInstance([intentRequest], sc, target); + } else if (target.appId) { + return this.raiseIntentRequestToSpecificAppId([intentRequest], sc, target); + } else { + //invalid target + console.warn('Received an invalid target argument for raiseIntent', target, arg0); + return errorResponseId( + sc, + arg0.meta.requestUuid, + from, + ResolveError.TargetAppUnavailable, + 'raiseIntentResponse' + ); + } + } else { + //No target + return this.raiseIntentToAnyApp([intentRequest], sc); + } + } + + async raiseIntentForContextRequest( + arg0: RaiseIntentForContextRequest, + sc: ServerContext, + from: FullAppIdentifier + ): Promise { + // dealing with a specific instance of an app + const mappedIntents = this.directory.retrieveIntents(arg0.payload.context.type, undefined, undefined); + const uniqueIntentNames = mappedIntents.filter((v, i, a) => a.findIndex(v2 => v2.intentName == v.intentName) == i); + const possibleIntentRequests: IntentRequest[] = uniqueIntentNames.map(i => { + return { + context: arg0.payload.context, + from, + intent: i.intentName, + requestUuid: arg0.meta.requestUuid, + type: 'raiseIntentForContextResponse', + }; + }); + + if (possibleIntentRequests.length == 0) { + return errorResponseId( + sc, + arg0.meta.requestUuid, + from, + ResolveError.NoAppsFound, + 'raiseIntentForContextResponse' + ); + } + + const target = arg0.payload.app; + if (target) { + if (isFullAppIdentifier(target)) { + return this.raiseIntentRequestToSpecificInstance(possibleIntentRequests, sc, target); + } else if (target.appId) { + return this.raiseIntentRequestToSpecificAppId(possibleIntentRequests, sc, target); + } else { + //invalid target + console.warn('Received an invalid target argument for raiseIntentForContext', target, arg0); + return errorResponseId( + sc, + arg0.meta.requestUuid, + from, + ResolveError.TargetAppUnavailable, + 'raiseIntentForContextResponse' + ); + } + } else { + //No target + return this.raiseIntentToAnyApp(possibleIntentRequests, sc); + } + } + + async findIntentsByContextRequest( + r: FindIntentsByContextRequest, + sc: ServerContext, + from: FullAppIdentifier + ): Promise { + const { context, resultType } = r.payload; + + const apps1 = this.directory.retrieveIntents(context?.type, undefined, resultType); + + // fold apps so same intents aren't duplicated + const apps2: AppIntent[] = []; + //don't use foreach as the handling function is async and needs to process serially + for (let index = 0; index < apps1.length; index++) { + const a1 = apps1[index]; + const existing = apps2.find(a2 => a2.intent.name == a1.intentName); + const runningInstances = await this.retrieveRunningInstances(a1.appId, sc); + if (existing) { + existing.apps.push({ appId: a1.appId }); + runningInstances.forEach(ri => existing.apps.push({ appId: a1.appId, instanceId: ri.instanceId })); + } else { + const appIntent: AppIntent = { + intent: { + name: a1.intentName, + displayName: a1.displayName ?? a1.intentName, + }, + apps: [ + { + appId: a1.appId, + }, + ], + }; + runningInstances.forEach(ri => appIntent.apps.push({ appId: a1.appId, instanceId: ri.instanceId })); + apps2.push(appIntent); + } + } + + successResponse( + sc, + r, + from, + { + appIntents: apps2, + }, + 'findIntentsByContextResponse' + ); + } + + async findIntentRequest( + r: FindIntentRequest, + sc: ServerContext, + from: FullAppIdentifier + ): Promise { + const { intent, context, resultType } = r.payload; + + // listeners for connected applications + const apps2 = (await this.retrieveListeners(intent, sc)).map(lr => { + return { + appId: lr.appId, + instanceId: lr.instanceId, + }; + }) as AppIdentifier[]; + + // directory entries + const apps1 = this.directory.retrieveApps(context?.type, intent, resultType).map(a => { + return { + appId: a.appId, + }; + }); + + //combine the lists, no need to de-duplicate as we should return both a directory record with just appId + any instance with appId/instanceId + const finalApps = [...apps1, ...apps2]; + + // just need this for the (deprecated) display name + const allMatchingIntents = this.directory.retrieveIntents(context?.type, intent, resultType); + const displayName = allMatchingIntents.length > 0 ? allMatchingIntents[0].displayName : undefined; + + successResponse( + sc, + r, + from, + { + appIntent: { + intent: { + name: intent, + displayName, + }, + apps: finalApps, + }, + }, + 'findIntentResponse' + ); + } + + async retrieveListeners( + intentName: string | undefined, + sc: ServerContext + ): Promise { + const activeApps = await sc.getConnectedApps(); + const matching = this.registrations.filter(r => r.intentName == intentName); + const active = matching.filter(r => activeApps.find(a => a.instanceId == r.instanceId)); + return active; + } + + async retrieveRunningInstances(appId: string, sc: ServerContext) { + const activeApps = await sc.getConnectedApps(); + const filteredApps = activeApps.filter(a => a.appId === appId); + return filteredApps; + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/OpenHandler.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/OpenHandler.ts new file mode 100644 index 000000000..e374a0e8f --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/OpenHandler.ts @@ -0,0 +1,363 @@ +import { MessageHandler } from '../BasicFDC3Server'; +import { AppRegistration, InstanceID, ServerContext, State } from '../ServerContext'; +import { Directory, DirectoryApp } from '../directory/DirectoryInterface'; +import { ContextElement } from '@finos/fdc3-context'; +import { OpenError, ResolveError, AppIdentifier, AppMetadata, ImplementationMetadata } from '@finos/fdc3-standard'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { errorResponse, FullAppIdentifier, successResponse } from './support'; +import { + AgentResponseMessage, + AppRequestMessage, + GetInfoRequest, + isAddContextListenerRequest, + isFindInstancesRequest, + isGetAppMetadataRequest, + isGetInfoRequest, + isOpenRequest, + isWebConnectionProtocol4ValidateAppIdentity, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type BroadcastEvent = BrowserTypes.BroadcastEvent; +type AddContextListenerRequest = BrowserTypes.AddContextListenerRequest; +type FindInstancesRequest = BrowserTypes.FindInstancesRequest; +type GetAppMetadataRequest = BrowserTypes.GetAppMetadataRequest; +type OpenRequest = BrowserTypes.OpenRequest; +type WebConnectionProtocol4ValidateAppIdentity = BrowserTypes.WebConnectionProtocol4ValidateAppIdentity; +type WebConnectionProtocol5ValidateAppIdentityFailedResponse = + BrowserTypes.WebConnectionProtocol5ValidateAppIdentityFailedResponse; +type WebConnectionProtocol5ValidateAppIdentitySuccessResponse = + BrowserTypes.WebConnectionProtocol5ValidateAppIdentitySuccessResponse; + +enum AppState { + Opening, + DeliveringContext, + Done, +} + +class PendingApp { + private readonly sc: ServerContext; + private readonly msg: OpenRequest; + readonly context: ContextElement | undefined; + readonly source: FullAppIdentifier; + state: AppState = AppState.Opening; + private openedApp: AppIdentifier | undefined = undefined; + + constructor( + sc: ServerContext, + msg: OpenRequest, + context: ContextElement | undefined, + source: FullAppIdentifier, + timeoutMs: number + ) { + this.context = context; + this.source = source; + this.sc = sc; + this.msg = msg; + + setTimeout(() => { + if (this.state != AppState.Done) { + this.onError(); + } + }, timeoutMs); + } + + private onSuccess() { + this.sc.setAppState(this.openedApp!.instanceId!, State.Connected); + successResponse( + this.sc, + this.msg, + this.source, + { + appIdentifier: { + appId: this.openedApp!.appId, + instanceId: this.openedApp!.instanceId, + }, + }, + 'openResponse' + ); + } + + private onError() { + errorResponse(this.sc, this.msg, this.source, OpenError.AppTimeout, 'openResponse'); + } + + setOpened(openedApp: AppIdentifier) { + this.openedApp = openedApp; + if (this.context) { + this.state = AppState.DeliveringContext; + } else { + this.setDone(); + } + } + + setDone() { + this.state = AppState.Done; + this.onSuccess(); + } +} + +export class OpenHandler implements MessageHandler { + private readonly directory: Directory; + readonly pending: Map = new Map(); + readonly timeoutMs: number; + + constructor(d: Directory, timeoutMs: number) { + this.directory = d; + this.timeoutMs = timeoutMs; + } + + cleanup(/*instanceId: InstanceID, sc: ServerContext*/): void { + //don't cleanup pending if the opening app closes as we should still deliver context + } + + shutdown(): void {} + + async accept( + msg: AppRequestMessage | WebConnectionProtocol4ValidateAppIdentity, + sc: ServerContext, + uuid: InstanceID + ): Promise { + if (isWebConnectionProtocol4ValidateAppIdentity(msg)) { + return this.handleValidate(msg as WebConnectionProtocol4ValidateAppIdentity, sc, uuid); + } else if (isAddContextListenerRequest(msg)) { + //handle context listener adds for pending applications (i.e. opened but awaiting context listener addition to deliver context) + // additional handling is performed in BroadcastHandler + return this.handleAddContextListener(msg as AddContextListenerRequest, sc, uuid); + } else { + const from = sc.getInstanceDetails(uuid); + if (from) { + try { + if (isOpenRequest(msg)) { + return this.open(msg, sc, from); + } else if (isFindInstancesRequest(msg)) { + return this.findInstances(msg, sc, from); + } else if (isGetAppMetadataRequest(msg)) { + return this.getAppMetadata(msg, sc, from); + } else if (isGetInfoRequest(msg)) { + return this.getInfo(msg, sc, from); + } + } catch (e) { + const responseType = msg.type.replace(new RegExp('Request$'), 'Response') as AgentResponseMessage['type']; + errorResponse(sc, msg, from, (e as Error).message ?? e, responseType); + } + } else { + console.warn('Received message from unknown source, ignoring', msg, uuid); + } + } + } + + /** + * This deals with sending pending context to listeners of newly-opened apps. + */ + handleAddContextListener( + arg0: AddContextListenerRequest, + sc: ServerContext, + from: InstanceID + ): void { + const pendingOpen = this.pending.get(from); + if (pendingOpen) { + const contextType = arg0.payload.contextType; + if (pendingOpen.context && pendingOpen.state == AppState.DeliveringContext) { + if (contextType == pendingOpen.context.type || contextType == undefined) { + // ok, we can deliver to this listener + const message: BroadcastEvent = { + meta: { + eventUuid: sc.createUUID(), + timestamp: new Date(), + }, + type: 'broadcastEvent', + payload: { + channelId: null, + context: pendingOpen.context, + originatingApp: { + appId: pendingOpen.source.appId, + instanceId: pendingOpen.source.instanceId, + }, + }, + }; + + pendingOpen.setDone(); + this.pending.delete(from); + sc.post(message, from); + } + } + } + } + + filterPublicDetails(appD: DirectoryApp, appID: AppIdentifier): AppMetadata { + return { + appId: appD.appId, + name: appD.name, + version: appD.version, + title: appD.title, + tooltip: appD.tooltip, + description: appD.description, + icons: appD.icons, + screenshots: appD.screenshots, + instanceId: appID.instanceId, + }; + } + + getAppMetadata(arg0: GetAppMetadataRequest, sc: ServerContext, from: FullAppIdentifier): void { + const appID = arg0.payload.app; + const details = this.directory.retrieveAppsById(appID.appId); + if (details.length > 0) { + successResponse( + sc, + arg0, + from, + { + appMetadata: this.filterPublicDetails(details[0], appID), + }, + 'getAppMetadataResponse' + ); + } else { + errorResponse(sc, arg0, from, ResolveError.TargetAppUnavailable, 'getAppMetadataResponse'); + } + } + + async findInstances( + arg0: FindInstancesRequest, + sc: ServerContext, + from: FullAppIdentifier + ): Promise { + const appId = arg0.payload.app.appId; + const openApps = await sc.getConnectedApps(); + const matching = openApps + .filter(a => a.appId == appId) + .map(a => { + return { + appId: a.appId, + instanceId: a.instanceId, + }; + }); + successResponse( + sc, + arg0, + from, + { + appIdentifiers: matching, + }, + 'findInstancesResponse' + ); + } + + async open(arg0: OpenRequest, sc: ServerContext, from: FullAppIdentifier): Promise { + const toOpen = arg0.payload.app; + const context = arg0.payload.context; + + try { + const uuid = await sc.open(toOpen.appId); + this.pending.set(uuid, new PendingApp(sc, arg0, context, from, this.timeoutMs)); + } catch (e) { + errorResponse(sc, arg0, from, (e as Error).message ?? e, 'openResponse'); + } + } + + async getInfo(arg0: GetInfoRequest, sc: ServerContext, from: FullAppIdentifier): Promise { + const implMetadata: ImplementationMetadata = this.getImplementationMetadata(sc, { + appId: from.appId, + instanceId: from.instanceId, + }); + successResponse( + sc, + arg0, + from, + { + implementationMetadata: implMetadata, + }, + 'getInfoResponse' + ); + } + + getImplementationMetadata(sc: ServerContext, appIdentity: AppIdentifier) { + const appMetadata = this.filterPublicDetails(this.directory.retrieveAppsById(appIdentity.appId)[0], appIdentity); + return { + provider: sc.provider(), + providerVersion: sc.providerVersion(), + fdc3Version: sc.fdc3Version(), + optionalFeatures: { + DesktopAgentBridging: false, + OriginatingAppMetadata: true, + UserChannelMembershipAPIs: true, + }, + appMetadata: appMetadata, + }; + } + + async handleValidate( + arg0: WebConnectionProtocol4ValidateAppIdentity, + sc: ServerContext, + from: InstanceID + ): Promise { + const responseMeta = { + connectionAttemptUuid: arg0.meta.connectionAttemptUuid, + timestamp: new Date(), + }; + + const returnError = () => { + const msg: WebConnectionProtocol5ValidateAppIdentityFailedResponse = { + meta: responseMeta, + type: 'WCP5ValidateAppIdentityFailedResponse', + payload: { + message: 'App Instance not found', + }, + }; + sc.post(msg, from); + }; + + const returnSuccess = (appId: string, instanceId: string) => { + const implMetadata: ImplementationMetadata = this.getImplementationMetadata(sc, { appId, instanceId }); + const msg: WebConnectionProtocol5ValidateAppIdentitySuccessResponse = { + meta: responseMeta, + type: 'WCP5ValidateAppIdentityResponse', + payload: { + appId: appId, + instanceId: instanceId, + instanceUuid: from, + implementationMetadata: implMetadata, + }, + }; + sc.post(msg, instanceId); + }; + + if (arg0.payload.instanceUuid) { + // existing app reconnecting + console.log('App attempting to reconnect:', arg0.payload.instanceUuid); + const appIdentity = sc.getInstanceDetails(arg0.payload.instanceUuid); + + if (appIdentity) { + // in this case, the app is reconnecting, so let's just re-assign the identity + console.log( + `Reassigned existing identity, appId: `, + appIdentity.appId, + ', instanceId', + arg0.payload.instanceUuid + ); + sc.setInstanceDetails(from, appIdentity); + sc.setAppState(from, State.Connected); + return returnSuccess(appIdentity.appId, appIdentity.instanceId); + } else { + //we didn't find the identity, assign a new one + console.log('Existing identity not found for, assigning a new one: ', arg0.payload.instanceUuid); + } + } + + // we need to assign an identity to this app - this should have been generated when it was launched + const appIdentity = sc.getInstanceDetails(from); + if (appIdentity) { + sc.setAppState(appIdentity.instanceId, State.Connected); + returnSuccess(appIdentity.appId, appIdentity.instanceId); + + // make sure, if the opener is listening for this app to open, then it gets informed + const pendingOpen = this.pending.get(from); + if (pendingOpen) { + if (pendingOpen.state == AppState.Opening) { + pendingOpen.setOpened(appIdentity); + } + } + } else { + returnError(); + } + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/support.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/support.ts new file mode 100644 index 000000000..3a0a31e64 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/handlers/support.ts @@ -0,0 +1,83 @@ +import { AgentResponseMessage, AppRequestMessage } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { AppRegistration, ServerContext } from '../ServerContext'; +import { AppIdentifier } from '@finos/fdc3-standard'; + +/** Interface representing a full specified app identifier (instanceId is optional in the API type). */ +export interface FullAppIdentifier { + readonly appId: string; + readonly instanceId: string; +} + +export function isFullAppIdentifier(identifier: AppIdentifier | FullAppIdentifier): identifier is FullAppIdentifier { + const typedIdentifier = identifier as FullAppIdentifier; + return typedIdentifier.instanceId !== undefined && typedIdentifier.appId !== undefined; +} + +export function successResponse( + sc: ServerContext, + request: AppRequestMessage, + to: FullAppIdentifier, + payload: AgentResponseMessage['payload'], + type: AgentResponseMessage['type'] +) { + return successResponseId(sc, request.meta.requestUuid, to, payload, type); +} + +export function errorResponse( + sc: ServerContext, + request: AppRequestMessage, + to: FullAppIdentifier, + error: string, + type: AgentResponseMessage['type'] +) { + return errorResponseId(sc, request.meta.requestUuid, to, error, type); +} + +export function successResponseId( + sc: ServerContext, + requestId: string, + to: FullAppIdentifier, + payload: AgentResponseMessage['payload'], + type: AgentResponseMessage['type'] +) { + const msg = { + meta: { + responseUuid: sc.createUUID(), + requestUuid: requestId, + timestamp: new Date(), + }, + type, + payload, + }; + sc.post(msg, to.instanceId!); +} + +export function errorResponseId( + sc: ServerContext, + requestId: string, + to: FullAppIdentifier, + error: string, + type: AgentResponseMessage['type'] +) { + sc.post( + { + meta: { + responseUuid: sc.createUUID(), + requestUuid: requestId, + timestamp: new Date(), + }, + type, + payload: { + error, + }, + } as AgentResponseMessage, + to.instanceId! + ); +} + +/* + * from: https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates#14438954 + */ +export function onlyUnique(value: X, index: number, self: X[]) { + return self.indexOf(value) === index; +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/src/index.ts b/toolbox/fdc3-for-web/fdc3-web-impl/src/index.ts new file mode 100644 index 000000000..1fef23ec3 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/src/index.ts @@ -0,0 +1,28 @@ +import { ServerContext, InstanceID, State, AppRegistration } from './ServerContext'; +import { BasicFDC3Server, DefaultFDC3Server } from './BasicFDC3Server'; +import { FDC3Server } from './FDC3Server'; +import { Directory, DirectoryApp, DirectoryIntent, WebAppDetails } from './directory/DirectoryInterface'; +import { BasicDirectory } from './directory/BasicDirectory'; +import { BroadcastHandler, ChannelState, ChannelType } from './handlers/BroadcastHandler'; +import { IntentHandler } from './handlers/IntentHandler'; +import { OpenHandler } from './handlers/OpenHandler'; + +export { + type InstanceID, + type ServerContext, + State, + type AppRegistration, + BasicFDC3Server, + DefaultFDC3Server, + type FDC3Server, + type Directory, + BasicDirectory, + type DirectoryApp, + type DirectoryIntent, + BroadcastHandler, + ChannelState, + IntentHandler, + OpenHandler, + ChannelType, + type WebAppDetails, +}; diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/apps.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/apps.feature new file mode 100644 index 000000000..e572c74d0 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/apps.feature @@ -0,0 +1,97 @@ +Feature: Opening and Requesting App Details + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + And "storageApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | loanBook | fdc3.book | fdc3.loan | + And A newly instantiated FDC3 Server + And "libraryApp/a1" is opened with connection id "a1" + + Scenario: Looking up app metadata + When "libraryApp/a1" requests metadata for "storageApp" + Then messaging will have outgoing posts + | msg.payload.appMetadata.appId | to.instanceId | msg.matches_type | + | storageApp | a1 | getAppMetadataResponse | + + Scenario: Looking up app metadata from missing app + When "libraryApp/a1" requests metadata for "unknownApp" + Then messaging will have outgoing posts + | msg.payload.error | to.instanceId | msg.type | + | TargetAppUnavailable | a1 | getAppMetadataResponse | + + Scenario: Looking up DesktopAgent metadata + When "libraryApp/a1" requests info on the DesktopAgent + Then messaging will have outgoing posts + | msg.payload.implementationMetadata.provider | to.instanceId | msg.matches_type | + | cucumber-provider | a1 | getInfoResponse | + + Scenario: Opening An App + When "libraryApp/a1" opens app "storageApp" + And "uuid-0" sends validate + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIdentifier.appId | msg.payload.appIdentifier.instanceId | msg.payload.appId | msg.payload.instanceId | to.instanceId | to.appId | + | WCP5ValidateAppIdentityResponse | {null} | {null} | storageApp | uuid-0 | uuid-0 | storageApp | + | openResponse | storageApp | uuid-0 | {null} | {null} | a1 | libraryApp | + + Scenario: Storage App Reconnects + When "libraryApp/a1" opens app "storageApp" + And "uuid-0" sends validate + And we wait for a period of "100" ms + And "uuid-0" revalidates + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIdentifier.appId | msg.payload.appIdentifier.instanceId | msg.payload.appId | msg.payload.instanceId | to.instanceId | to.appId | + | WCP5ValidateAppIdentityResponse | {null} | {null} | storageApp | uuid-0 | uuid-0 | storageApp | + | openResponse | storageApp | uuid-0 | {null} | {null} | a1 | libraryApp | + | WCP5ValidateAppIdentityResponse | {null} | {null} | storageApp | uuid-0 | uuid-0 | storageApp | + + Scenario: Opening An App With Context + When "libraryApp/a1" opens app "storageApp" with context data "fdc3.instrument" + And "uuid-0" sends validate + And we wait for a period of "100" ms + And "storageApp/uuid-0" adds a context listener on "{null}" with type "fdc3.instrument" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.channelId | msg.payload.context.type | to.instanceId | to.appId | + | WCP5ValidateAppIdentityResponse | {null} | {null} | uuid-0 | storageApp | + | addContextListenerResponse | {empty} | {empty} | uuid-0 | storageApp | + | openResponse | {empty} | {empty} | a1 | libraryApp | + | broadcastEvent | {null} | fdc3.instrument | uuid-0 | storageApp | + + Scenario: Opening An App With Context, But No Listener Added + When "libraryApp/a1" opens app "storageApp" with context data "fdc3.instrument" + And "uuid-0" sends validate + And we wait for the listener timeout + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | WCP5ValidateAppIdentityResponse | {null} | uuid-0 | storageApp | + | openResponse | AppTimeout | a1 | libraryApp | + + Scenario: Opening A Missing App + When "libraryApp/a1" opens app "missingApp" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | + | openResponse | AppNotFound | a1 | + + Scenario: Find Instances with No Apps Running + And "libraryApp/a1" findsInstances of "App1" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIdentifiers.length | to.instanceId | + | findInstancesResponse | 0 | a1 | + + Scenario: Find Instances with Some Apps Running + When "storageApp/b1" is opened with connection id "b1" + And "storageApp/b2" is opened with connection id "b2" + And "libraryApp/a1" findsInstances of "storageApp" + And we wait for a period of "100" ms + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIdentifiers.length | msg.payload.appIdentifiers[0].instanceId | msg.payload.appIdentifiers[1].instanceId | to.instanceId | msg.payload.appId | + | findInstancesResponse | 2 | b1 | b2 | a1 | {null} | + + Scenario: Unknown App Attempts Reconnect + When "uuid-0" revalidates + Then messaging will have outgoing posts + | msg.type | msg.payload.message | + | WCP5ValidateAppIdentityFailedResponse | App Instance not found | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/broadcast.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/broadcast.feature new file mode 100644 index 000000000..ac0f7c4c9 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/broadcast.feature @@ -0,0 +1,41 @@ +Feature: Relaying Broadcast messages + + Background: + Given schemas loaded + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "App2/a2" is opened with connection id "a2" + + Scenario: Broadcast message to no-one + When "App1/a1" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | + | broadcastResponse | + And messaging will have 1 posts + + Scenario: Broadcast message sent to one listener + When "App2/a2" adds a context listener on "one" with type "fdc3.instrument" + And we wait for a period of "100" ms + And "App1/a1" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.channelId | msg.payload.context.type | msg.payload.context.id.ticker | + | addContextListenerResponse | App2 | a2 | {null} | {null} | {null} | + | broadcastEvent | App2 | a2 | one | fdc3.instrument | AAPL | + | broadcastResponse | App1 | a1 | {null} | {null} | {null} | + + Scenario: Broadcast message sent but listener has unsubscribed + When "App2/a2" adds a context listener on "one" with type "fdc3.instrument" + And "App2/a2" removes context listener with id "uuid3" + And "App1/a1" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.listenerUUID | + | addContextListenerResponse | App2 | a2 | uuid3 | + | contextListenerUnsubscribeResponse | App2 | a2 | {null} | + | broadcastResponse | App1 | a1 | {null} | + + Scenario: Get The Latest Context From A Channel + Given "App1/a1" broadcasts "fdc3.instrument" on "one" + And "App1/a1" asks for the latest context on "one" with type "fdc3.instrument" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.context.id.ticker | msg.payload.context.type | + | getCurrentContextResponse | App1 | a1 | AAPL | fdc3.instrument | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/disconnect-cleanup.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/disconnect-cleanup.feature new file mode 100644 index 000000000..bdf245e19 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/disconnect-cleanup.feature @@ -0,0 +1,66 @@ +Feature: App Disconnection and Cleanup + + Background: + Given schemas loaded + + Scenario: Apps that disconnect and reconnect to the DA should receive one copy of a broadcast message from an app channel as state was cleaned up + Given A newly instantiated FDC3 Server + When "App1/a1" is opened with connection id "a1" + And "App2/a2" is opened with connection id "a2" + And "App2/a2" adds a context listener on "one" with type "fdc3.instrument" + And we wait for a period of "100" ms + And "App1/a1" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.channelId | msg.payload.context.type | msg.payload.context.id.ticker | + | addContextListenerResponse | App2 | a2 | {null} | {null} | {null} | + | broadcastEvent | App2 | a2 | one | fdc3.instrument | AAPL | + | broadcastResponse | App1 | a1 | {null} | {null} | {null} | + And "App2/a2" is closed + And "App2/a2" is opened with connection id "a2" + And "App2/a2" adds a context listener on "one" with type "fdc3.instrument" + And we wait for a period of "100" ms + And "App1/a1" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.channelId | msg.payload.context.type | msg.payload.context.id.ticker | + | addContextListenerResponse | App2 | a2 | {null} | {null} | {null} | + | broadcastEvent | App2 | a2 | one | fdc3.instrument | AAPL | + | broadcastResponse | App1 | a1 | {null} | {null} | {null} | + + + Scenario: Apps that disconnect and reconnect to the DA should NOT receive intent results from the previous connection as state was cleaned up + Given "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + And "App1" is an app with the following intents + | Intent Name | Context Type | Result Type | + | viewNews | fdc3.instrument | {empty} | + And A newly instantiated FDC3 Server + When "LibraryApp/l1" is opened with connection id "l1" + And "App1/a1" is opened with connection id "a1" + And "LibraryApp/l1" registers an intent listener for "returnBook" + And "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "LibraryApp/l1" with requestUuid "ABC123" + And we wait for a period of "100" ms + And "App1/a1" is closed + And we wait for a period of "100" ms + And "LibraryApp/l1" sends a intentResultRequest with eventUuid "uuid7" and contextType "fdc3.book" and raiseIntentUuid "ABC123" + Then messaging will have outgoing posts + | msg.matches_type | msg.meta.eventUuid | msg.meta.requestUuid | to.appId | to.instanceId | msg.payload.raiseIntentRequestUuid | msg.payload.intentResolution.source.instanceId | msg.payload.intentResult.context.type | + | intentEvent | uuid7 | {null} | LibraryApp | l1 | ABC123 | {null} | {null} | + | raiseIntentResponse | {null} | ABC123 | App1 | a1 | {null} | l1 | {null} | + | intentResultResponse | {null} | uuid10 | LibraryApp | l1 | {null} | {null} | {null} | + +Scenario: Disconnecting from the DA when subscribed to a private channel channel sends unsubscribe and disconnect messages + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "App2/a2" is opened with connection id "a2" + And "App2/a1" creates a private channel + #TODO: have a2 retrieve the private channel by raising an intent - its currently using a1 reference to the channel + And I refer to "uuid3" as "channel1Id" + When "App2/a2" adds an "disconnect" event listener on "{channel1Id}" + And "App1/a1" adds a context listener on "{channel1Id}" with type "fdc3.instrument" + And "App2/a2" adds an "unsubscribe" event listener on "{channel1Id}" + And "App1/a1" is closed + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.privateChannelId | msg.payload.contextType | to.appId | to.instanceId | + | privateChannelOnUnsubscribeEvent | {channel1Id} | fdc3.instrument | App2 | a2 | + | privateChannelOnDisconnectEvent | {channel1Id} | {null} | App2 | a2 | \ No newline at end of file diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/find-intent.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/find-intent.feature new file mode 100644 index 000000000..0eda1465f --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/find-intent.feature @@ -0,0 +1,122 @@ +Feature: Find Intent API + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | loanBook | fdc3.book | fdc3.loan | + | streamBook | fdc3.book | channel | + | returnBook | fdc3.book | {empty} | + | streamAny | fdc3.book | channel | + And "bakeryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | viewStock | fdc3.product | {empty} | + And "butcherApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | viewStock | fdc3.product | {empty} | + And "chandlerApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | viewStock | fdc3.product | {empty} | + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "App1/b1" is opened with connection id "b1" + And "App1/b1" registers an intent listener for "returnBook" + And "butcherApp/b2" is opened with connection id "b2" + And "butcherApp/b2" registers an intent listener for "viewStock" + #first app returned by directory must have an instance to cover all branches in findIntentsByContextRequest + And "bakeryApp/b3" is opened with connection id "b3" + And "bakeryApp/b3" registers an intent listener for "viewStock" + And we wait for a period of "100" ms + + Scenario: Unsuccessful Find Intents Request + When "App1/a1" finds intents with intent "loanBook" and contextType "fdc3.instrument" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | + | findIntentResponse | loanBook | 0 | a1 | + + Scenario: Unsuccessful Find Intents Request With Result Type + When "App1/a1" finds intents with intent "loanBook" and contextType "{empty}" and result type "unknownContext" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | + | findIntentResponse | loanBook | 0 | a1 | + + Scenario: Successful Find Intents Request + When "App1/a1" finds intents with intent "loanBook" and contextType "{empty}" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | msg.payload.appIntent.apps[0].appId | to.instanceId | msg.payload.appIntent.intent.displayName | + | findIntentResponse | loanBook | 1 | libraryApp | a1 | loan book | + + Scenario: Find Intents Requests should include both the app and running instances of it + When "App1/a1" finds intents with intent "viewStock" and contextType "fdc3.product" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | + | findIntentResponse | viewStock | 5 | a1 | + When "butcherApp/b2" is closed + And "App1/a1" finds intents with intent "viewStock" and contextType "fdc3.product" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | + | findIntentResponse | viewStock | 4 | a1 | + + Scenario: Find Intents by Context Request + When "App/a1" finds intents with contextType "fdc3.book" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntents[0].intent.name | msg.payload.appIntents.length | to.instanceId | msg.payload.appIntents[0].intent.displayName | + | findIntentsByContextResponse | loanBook | 4 | a1 | loan book | + + Scenario: Find Intents by Context Request with multiple results + When "App/a1" finds intents with contextType "fdc3.product" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntents[0].intent.name | msg.payload.appIntents.length | to.instanceId | msg.payload.appIntents[0].apps.length | + | findIntentsByContextResponse | viewStock | 1 | a1 | 5 | + + Scenario: Find Intents by Context Request with multiple results which should not include an instance that has closed + When "butcherApp/b2" is closed + When "App/a1" finds intents with contextType "fdc3.product" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntents[0].intent.name | msg.payload.appIntents.length | to.instanceId | msg.payload.appIntents[0].apps.length | + | findIntentsByContextResponse | viewStock | 1 | a1 | 4 | + + Scenario: Successful Find Intents Request With Channel + When "App1/a1" finds intents with intent "streamBook" and contextType "fdc3.book" and result type "channel" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | msg.payload.appIntent.apps[0].appId | to.instanceId | + | findIntentResponse | streamBook | 1 | libraryApp | a1 | + + Scenario: Successful Find Intents Request With A Typed Channel + When "App1/a1" finds intents with intent "streamBook" and contextType "{empty}" and result type "channel" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | msg.payload.appIntent.apps[0].appId | to.instanceId | + | findIntentResponse | streamBook | 1 | libraryApp | a1 | + + Scenario: Unsuccessful Find Intents Request With an untyped Channel + When "App1/a1" finds intents with intent "streamAny" and contextType "{empty}" and result type "channel" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | + | findIntentResponse | streamAny | 0 | + + Scenario: Find Intent includes results for a running app with intent listener + When "App1/a1" finds intents with intent "returnBook" and contextType "fdc3.book" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | + | findIntentResponse | returnBook | 2 | a1 | + And messaging will have outgoing posts + | msg.payload.appIntent.apps[1].appId | msg.payload.appIntent.apps[1].instanceId | + | App1 | b1 | + And messaging will have outgoing posts + | msg.payload.appIntent.apps[0].appId | msg.payload.appIntent.apps[0].instanceId | + | libraryApp | {empty} | + + Scenario: Disconnecting The Intent Listener + When "App1/b1" unsubscribes an intent listener with id "uuid3" + And "App1/a1" finds intents with intent "returnBook" and contextType "fdc3.book" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | msg.payload.appIntent.apps[0].appId | + | intentListenerUnsubscribeResponse | {null} | {null} | b1 | {null} | + | findIntentResponse | returnBook | 1 | a1 | libraryApp | + + Scenario: Find Intent excludes results for a closed app with intent listener + When "App1/b1" is closed + And "App1/a1" finds intents with intent "returnBook" and contextType "fdc3.book" and result type "{empty}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.appIntent.intent.name | msg.payload.appIntent.apps.length | to.instanceId | msg.payload.appIntent.apps[0].appId | + | findIntentResponse | returnBook | 1 | a1 | libraryApp | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/heartbeat.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/heartbeat.feature new file mode 100644 index 000000000..bfff6d02d --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/heartbeat.feature @@ -0,0 +1,65 @@ +Feature: Heartbeat Messages Between Apps and Server + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + And A newly instantiated FDC3 Server with heartbeat checking + + Scenario: App Responds to heartbeats + When "libraryApp/a1" is opened with connection id "a1" + And "a1" sends validate + And we wait for a period of "500" ms + And "libraryApp/a1" sends a heartbeat response to eventUuid "a1_1" + And we wait for a period of "500" ms + And "libraryApp/a1" sends a heartbeat response to eventUuid "a1_2" + And we wait for a period of "500" ms + And "libraryApp/a1" sends a heartbeat response to eventUuid "a1_3" + And we wait for a period of "500" ms + And "libraryApp/a1" sends a heartbeat response to eventUuid "a1_4" + And we wait for a period of "500" ms + And "libraryApp/a1" sends a heartbeat response to eventUuid "a1_5" + And we wait for a period of "500" ms + Then I test the liveness of "libraryApp/a1" + Then "{result}" is true + And messaging will have outgoing posts + | msg.matches_type | to.instanceId | to.appId | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + And I shutdown the server + And I get the heartbeat times + Then "{result}" is an array of objects with the following contents + | instanceId | state | + | a1 | Connected | + + Scenario: App Doesn't Respond to heartbeats + Apps are considered dead if they don't respond to a heartbeat request within 2 seconds + + When "libraryApp/a1" is opened with connection id "a1" + And "a1" sends validate + And we wait for a period of "3000" ms + Then I test the liveness of "libraryApp/a1" + Then "{result}" is false + And messaging will have outgoing posts + | msg.matches_type | to.instanceId | to.appId | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + | heartbeatEvent | a1 | libraryApp | + And I shutdown the server + And I get the heartbeat times + Then "{result}" is empty + + Scenario: App says Goodbye + When "libraryApp/a1" is opened with connection id "a1" + And "a1" sends validate + And we wait for a period of "500" ms + And "libraryApp/a1" sends a goodbye message + Then I test the liveness of "libraryApp/a1" + Then "{result}" is false + And I shutdown the server diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/intent-result.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/intent-result.feature new file mode 100644 index 000000000..6ec6aebd8 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/intent-result.feature @@ -0,0 +1,55 @@ +Feature: Intent Results Are Correctly Delivered + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + And "App1" is an app with the following intents + | Intent Name | Context Type | Result Type | + | viewNews | fdc3.instrument | {empty} | + And A newly instantiated FDC3 Server + And "LibraryApp/l1" is opened with connection id "l1" + And "App1/a1" is opened with connection id "a1" + And "LibraryApp/l1" registers an intent listener for "returnBook" + + Scenario: Waiting for an intent listener to be Added + When "LibraryApp/l1" raises an intent for "viewNews" with contextType "fdc3.instrument" on app "App1/a1" with requestUuid "ABC123" + And "App1/a1" registers an intent listener for "viewNews" + And "App1/a1" sends a intentResultRequest with eventUuid "uuid10" and void contents and raiseIntentUuid "ABC123" + Then messaging will have outgoing posts + | msg.matches_type | msg.meta.eventUuid | to.appId | to.instanceId | msg.payload.raiseIntentRequestUuid | msg.payload.intentResolution.source.instanceId | msg.payload.intentResult.context.type | + | intentEvent | uuid10 | App1 | a1 | ABC123 | {null} | {null} | + | raiseIntentResponse | {null} | LibraryApp | l1 | {null} | a1 | {null} | + | raiseIntentResultResponse | {null} | LibraryApp | l1 | {null} | {null} | {null} | + | intentResultResponse | {null} | App1 | a1 | {null} | {null} | {null} | + + Scenario: App Returns An Intent Response + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "LibraryApp/l1" with requestUuid "ABC123" + When "LibraryApp/l1" sends a intentResultRequest with eventUuid "uuid7" and contextType "fdc3.book" and raiseIntentUuid "ABC123" + Then messaging will have outgoing posts + | msg.matches_type | msg.meta.eventUuid | msg.meta.requestUuid | to.appId | to.instanceId | msg.payload.raiseIntentRequestUuid | msg.payload.intentResolution.source.instanceId | msg.payload.intentResult.context.type | + | intentEvent | uuid7 | {null} | LibraryApp | l1 | ABC123 | {null} | {null} | + | raiseIntentResponse | {null} | ABC123 | App1 | a1 | {null} | l1 | {null} | + | raiseIntentResultResponse | {null} | ABC123 | App1 | a1 | {null} | {null} | fdc3.book | + | intentResultResponse | {null} | uuid9 | LibraryApp | l1 | {null} | {null} | {null} | + + Scenario: App Returns An Intent Result + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "LibraryApp/l1" with requestUuid "ABC123" + When "LibraryApp/l1" sends a intentResultRequest with eventUuid "uuid7" and private channel "pc1" and raiseIntentUuid "ABC123" + Then messaging will have outgoing posts + | msg.matches_type | msg.meta.eventUuid | to.appId | to.instanceId | msg.payload.raiseIntentRequestUuid | msg.payload.intentResolution.source.instanceId | msg.payload.intentResult.channel.id | + | intentEvent | uuid7 | LibraryApp | l1 | ABC123 | {null} | {null} | + | raiseIntentResponse | {null} | App1 | a1 | {null} | l1 | {null} | + | raiseIntentResultResponse | {null} | App1 | a1 | {null} | {null} | pc1 | + | intentResultResponse | {null} | LibraryApp | l1 | {null} | {null} | {null} | + + Scenario: App Returns A Void Intent Result + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "LibraryApp/l1" with requestUuid "ABC123" + When "LibraryApp/l1" sends a intentResultRequest with eventUuid "uuid7" and void contents and raiseIntentUuid "ABC123" + Then messaging will have outgoing posts + | msg.matches_type | msg.meta.eventUuid | to.appId | to.instanceId | msg.payload.raiseIntentRequestUuid | msg.payload.intentResolution.source.instanceId | msg.payload.intentResult.context.type | + | intentEvent | uuid7 | LibraryApp | l1 | ABC123 | {null} | {null} | + | raiseIntentResponse | {null} | App1 | a1 | {null} | l1 | {null} | + | raiseIntentResultResponse | {null} | App1 | a1 | {null} | {null} | {null} | + | intentResultResponse | {null} | LibraryApp | l1 | {null} | {null} | {null} | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/private-channel.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/private-channel.feature new file mode 100644 index 000000000..779c6cf5d --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/private-channel.feature @@ -0,0 +1,98 @@ +Feature: Relaying Private Channel Broadcast messages + + Background: + Given schemas loaded + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "App2/a2" is opened with connection id "a2" + And "App2/a1" creates a private channel + #TODO: have a2 retrieve the private channel by raising an intent - its currently using a1 reference to the channel + And I refer to "uuid3" as "channel1Id" + + Scenario: Creating a new private channel + When "App2/a1" creates a private channel + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.privateChannel.id | msg.payload.privateChannel.type | to.appId | to.instanceId | + | createPrivateChannelResponse | uuid6 | private | App2 | a1 | + + Scenario: Broadcast message to no-one + When "App1/a1" broadcasts "fdc3.instrument" on "{channel1Id}" + Then messaging will have outgoing posts + | msg.matches_type | + | broadcastResponse | + + Scenario: Broadcast message sent to one listener + When "App2/a2" adds a context listener on "{channel1Id}" with type "fdc3.instrument" + And "App1/a1" broadcasts "fdc3.instrument" on "{channel1Id}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.channelId | msg.payload.context.id.ticker | msg.payload.context.type | to.appId | to.instanceId | + | addContextListenerResponse | {null} | {null} | {null} | App2 | a2 | + | broadcastEvent | {channel1Id} | AAPL | fdc3.instrument | App2 | a2 | + | broadcastResponse | {null} | {null} | {null} | App1 | a1 | + + Scenario: Event Listener created for addContextListener and unsubscribe + When "App2/a2" adds an "addContextListener" event listener on "{channel1Id}" + And "App2/a2" adds an "unsubscribe" event listener on "{channel1Id}" + And "App1/a1" adds a context listener on "{channel1Id}" with type "fdc3.instrument" + And we wait for a period of "10" ms + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.privateChannelId | msg.payload.contextType | msg.payload.listenerUUID | + | privateChannelAddEventListenerResponse | App2 | a2 | {null} | {null} | uuid6 | + | privateChannelAddEventListenerResponse | App2 | a2 | {null} | {null} | uuid9 | + | privateChannelOnAddContextListenerEvent | App2 | a2 | {channel1Id} | fdc3.instrument | {null} | + | addContextListenerResponse | App1 | a1 | {null} | {null} | uuid12 | + And "App1/a1" removes context listener with id "uuid12" + Then messaging will have outgoing posts + | msg.type | msg.payload.privateChannelId | msg.payload.contextType | to.appId | to.instanceId | + | privateChannelOnUnsubscribeEvent | {channel1Id} | fdc3.instrument | App2 | a2 | + | contextListenerUnsubscribeResponse | {null} | {null} | App1 | a1 | + + Scenario: Disconnecting from a channel sends unsubscribe and disconnect messages + When "App2/a2" adds an "disconnect" event listener on "{channel1Id}" + And "App1/a1" adds a context listener on "{channel1Id}" with type "fdc3.instrument" + And "App2/a2" adds an "unsubscribe" event listener on "{channel1Id}" + And "App1/a1" disconnects from private channel "{channel1Id}" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.privateChannelId | msg.payload.contextType | to.appId | to.instanceId | + | privateChannelOnUnsubscribeEvent | {channel1Id} | fdc3.instrument | App2 | a2 | + | privateChannelOnDisconnectEvent | {channel1Id} | {null} | App2 | a2 | + | privateChannelDisconnectResponse | {null} | {null} | App1 | a1 | + + Scenario: addContextListener Event Listener add and removed, shouldn't fire when addContextListener called. + When "App2/a2" adds an "addContextListener" event listener on "{channel1Id}" + And "App2/a2" removes event listener "uuid6" + And "App1/a1" adds a context listener on "{channel1Id}" with type "fdc3.instrument" + Then messaging will have outgoing posts + | msg.matches_type | to.appId | to.instanceId | msg.payload.privateChannelId | msg.payload.contextType | msg.payload.listenerUUID | + | privateChannelAddEventListenerResponse | App2 | a2 | {null} | {null} | uuid6 | + | privateChannelUnsubscribeEventListenerResponse | App2 | a2 | {null} | {null} | {null} | + | addContextListenerResponse | App1 | a1 | {null} | {null} | uuid11 | + + Scenario: I can't register an app channel with the same ID as a private channel + When "App2/a2" creates or gets an app channel called "{channel1Id}" + Then messaging will have outgoing posts + | msg.type | to.appId | to.instanceId | msg.payload.error | + | getOrCreateChannelResponse | App2 | a2 | AccessDenied | + + Scenario: Subscribe to a non-existent channel + When "App2/a2" adds a context listener on "IDontExist" with type "fdc3.instrument" + Then messaging will have outgoing posts + | msg.type | to.appId | to.instanceId | msg.payload.error | + | addContextListenerResponse | App2 | a2 | NoChannelFound | + + Scenario: Can't unsubscribe an unconnected listener + When "App2/a2" adds a context listener on "{channelId}" with type "fdc3.instrument" + And "App2/a2" removes context listener with id "uuid6" + And "App2/a2" removes context listener with id "uuid6" + Then messaging will have outgoing posts + | msg.type | to.appId | to.instanceId | msg.payload.error | + | contextListenerUnsubscribeResponse | App2 | a2 | {null} | + | contextListenerUnsubscribeResponse | App2 | a2 | ListenerNotFound | + + Scenario: Can't unsubscribe an someone else's listener + When "App2/a2" adds a context listener on "{channelId}" with type "fdc3.instrument" + And "App1/a1" removes context listener with id "uuid6" + Then messaging will have outgoing posts + | msg.type | to.appId | to.instanceId | msg.payload.error | + | addContextListenerResponse | App2 | a2 | {null} | + | contextListenerUnsubscribeResponse | App1 | a1 | ListenerNotFound | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent-with-context.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent-with-context.feature new file mode 100644 index 000000000..908b2cdb6 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent-with-context.feature @@ -0,0 +1,85 @@ +Feature: Raising Intents For Context + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + | borrowBook | fdc3.book | {empty} | + | borrowMagazine | fdc3.magazine | {empty} | + And "listenerApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | borrowBook | fdc3.book | {empty} | + And "unusedApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "listenerApp/b1" is opened with connection id "b1" + And "listenerApp/b1" registers an intent listener for "returnBook" + + Scenario: Raising an Intent With Context to a Non-Existent App + And "App1/a1" raises an intent with contextType "fdc3.magazine" on app "completelyMadeUp" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentForContextResponse | TargetAppUnavailable | a1 | App1 | + + Scenario: Raising An Intent With Context To A Non-Existent App Instance + When "App1/a1" raises an intent with contextType "fdc3.book" on app "libraryApp/unknownInstance" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | + | raiseIntentForContextResponse | TargetInstanceUnavailable | a1 | + +Scenario: Raising An Intent With Context To An Invalid Instance + When "App1/a1" raises an intent with contextType "fdc3.book" on an invalid app instance + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | + | raiseIntentForContextResponse | TargetAppUnavailable | a1 | + + Scenario: Raising An Intent With Context To A Running App + When "App1/a1" raises an intent with contextType "fdc3.book" on app "listenerApp/b1" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.context.type | msg.payload.intent | msg.payload.originatingApp.appId | msg.payload.originatingApp.instanceId | msg.payload.intentResolution.intent | to.instanceId | to.appId | msg.payload.intentResolution.source.appId | + | intentEvent | fdc3.book | returnBook | App1 | a1 | {null} | b1 | listenerApp | {null} | + | raiseIntentForContextResponse | {null} | {null} | {null} | {null} | returnBook | a1 | App1 | listenerApp | + + Scenario: Raising An Intent With Context To A Non-Running App + When "App1/a1" raises an intent with contextType "fdc3.magazine" on app "libraryApp" + And "uuid-0" sends validate + And "libraryApp/0" registers an intent listener for "borrowMagazine" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.intent | to.instanceId | to.appId | msg.payload.context.type | + | addIntentListenerResponse | {null} | 0 | libraryApp | {null} | + | intentEvent | borrowMagazine | 0 | libraryApp | fdc3.magazine | + | raiseIntentForContextResponse | {null} | a1 | App1 | {null} | + + Scenario: Raising an Intent With Context to a Non-Existent App Instance + And "App1/a1" raises an intent with contextType "fdc3.book" on app "unusedApp/u1" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentForContextResponse | TargetInstanceUnavailable | a1 | App1 | + + Scenario: Raising An Intent With Context To A Broken App that doesn't add an intent listener + When "App1/a1" raises an intent with contextType "fdc3.magazine" on app "libraryApp" + And "uuid-0" sends validate + And we wait for the intent timeout + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentForContextResponse | IntentDeliveryFailed | a1 | App1 | + + Scenario: User Must Choose An Intent using The Intent Resolver + When "App1/a1" raises an intent with contextType "fdc3.book" + Then messaging will have outgoing posts + | msg.type | msg.payload.appIntents[0].intent.name | msg.payload.appIntents[1].intent.name | to.instanceId | to.appId | + | raiseIntentForContextResponse | returnBook | borrowBook | a1 | App1 | + Then messaging will have outgoing posts + | msg.payload.appIntents[0].apps[0].appId | msg.payload.appIntent.apps[0].instanceId | + | libraryApp | {null} | + Then messaging will have outgoing posts + | msg.payload.appIntents[1].apps[0].appId | msg.payload.appIntents[1].apps[0].instanceId | + | listenerApp | b1 | + Then messaging will have outgoing posts + | msg.payload.appIntents[1].apps[1].appId | msg.payload.appIntents[1].apps[1].instanceId | + | libraryApp | {null} | + Then messaging will have outgoing posts + | msg.payload.appIntents[1].apps[2].appId | msg.payload.appIntents[1].apps[2].instanceId | + | listenerApp | {null} | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent.feature new file mode 100644 index 000000000..c287be31e --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/raise-intent.feature @@ -0,0 +1,153 @@ +Feature: Raising Intents + + Background: + Given schemas loaded + And "libraryApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | returnBook | fdc3.book | {empty} | + | borrowBook | fdc3.book | {empty} | + And "listenerApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | borrowBook | fdc3.book | {empty} | + And "uniqueIntentApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + | uniqueIntent | fdc3.magazine | {empty} | + And "unusedApp" is an app with the following intents + | Intent Name | Context Type | Result Type | + And A newly instantiated FDC3 Server + And "uniqueIntentApp/c1" is opened with connection id "c1" + And "uniqueIntentApp/c1" registers an intent listener for "uniqueIntent" + And "App1/a1" is opened with connection id "a1" + And "listenerApp/b1" is opened with connection id "b1" + And "listenerApp/b1" registers an intent listener for "returnBook" + + Scenario: Context Not Handled By App + When "App1/a1" raises an intent for "borrowBook" with contextType "fdc3.magazine" on app "listenerApp/b1" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | + | raiseIntentResponse | NoAppsFound | a1 | + + Scenario: Raising an Intent that should auto-resolve (only one option) + And "App1/a1" raises an intent for "uniqueIntent" with contextType "fdc3.magazine" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.context.type | msg.payload.intent | msg.payload.originatingApp.appId | msg.payload.originatingApp.instanceId | msg.payload.intentResolution.intent | to.instanceId | to.appId | msg.payload.intentResolution.source.appId | + | intentEvent | fdc3.magazine | uniqueIntent | App1 | a1 | {null} | c1 | uniqueIntentApp | {null} | + | raiseIntentResponse | {null} | {null} | {null} | {null} | uniqueIntent | a1 | App1 | uniqueIntentApp | + + Scenario: Raising an Intent to a Non-Existent App + And "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "completelyMadeUp" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentResponse | TargetAppUnavailable | a1 | App1 | + + Scenario: Raising An Intent To A Non-Existent App Instance + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "libraryApp/unknownInstance" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | + | raiseIntentResponse | TargetInstanceUnavailable | a1 | + + Scenario: Raising An Intent To A Running App instance by instanceId + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "listenerApp/b1" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.context.type | msg.payload.intent | msg.payload.originatingApp.appId | msg.payload.originatingApp.instanceId | msg.payload.intentResolution.intent | to.instanceId | to.appId | msg.payload.intentResolution.source.appId | + | intentEvent | fdc3.book | returnBook | App1 | a1 | {null} | b1 | listenerApp | {null} | + | raiseIntentResponse | {null} | {null} | {null} | {null} | returnBook | a1 | App1 | listenerApp | + +Scenario: Raising An Intent To A Running App instance by appId + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "listenerApp" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.context.type | msg.payload.intent | msg.payload.originatingApp.appId | msg.payload.originatingApp.instanceId | msg.payload.intentResolution.intent | to.instanceId | to.appId | msg.payload.intentResolution.source.appId | + | intentEvent | fdc3.book | returnBook | App1 | a1 | {null} | b1 | listenerApp | {null} | + | raiseIntentResponse | {null} | {null} | {null} | {null} | returnBook | a1 | App1 | listenerApp | + + + Scenario: Raising An Intent To A Non-Running App + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "libraryApp" + And "uuid-0" sends validate + And "libraryApp/0" registers an intent listener for "returnBook" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.intent | to.instanceId | to.appId | msg.payload.context.type | + | addIntentListenerResponse | {null} | 0 | libraryApp | {null} | + | intentEvent | returnBook | 0 | libraryApp | fdc3.book | + | raiseIntentResponse | {null} | a1 | App1 | {null} | + + Scenario: Raising an Intent to a Non-Existent App Instance + And "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "unusedApp/u1" + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentResponse | TargetInstanceUnavailable | a1 | App1 | + + Scenario: Raising an Intent to an invalid App Instance + And "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on an invalid app instance + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentResponse | TargetAppUnavailable | a1 | App1 | + + Scenario: Raising An Intent To A Non-Running App without A Context Type in the listener + When "App1/a1" raises an intent for "stampBook" with contextType "fdc3.book" on app "libraryApp" + And "uuid-0" sends validate + And "libraryApp/uuid-0" registers an intent listener for "stampBook" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.intent | to.instanceId | to.appId | msg.payload.context.type | + | addIntentListenerResponse | {null} | uuid-0 | libraryApp | {null} | + | intentEvent | stampBook | uuid-0 | libraryApp | fdc3.book | + | raiseIntentResponse | {null} | a1 | App1 | {null} | + And running apps will be + | appId | instanceId | + | uniqueIntentApp | c1 | + | listenerApp | b1 | + | App1 | a1 | + | libraryApp | uuid-0 | + + Scenario: Raising An Intent To A Broken App that doesn't add an intent listener + When "App1/a1" raises an intent for "returnBook" with contextType "fdc3.book" on app "libraryApp" + And "uuid-0" sends validate + And we wait for the intent timeout + Then running apps will be + | appId | instanceId | + | uniqueIntentApp | c1 | + | listenerApp | b1 | + | App1 | a1 | + | libraryApp | uuid-0 | + Then messaging will have outgoing posts + | msg.type | msg.payload.error | to.instanceId | to.appId | + | raiseIntentResponse | IntentDeliveryFailed | a1 | App1 | + + Scenario: User Must Choose An Intent using The Intent Resolver + When "App1/a1" raises an intent for "borrowBook" with contextType "fdc3.book" + Then messaging will have outgoing posts + | msg.type | msg.payload.appIntent.intent.name | msg.payload.appIntent.intent.displayName | to.instanceId | to.appId | + | raiseIntentResponse | borrowBook | borrowBook | a1 | App1 | + Then messaging will have outgoing posts + | msg.payload.appIntent.apps[0].appId | msg.payload.appIntent.apps[0].instanceId | + | listenerApp | b1 | + Then messaging will have outgoing posts + | msg.payload.appIntent.apps[1].appId | msg.payload.appIntent.apps[1].instanceId | + | libraryApp | {null} | + Then messaging will have outgoing posts + | msg.payload.appIntent.apps[2].appId | msg.payload.appIntent.apps[2].instanceId | + | listenerApp | {null} | + + Scenario: Raising An Invalid Intent to the server (no instance) + When "App1/a1" raises an intent for "borrowBook" with contextType "fdc3.book" on app "listenerApp/z1" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | TargetInstanceUnavailable | raiseIntentResponse | + + Scenario: Raising An Invalid Intent (no app) + When "App1/a1" raises an intent for "borrowBook" with contextType "fdc3.book" on app "nonExistentApp" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | TargetAppUnavailable | raiseIntentResponse | + + Scenario: Raising An Invalid Intent (non existent intent) + When "App1/a1" raises an intent for "nonExistentIntent" with contextType "fdc3.book" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | NoAppsFound | raiseIntentResponse | + + Scenario: Raising An Invalid Intent (non existent intent but valid app) + When "App1/a1" raises an intent for "nonExistentIntent" with contextType "fdc3.book" on app "listenerApp/b1" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | NoAppsFound | raiseIntentResponse | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/features/user-channels.feature b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/user-channels.feature new file mode 100644 index 000000000..3df2073fa --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/features/user-channels.feature @@ -0,0 +1,134 @@ +Feature: Relaying Private Channel Broadcast messages + + Background: + This creates user channels "one", "two" and "three" + + Given schemas loaded + And A newly instantiated FDC3 Server + And "App1/a1" is opened with connection id "a1" + And "App2/a2" is opened with connection id "a2" + + Scenario: List User Channels + When "App1/a1" gets the list of user channels + Then messaging will have outgoing posts + | msg.payload.userChannels[0].id | msg.payload.userChannels[1].id | msg.payload.userChannels[2].id | msg.payload.userChannels[0].type | to.instanceId | msg.matches_type | + | one | two | three | user | a1 | getUserChannelsResponse | + + Scenario: Initial User Channel + At startup, the user channel shouldn't be set + + When "App1/a1" gets the current user channel + Then messaging will have outgoing posts + | msg.payload.channel.id | to.instanceId | msg.matches_type | + | {null} | a1 | getCurrentChannelResponse | + + Scenario: Changing Channel + You should be able to join a channel knowing it's ID. + + When "App/a1" joins user channel "one" + And "App1/a1" gets the current user channel + Then messaging will have outgoing posts + | msg.payload.channel.id | to.instanceId | msg.matches_type | + | {null} | a1 | joinUserChannelResponse | + | one | a1 | getCurrentChannelResponse | + + Scenario: Adding a Typed Listener on a given User Channel + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "fdc3.instrument" + And "App2/a2" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.payload.channelId | msg.payload.context.type | msg.matches_type | to.instanceId | + | one | fdc3.instrument | broadcastEvent | a1 | + | {null} | {null} | broadcastResponse | a2 | + + Scenario: Adding an Un-Typed Listener on a given User Channel + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "{null}" + And "App2/a2" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.payload.channelId | msg.payload.context.type | msg.matches_type | to.instanceId | + | one | fdc3.instrument | broadcastEvent | a1 | + | {null} | {null} | broadcastResponse | a2 | + + Scenario: If you haven't joined a channel, your listener receives nothing + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "{null}" + And "App2/a2" broadcasts "fdc3.instrument" on "two" + Then messaging will have outgoing posts + | msg.matches_type | to.instanceId | + | joinUserChannelResponse | a1 | + | addContextListenerResponse | a1 | + | broadcastResponse | a2 | + + Scenario: After unsubscribing, my listener shouldn't receive any more messages + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "{null}" + And "App/a1" removes context listener with id "uuid5" + And "App2/a2" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | msg.payload.listenerUUID | + | joinUserChannelResponse | {null} | + | addContextListenerResponse | uuid5 | + | contextListenerUnsubscribeResponse | {null} | + | broadcastResponse | {null} | + + Scenario: I should be able to leave a user channel, and not receive messages on it + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "{null}" + And "App/a1" leaves the current user channel + And "App2/a2" broadcasts "fdc3.instrument" on "one" + Then messaging will have outgoing posts + | msg.matches_type | + | joinUserChannelResponse | + | addContextListenerResponse | + | leaveCurrentChannelResponse | + | broadcastResponse | + + Scenario: Joining a user channel that doesn't exist throws an error + When "App/a1" joins user channel "four" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | NoChannelFound | joinUserChannelResponse | + + Scenario: Joining an app channel throws an error + When "App/a2" creates or gets an app channel called "bizboz" + When "App/a1" joins user channel "bizboz" + Then messaging will have outgoing posts + | msg.payload.error | msg.type | + | NoChannelFound | joinUserChannelResponse | + + Scenario: You can get the details of the last context type sent + When "App/a1" joins user channel "one" + And "App2/a2" broadcasts "fdc3.instrument" on "one" + And "App2/a2" broadcasts "fdc3.country" on "one" + And "App/a1" gets the latest context on "one" with type "fdc3.instrument" + And "App/a1" gets the latest context on "one" with type "fdc3.country" + And "App/a1" gets the latest context on "one" with type "{null}" + And "App/a1" gets the latest context on "one" with type "fdc3.sausage" + Then messaging will have outgoing posts + | msg.payload.context.type | msg.payload.context.name | msg.matches_type | + | fdc3.instrument | Apple | getCurrentContextResponse | + | fdc3.country | Sweden | getCurrentContextResponse | + | fdc3.country | Sweden | getCurrentContextResponse | + | {null} | {null} | getCurrentContextResponse | + + Scenario: Changing channel changes the listener channels too + When "App/a1" joins user channel "one" + And "App/a1" adds a context listener on "one" with type "{null}" + And "App/a1" joins user channel "two" + And "App2/a2" broadcasts "fdc3.instrument" on "two" + And "App2/a2" broadcasts "fdc3.country" on "one" + Then messaging will have outgoing posts + | msg.payload.channelId | msg.payload.context.type | msg.matches_type | + | two | fdc3.instrument | broadcastEvent | + | {null} | {null} | broadcastResponse | + | {null} | {null} | broadcastResponse | + + Scenario: You can get the details of the last context type when none is set + When "App/a1" joins user channel "one" + And "App/a1" gets the latest context on "one" with type "fdc3.instrument" + And "App/a1" gets the latest context on "one" with type "{null}" + Then messaging will have outgoing posts + | msg.payload.context.type | msg.payload.context.name | msg.matches_type | + | {null} | {null} | getCurrentContextResponse | + | {null} | {null} | getCurrentContextResponse | diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/app-channel.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/app-channel.steps.ts new file mode 100644 index 000000000..94218223b --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/app-channel.steps.ts @@ -0,0 +1,23 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { createMeta } from './generic.steps'; +import { handleResolve } from '@finos/testing'; +import { BrowserTypes } from '@finos/fdc3-schema'; +type GetOrCreateChannelRequest = BrowserTypes.GetOrCreateChannelRequest; + +When( + '{string} creates or gets an app channel called {string}', + function (this: CustomWorld, app: string, channel: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + channelId: handleResolve(channel, this), + }, + type: 'getOrCreateChannelRequest', + } as GetOrCreateChannelRequest; + + this.server.receive(message, uuid); + } +); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/broadcast.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/broadcast.steps.ts new file mode 100644 index 000000000..725da2fc7 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/broadcast.steps.ts @@ -0,0 +1,82 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { createMeta } from './generic.steps'; +import { } from '@finos/fdc3-standard'; +import { handleResolve } from '@finos/testing'; +import { contextMap } from './generic.steps'; +import { BrowserTypes } from '@finos/fdc3-schema'; + +type AddContextListenerRequest = BrowserTypes.AddContextListenerRequest; +type ContextListenerUnsubscribeRequest = BrowserTypes.ContextListenerUnsubscribeRequest; +type BroadcastRequest = BrowserTypes.BroadcastRequest; +type GetCurrentContextRequest = BrowserTypes.GetCurrentContextRequest; + +When( + '{string} adds a context listener on {string} with type {string}', + function (this: CustomWorld, app: string, channelId: string, contextType: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + channelId: handleResolve(channelId, this), + contextType: handleResolve(contextType, this), + }, + type: 'addContextListenerRequest', + } as AddContextListenerRequest; + + this.server.receive(message, uuid); + } +); + +When( + '{string} asks for the latest context on {string} with type {string}', + function (this: CustomWorld, app: string, channelId: string, contextType: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + channelId: handleResolve(channelId, this), + contextType, + }, + type: 'getCurrentContextRequest', + } as GetCurrentContextRequest; + + this.server.receive(message, uuid); + } +); + +When('{string} removes context listener with id {string}', function (this: CustomWorld, app: string, id: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message = { + meta, + payload: { + listenerUUID: id, + }, + type: 'contextListenerUnsubscribeRequest', + } as ContextListenerUnsubscribeRequest; + + this.server.receive(message, uuid); +}); + +When( + '{string} broadcasts {string} on {string}', + function (this: CustomWorld, app: string, contextType: string, channelId: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message = { + meta, + payload: { + channelId: handleResolve(channelId, this), + context: contextMap[contextType], + }, + type: 'broadcastRequest', + } as BroadcastRequest; + + this.server.receive(message, uuid); + } +); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/generic.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/generic.steps.ts new file mode 100644 index 000000000..69a3daa48 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/generic.steps.ts @@ -0,0 +1,122 @@ +import { Given, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { TestServerContext } from '../support/TestServerContext'; +import { DefaultFDC3Server } from '../../src/BasicFDC3Server'; +import { BasicDirectory } from '../../src/directory/BasicDirectory'; +import { ChannelType } from '../../src/handlers/BroadcastHandler'; +import { Context } from '@finos/fdc3-context'; +import { AppIdentifier } from '@finos/fdc3-standard'; + +export const APP_FIELD = 'apps'; + +export const contextMap: Record = { + 'fdc3.instrument': { + type: 'fdc3.instrument', + name: 'Apple', + id: { + ticker: 'AAPL', + }, + }, + 'fdc3.country': { + type: 'fdc3.country', + name: 'Sweden', + id: { + COUNTRY_ISOALPHA2: 'SE', + COUNTRY_ISOALPHA3: 'SWE', + }, + }, + 'fdc3.unsupported': { + type: 'fdc3.unsupported', + bogus: true, + }, + 'fdc3.book': { + type: 'fdc3.book', + author: 'Greg Wallace', + title: 'Cooking with Greg', + id: { + ISBN: '1234', + }, + }, + 'fdc3.magazine': { + type: 'fdc3.magazine', + title: 'The Economist', + price: 3.99, + id: { + ISSN: '1234', + }, + }, + 'fdc3.product': { + type: 'fdc3.product', + title: 'Current bun', + id: { + productId: 'cb1', + }, + }, +}; + +function defaultChannels() { + return [ + { + id: 'one', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'One Channel', + color: 'orange', + }, + }, + { + id: 'two', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Two Channel', + color: 'skyblue', + }, + }, + { + id: 'three', + type: ChannelType.user, + context: [], + displayMetadata: { + name: 'Three Channel', + color: 'ochre', + }, + }, + ]; +} + +export function createMeta(cw: CustomWorld, appStr: string) { + let app: AppIdentifier; + if (appStr.includes('/')) { + const [appId, instanceId] = appStr.split('/'); + app = { appId, instanceId }; + } else { + app = { appId: appStr }; + } + + return { + requestUuid: cw.sc.createUUID(), + timestamp: new Date(), + source: app, + }; +} + +Given('A newly instantiated FDC3 Server', function (this: CustomWorld) { + const apps = this.props[APP_FIELD] ?? []; + const d = new BasicDirectory(apps); + this.sc = new TestServerContext(this); + this.server = new DefaultFDC3Server(this.sc, d, defaultChannels(), false, 2000, 2000); +}); + +Given('A newly instantiated FDC3 Server with heartbeat checking', function (this: CustomWorld) { + const apps = this.props[APP_FIELD] ?? []; + const d = new BasicDirectory(apps); + + this.sc = new TestServerContext(this); + this.server = new DefaultFDC3Server(this.sc, d, defaultChannels(), true, 2000, 2000); +}); + +When('I shutdown the server', function (this: CustomWorld) { + this.server.shutdown(); +}); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/heartbeat.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/heartbeat.steps.ts new file mode 100644 index 000000000..733b03066 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/heartbeat.steps.ts @@ -0,0 +1,49 @@ +import { Given, Then } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { + HeartbeatAcknowledgementRequest, + WebConnectionProtocol6Goodbye, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { createMeta } from './generic.steps'; +import { HeartbeatHandler } from '../../src/handlers/HeartbeatHandler'; + +Given( + '{string} sends a heartbeat response to eventUuid {string}', + function (this: CustomWorld, appStr: string, eventUuid: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message = { + meta, + payload: { + heartbeatEventUuid: eventUuid, + }, + type: 'heartbeatAcknowledgementRequest', + } as HeartbeatAcknowledgementRequest; + + this.server.receive(message, uuid); + } +); + +Given('{string} sends a goodbye message', function (this: CustomWorld, appStr: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message: WebConnectionProtocol6Goodbye = { + meta, + type: 'WCP6Goodbye', + }; + + this.server.receive(message, uuid); +}); + +Then('I test the liveness of {string}', async function (this: CustomWorld, appStr: string) { + const out = await this.sc.isAppConnected(createMeta(this, appStr).source.instanceId ?? 'UNKNOWN'); + this.props['result'] = out; +}); + +Then('I get the heartbeat times', async function (this: CustomWorld) { + const hbh = this.server.handlers[3]; + const out = (hbh as HeartbeatHandler).heartbeatTimes(); + this.props['result'] = out; +}); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/intents.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/intents.steps.ts new file mode 100644 index 000000000..66d3b18bf --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/intents.steps.ts @@ -0,0 +1,385 @@ +import { DataTable, Given, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { DirectoryApp } from '../../src/directory/DirectoryInterface'; +import { APP_FIELD, contextMap, createMeta } from './generic.steps'; +import { handleResolve } from '@finos/testing'; +import { BrowserTypes } from '@finos/fdc3-schema'; + +type FindIntentRequest = BrowserTypes.FindIntentRequest; +type FindIntentsByContextRequest = BrowserTypes.FindIntentsByContextRequest; +type AddIntentListenerRequest = BrowserTypes.AddIntentListenerRequest; +type IntentListenerUnsubscribeRequest = BrowserTypes.IntentListenerUnsubscribeRequest; +type RaiseIntentRequest = BrowserTypes.RaiseIntentRequest; +type RaiseIntentForContextRequest = BrowserTypes.RaiseIntentForContextRequest; +type IntentResultRequest = BrowserTypes.IntentResultRequest; + +type ListensFor = { + [key: string]: { + displayName?: string | undefined; + contexts: string[]; + resultType?: string | undefined; + }; +}; + +function decamelize(str: string, separator: string) { + separator = typeof separator === 'undefined' ? '_' : separator; + + return str + .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') + .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2') + .toLowerCase(); +} + +function convertDataTableToListensFor(cw: CustomWorld, dt: DataTable): ListensFor { + const hashes = dt.hashes(); + const out: ListensFor = {}; + hashes.forEach(h => { + out[h['Intent Name']] = { + displayName: decamelize(h['Intent Name'], ' '), + contexts: [handleResolve(h['Context Type'], cw)], + resultType: handleResolve(h['Result Type'], cw), + }; + }); + + return out; +} + +Given('{string} is an app with the following intents', function (this: CustomWorld, appId: string, dt: DataTable) { + const currentApps = this.props[APP_FIELD] ?? []; + + const newApp: DirectoryApp = { + appId, + type: 'web', + description: '', + title: '', + details: {}, + interop: { + intents: { + listensFor: convertDataTableToListensFor(this, dt), + }, + }, + }; + + currentApps.push(newApp); + + this.props[APP_FIELD] = currentApps; +}); + +When( + '{string} finds intents with intent {string} and contextType {string} and result type {string}', + async function (this: CustomWorld, appStr: string, intentName: string, contextType: string, resultType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + intent: handleResolve(intentName, this)!, + resultType: handleResolve(resultType, this), + context: contextMap[contextType], + }, + type: 'findIntentRequest', + } as FindIntentRequest; + + await this.server.receive(message, uuid); + } +); + +When( + '{string} finds intents with contextType {string}', + async function (this: CustomWorld, appStr: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + context: contextMap[contextType], + }, + type: 'findIntentsByContextRequest', + } as FindIntentsByContextRequest; + + await this.server.receive(message, uuid); + } +); + +Given( + '{string} registers an intent listener for {string}', + async function (this: CustomWorld, appStr: string, intent: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message = { + type: 'addIntentListenerRequest', + meta, + payload: { + intent: handleResolve(intent, this), + }, + } as AddIntentListenerRequest; + await this.server.receive(message, uuid); + } +); + +Given( + '{string} registers an intent listener for {string} with contextType {string}', + async function (this: CustomWorld, appStr: string, intent: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + type: 'addIntentListenerRequest', + meta, + payload: { + intent: handleResolve(intent, this), + contextType: handleResolve(contextType, this), + }, + } as AddIntentListenerRequest; + await this.server.receive(message, uuid); + } +); + +Given( + '{string} unsubscribes an intent listener with id {string}', + async function (this: CustomWorld, appStr: string, id: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + type: 'intentListenerUnsubscribeRequest', + meta, + payload: { + listenerUUID: handleResolve(id, this), + }, + } as IntentListenerUnsubscribeRequest; + await this.server.receive(message, uuid); + } +); + +function raise( + cw: CustomWorld, + intentName: string, + contextType: string, + dest: string | null, + meta: RaiseIntentRequest['meta'] +): RaiseIntentRequest { + const destMeta = dest != null ? createMeta(cw, dest) : null; + const message = { + type: 'raiseIntentRequest', + meta: { + ...meta, + }, + payload: { + intent: handleResolve(intentName, cw), + context: contextMap[contextType], + app: dest ? destMeta!.source : null, + }, + } as RaiseIntentRequest; + return message; +} + +function raiseWithContext( + cw: CustomWorld, + contextType: string, + dest: string | null, + meta: RaiseIntentForContextRequest['meta'] +): RaiseIntentForContextRequest { + const destMeta = dest != null ? createMeta(cw, dest) : null; + const message = { + type: 'raiseIntentForContextRequest', + meta: { + ...meta, + }, + payload: { + context: contextMap[contextType], + app: dest ? destMeta!.source : null, + }, + } as RaiseIntentForContextRequest; + return message; +} + +function raiseWithInvalidTarget( + cw: CustomWorld, + intentName: string, + contextType: string, + meta: RaiseIntentRequest['meta'] +): RaiseIntentRequest { + const message = { + type: 'raiseIntentRequest', + meta: { + ...meta, + }, + payload: { + intent: handleResolve(intentName, cw), + context: contextMap[contextType], + app: 'SPOON', + }, + } as unknown as RaiseIntentRequest; + return message; +} + +function raiseWithContextAnInvalidTarget( + contextType: string, + meta: RaiseIntentForContextRequest['meta'] +): RaiseIntentForContextRequest { + const message = { + type: 'raiseIntentForContextRequest', + meta: { + ...meta, + }, + payload: { + context: contextMap[contextType], + app: 'SPOON', + }, + } as unknown as RaiseIntentForContextRequest; + return message; +} + +When( + '{string} raises an intent with contextType {string}', + async function (this: CustomWorld, appStr: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raiseWithContext(this, contextType, null, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent with contextType {string} on app {string}', + async function (this: CustomWorld, appStr: string, contextType: string, dest: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raiseWithContext(this, contextType, dest, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent for {string} with contextType {string}', + async function (this: CustomWorld, appStr: string, intentName: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raise(this, intentName, contextType, null, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent for {string} with contextType {string} on app {string}', + async function (this: CustomWorld, appStr: string, intentName: string, contextType: string, dest: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raise(this, intentName, contextType, dest, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent for {string} with contextType {string} on an invalid app instance', + async function (this: CustomWorld, appStr: string, intentName: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raiseWithInvalidTarget(this, intentName, contextType, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent with contextType {string} on an invalid app instance', + async function (this: CustomWorld, appStr: string, contextType: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raiseWithContextAnInvalidTarget(contextType, meta); + await this.server.receive(message, uuid); + } +); + +When( + '{string} raises an intent for {string} with contextType {string} on app {string} with requestUuid {string}', + async function ( + this: CustomWorld, + appStr: string, + intentName: string, + contextType: string, + dest: string, + requestUuid: string + ) { + const meta = { + ...createMeta(this, appStr), + requestUuid, + }; + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = raise(this, intentName, contextType, dest, meta); + await this.server.receive(message, uuid); + } +); + +When('we wait for the intent timeout', function (this: CustomWorld) { + return new Promise(resolve => { + setTimeout(() => resolve(), 2100); + }); +}); + +When( + '{string} sends a intentResultRequest with eventUuid {string} and contextType {string} and raiseIntentUuid {string}', + async function (this: CustomWorld, appStr: string, eventUuid: string, contextType: string, raiseIntentUuid: string) { + const meta = createMeta(this, appStr); + const uuid1 = this.sc.getInstanceUUID(meta.source)!; + const message: IntentResultRequest = { + type: 'intentResultRequest', + meta: { + ...meta, + }, + payload: { + intentResult: { + context: contextMap[contextType], + }, + intentEventUuid: eventUuid, + raiseIntentRequestUuid: raiseIntentUuid, + }, + }; + await this.server.receive(message, uuid1); + } +); + +When( + '{string} sends a intentResultRequest with eventUuid {string} and void contents and raiseIntentUuid {string}', + async function (this: CustomWorld, appStr: string, eventUuid: string, raiseIntentUuid: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message: IntentResultRequest = { + type: 'intentResultRequest', + meta: { + ...meta, + }, + payload: { + intentResult: {}, + intentEventUuid: eventUuid, + raiseIntentRequestUuid: raiseIntentUuid, + }, + }; + await this.server.receive(message, uuid); + } +); + +When( + '{string} sends a intentResultRequest with eventUuid {string} and private channel {string} and raiseIntentUuid {string}', + async function (this: CustomWorld, appStr: string, eventUuid: string, channelId: string, raiseIntentUuid: string) { + const meta = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message: IntentResultRequest = { + type: 'intentResultRequest', + meta: { + ...meta, + }, + payload: { + intentResult: { + channel: { + type: 'private', + id: channelId, + }, + }, + intentEventUuid: eventUuid, + raiseIntentRequestUuid: raiseIntentUuid, + }, + }; + await this.server.receive(message, uuid); + } +); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/messaging.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/messaging.steps.ts new file mode 100644 index 000000000..3e01dce25 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/messaging.steps.ts @@ -0,0 +1,20 @@ +import { DataTable, Then } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import expect from 'expect'; +import { setupGenericSteps, matchData } from '@finos/testing'; + +Then('messaging will have outgoing posts', function (this: CustomWorld, dt: DataTable) { + // just take the last few posts and match those + const matching = dt.rows().length; + let toUse = this.sc?.postedMessages; + if (toUse.length > matching) { + toUse = toUse.slice(toUse.length - matching, toUse.length); + } + matchData(this, toUse, dt); +}); + +Then('messaging will have {int} posts', function (this: CustomWorld, count: number) { + expect(this.sc.postedMessages.length).toEqual(count); +}); + +setupGenericSteps(); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/private-channel.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/private-channel.steps.ts new file mode 100644 index 000000000..13d5bdc4b --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/private-channel.steps.ts @@ -0,0 +1,72 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { createMeta } from './generic.steps'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { handleResolve } from '@finos/testing'; + +type CreatePrivateChannelRequest = BrowserTypes.CreatePrivateChannelRequest; +type PrivateChannelAddEventListenerRequest = BrowserTypes.PrivateChannelAddEventListenerRequest; +type PrivateChannelUnsubscribeEventListenerRequest = BrowserTypes.PrivateChannelUnsubscribeEventListenerRequest; +type PrivateChannelDisconnectRequest = BrowserTypes.PrivateChannelDisconnectRequest; + +When('{string} creates a private channel', function (this: CustomWorld, app: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: {}, + type: 'createPrivateChannelRequest', + } as CreatePrivateChannelRequest; + + this.server.receive(message, uuid); +}); + +When('{string} removes event listener {string}', function (this: CustomWorld, app: string, listenerUUID: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + listenerUUID, + }, + type: 'privateChannelUnsubscribeEventListenerRequest', + } as PrivateChannelUnsubscribeEventListenerRequest; + + this.server.receive(message, uuid); +}); + +When( + '{string} adds an {string} event listener on {string}', + function (this: CustomWorld, app: string, listenerType: string, channelId: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + privateChannelId: handleResolve(channelId, this), + listenerType, + }, + type: 'privateChannelAddEventListenerRequest', + } as PrivateChannelAddEventListenerRequest; + + this.server.receive(message, uuid); + } +); + +When( + '{string} disconnects from private channel {string}', + function (this: CustomWorld, app: string, channelId: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + + const message = { + meta, + payload: { + channelId: handleResolve(channelId, this), + }, + type: 'privateChannelDisconnectRequest', + } as PrivateChannelDisconnectRequest; + + this.server.receive(message, uuid); + } +); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/start-app.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/start-app.steps.ts new file mode 100644 index 000000000..009fde6ec --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/start-app.steps.ts @@ -0,0 +1,153 @@ +import { DataTable, Then, When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { contextMap, createMeta } from './generic.steps'; +import { matchData } from '@finos/testing'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { State } from '../../src/ServerContext'; +import { GetInfoRequest } from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +type OpenRequest = BrowserTypes.OpenRequest; +type GetAppMetadataRequest = BrowserTypes.GetAppMetadataRequest; +type FindInstancesRequest = BrowserTypes.FindInstancesRequest; +type WebConnectionProtocol4ValidateAppIdentity = BrowserTypes.WebConnectionProtocol4ValidateAppIdentity; + +When('{string} is opened with connection id {string}', function (this: CustomWorld, app: string, uuid: string) { + const meta = createMeta(this, app); + this.sc.setInstanceDetails(uuid, { + appId: meta.source.appId, + instanceId: meta.source.instanceId!, + state: State.Connected, + }); +}); + +When('{string} is closed', function (this: CustomWorld, app: string) { + const meta = createMeta(this, app); + this.server.cleanup(meta.source.instanceId!); +}); + +When('{string} sends validate', function (this: CustomWorld, uuid: string) { + const identity = this.sc.getInstanceDetails(uuid); + if (identity) { + const message: WebConnectionProtocol4ValidateAppIdentity = { + type: 'WCP4ValidateAppIdentity', + meta: { + connectionAttemptUuid: this.sc.createUUID(), + timestamp: new Date(), + }, + payload: { + actualUrl: 'something', + identityUrl: 'something', + }, + }; + this.sc.setAppState(identity.instanceId, State.Connected); + this.server.receive(message, uuid); + } else { + throw new Error(`Did not find app identity ${uuid}`); + } +}); + +When('{string} revalidates', function (this: CustomWorld, uuid: string) { + const message: WebConnectionProtocol4ValidateAppIdentity = { + type: 'WCP4ValidateAppIdentity', + meta: { + connectionAttemptUuid: this.sc.createUUID(), + timestamp: new Date(), + }, + payload: { + instanceUuid: uuid, + actualUrl: 'something', + identityUrl: 'something', + }, + }; + + this.server.receive(message, uuid); +}); + +Then('running apps will be', async function (this: CustomWorld, dataTable: DataTable) { + const apps = await this.sc.getConnectedApps(); + matchData(this, apps, dataTable); +}); + +When('{string} opens app {string}', function (this: CustomWorld, appStr: string, open: string) { + const from = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(from.source)!; + const message: OpenRequest = { + type: 'openRequest', + meta: from, + payload: { + app: { + appId: open, + desktopAgent: 'n/a', + }, + }, + }; + this.server.receive(message, uuid); +}); + +When( + '{string} opens app {string} with context data {string}', + function (this: CustomWorld, appStr: string, open: string, context: string) { + const from = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(from.source)!; + const message: OpenRequest = { + type: 'openRequest', + meta: from, + payload: { + app: { + appId: open, + desktopAgent: 'n/a', + }, + context: contextMap[context], + }, + }; + this.server.receive(message, uuid); + } +); + +When('{string} requests metadata for {string}', function (this: CustomWorld, appStr: string, open: string) { + const from = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(from.source)!; + const message: GetAppMetadataRequest = { + type: 'getAppMetadataRequest', + meta: from, + payload: { + app: { + appId: open, + desktopAgent: 'n/a', + }, + }, + }; + this.server.receive(message, uuid); +}); + +When('{string} requests info on the DesktopAgent', function (this: CustomWorld, appStr: string) { + const from = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(from.source)!; + const message: GetInfoRequest = { + type: 'getInfoRequest', + meta: from, + payload: {}, + }; + this.server.receive(message, uuid); +}); + +When('{string} findsInstances of {string}', function (this: CustomWorld, appStr: string, open: string) { + const from = createMeta(this, appStr); + const uuid = this.sc.getInstanceUUID(from.source)!; + const message: FindInstancesRequest = { + type: 'findInstancesRequest', + meta: from, + payload: { + app: { + appId: open, + }, + }, + }; + this.server.receive(message, uuid); +}); + +When('we wait for the listener timeout', function (this: CustomWorld) { + return new Promise(resolve => { + setTimeout(() => resolve(), 3100); + }); +}); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/user-channel.steps.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/user-channel.steps.ts new file mode 100644 index 000000000..1be54d6f3 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/step-definitions/user-channel.steps.ts @@ -0,0 +1,79 @@ +import { When } from '@cucumber/cucumber'; +import { CustomWorld } from '../world'; +import { createMeta } from './generic.steps'; +import { BrowserTypes } from '@finos/fdc3-schema'; +import { handleResolve } from '@finos/testing'; + +type GetUserChannelsRequest = BrowserTypes.GetUserChannelsRequest; +type GetCurrentChannelRequest = BrowserTypes.GetCurrentChannelRequest; +type JoinUserChannelRequest = BrowserTypes.JoinUserChannelRequest; +type LeaveCurrentChannelRequest = BrowserTypes.LeaveCurrentChannelRequest; +type GetCurrentContextRequest = BrowserTypes.GetCurrentContextRequest; + +When('{string} gets the list of user channels', function (this: CustomWorld, app: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: {}, + type: 'getUserChannelsRequest', + } as GetUserChannelsRequest; + + this.server.receive(message, uuid); +}); + +When('{string} gets the current user channel', function (this: CustomWorld, app: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: {}, + type: 'getCurrentChannelRequest', + } as GetCurrentChannelRequest; + + this.server.receive(message, uuid); +}); + +When('{string} leaves the current user channel', function (this: CustomWorld, app: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: {}, + type: 'leaveCurrentChannelRequest', + } as LeaveCurrentChannelRequest; + + this.server.receive(message, uuid); +}); + +When('{string} joins user channel {string}', function (this: CustomWorld, app: string, channel: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + channelId: handleResolve(channel, this), + }, + type: 'joinUserChannelRequest', + } as JoinUserChannelRequest; + + this.server.receive(message, uuid); +}); + +When( + '{string} gets the latest context on {string} with type {string}', + function (this: CustomWorld, app: string, channel: string, type: string) { + const meta = createMeta(this, app); + const uuid = this.sc.getInstanceUUID(meta.source)!; + const message = { + meta, + payload: { + channelId: handleResolve(channel, this), + contextType: handleResolve(type, this), + }, + type: 'getCurrentContextRequest', + } as GetCurrentContextRequest; + + this.server.receive(message, uuid); + } +); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/support/TestServerContext.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/support/TestServerContext.ts new file mode 100644 index 000000000..a2140e188 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/support/TestServerContext.ts @@ -0,0 +1,139 @@ +import { FDC3Server } from '../../src/FDC3Server'; +import { ServerContext, InstanceID, State, AppRegistration } from '../../src/ServerContext'; +import { CustomWorld } from '../world'; +import { Context } from '@finos/fdc3-context'; +import { OpenError, AppIdentifier, AppIntent } from '@finos/fdc3-standard'; + +type ConnectionDetails = AppRegistration & { + msg?: object; +}; + +type MessageRecord = { + to?: AppIdentifier; + uuid?: InstanceID; + msg: object; +}; + +export class TestServerContext implements ServerContext { + public postedMessages: MessageRecord[] = []; + private readonly cw: CustomWorld; + private instances: ConnectionDetails[] = []; + private nextInstanceId: number = 0; + private nextUUID: number = 0; + private server: FDC3Server | null = null; + + constructor(cw: CustomWorld) { + this.cw = cw; + } + + setFDC3Server(server: FDC3Server): void { + this.server = server; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async narrowIntents(_raiser: AppIdentifier, appIntents: AppIntent[], _context: Context): Promise { + return appIntents; + } + + getInstanceDetails(uuid: string) { + return this.instances.find(ca => ca.instanceId === uuid); + } + + setInstanceDetails(uuid: InstanceID, appId: ConnectionDetails) { + if (uuid != appId.instanceId) { + throw new Error('UUID mismatch'); + } + this.instances = this.instances.filter(ca => ca.instanceId !== uuid); + this.instances.push(appId); + } + + async open(appId: string): Promise { + const ni = this.nextInstanceId++; + if (appId.includes('missing')) { + throw new Error(OpenError.AppNotFound); + } else { + const uuid = 'uuid-' + ni; + this.instances.push({ appId, instanceId: uuid, state: State.Pending }); + return uuid; + } + } + + async setAppState(app: InstanceID, newState: State): Promise { + const found = this.instances.find(a => a.instanceId == app); + if (found) { + const currentState = found.state; + if (currentState !== State.Terminated && newState === State.Terminated) { + this.server?.cleanup(app); + } + found.state = newState; + } + } + + async getConnectedApps(): Promise { + return (await this.getAllApps()).filter(a => a.state == State.Connected); + } + + async getAllApps(): Promise { + return this.instances.map(x => { + return { + appId: x.appId, + instanceId: x.instanceId, + state: x.state, + }; + }); + } + + async isAppConnected(app: InstanceID): Promise { + const found = this.instances.find(a => a.instanceId == app && a.state == State.Connected); + return found != null; + } + + provider(): string { + return 'cucumber-provider'; + } + providerVersion(): string { + return '1.2.3.TEST'; + } + fdc3Version(): string { + return '2.0'; + } + + createUUID(): string { + return 'uuid' + this.nextUUID++; + } + + async post(msg: object, to: InstanceID): Promise { + if (to == null) { + this.postedMessages.push({ msg }); + } else { + const id = this.getInstanceDetails(to); + const app = id + ? { + appId: id!.appId, + instanceId: id!.instanceId, + } + : undefined; + this.postedMessages.push({ + msg, + to: app, + uuid: to, + }); + } + } + + log(message: string): void { + this.cw.log(message); + } + + /** + * USED FOR TESTING + */ + getInstanceUUID(appId: AppIdentifier): InstanceID { + this.setInstanceDetails(appId.instanceId!, { + appId: appId.appId, + instanceId: appId.instanceId!, + state: State.Connected, + }); + return appId.instanceId!; + } +} diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/test/world/index.ts b/toolbox/fdc3-for-web/fdc3-web-impl/test/world/index.ts new file mode 100644 index 000000000..d37b030b6 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/test/world/index.ts @@ -0,0 +1,12 @@ +import { World, setWorldConstructor } from '@cucumber/cucumber'; +import { TestServerContext } from '../support/TestServerContext'; +import { DefaultFDC3Server } from '../../src/BasicFDC3Server'; +import { BasicDirectory } from '../../src/directory/BasicDirectory'; + +export class CustomWorld extends World { + sc = new TestServerContext(this); + server = new DefaultFDC3Server(this.sc, new BasicDirectory([]), [], false); + props: Record = {}; +} + +setWorldConstructor(CustomWorld); diff --git a/toolbox/fdc3-for-web/fdc3-web-impl/tsconfig.json b/toolbox/fdc3-for-web/fdc3-web-impl/tsconfig.json new file mode 100644 index 000000000..48425b660 --- /dev/null +++ b/toolbox/fdc3-for-web/fdc3-web-impl/tsconfig.json @@ -0,0 +1,33 @@ +{ + "extends": "../../../tsconfig.root.json", + "compilerOptions": { + "rootDirs": [ + "src", + "test", + "generated" + ], + "outDir": "dist", + }, + "include": [ + "src", + "generated", + ], + "exclude": [ + "test/**", + "dist/**" + ], + "references": [ + { + "path": "../../../packages/fdc3-standard" + }, + { + "path": "../../../packages/testing" + }, + { + "path": "../../../packages/fdc3-schema" + }, + { + "path": "../../../packages/fdc3-context" + }, + ] +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/reference-ui/.gitignore b/toolbox/fdc3-for-web/reference-ui/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/toolbox/fdc3-for-web/reference-ui/channel_selector.html b/toolbox/fdc3-for-web/reference-ui/channel_selector.html new file mode 100644 index 000000000..798219f92 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/channel_selector.html @@ -0,0 +1,84 @@ + + + + Channel selector + + + + + +
    + +
    + +
    + + diff --git a/toolbox/fdc3-for-web/reference-ui/eslint.config.mjs b/toolbox/fdc3-for-web/reference-ui/eslint.config.mjs new file mode 100644 index 000000000..c7018a2c8 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, +]; diff --git a/toolbox/fdc3-for-web/reference-ui/intent_resolver.html b/toolbox/fdc3-for-web/reference-ui/intent_resolver.html new file mode 100644 index 000000000..44df4ec13 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/intent_resolver.html @@ -0,0 +1,146 @@ + + + + Channel selector + + + + + + +
    +

    Intent Resolver

    + +
    + Resolve intent for: + +
    +
    + +
    +
    New Apps
    +
    Open Apps
    +
    + +
    + +
    + +
    + +
    +
    +
    + + diff --git a/toolbox/fdc3-for-web/reference-ui/package.json b/toolbox/fdc3-for-web/reference-ui/package.json new file mode 100644 index 000000000..119125f97 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/package.json @@ -0,0 +1,28 @@ +{ + "name": "fdc3-for-web-reference-ui", + "private": true, + "version": "2.2.0-alpha.3", + "license": "Apache-2.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build --base=/toolbox/fdc3-reference-ui/", + "clean": "npx rimraf dist", + "preview": "vite preview", + "lint": "eslint src/" + }, + "devDependencies": { + "@eslint/js": "^9.16.0", + "@types/color": "^4.2.0", + "color": "^4.2.3", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "globals": "^15.13.0", + "typescript": "^5.6.3", + "typescript-eslint": "^8.17.0", + "vite": "^5.4.9" + }, + "dependencies": { + "@finos/fdc3": "2.2.0-alpha.3" + } +} \ No newline at end of file diff --git a/toolbox/fdc3-for-web/reference-ui/src/channel_selector.ts b/toolbox/fdc3-for-web/reference-ui/src/channel_selector.ts new file mode 100644 index 000000000..fd0d0a950 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/src/channel_selector.ts @@ -0,0 +1,169 @@ +import { + Channel, + Fdc3UserInterfaceChannelSelected, + Fdc3UserInterfaceHello, + Fdc3UserInterfaceRestyle, + isFdc3UserInterfaceChannels, + isFdc3UserInterfaceHandshake, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; +import { selectHighestContrast } from './contrast'; + +const fillChannels = (data: Channel[], selected: string | null, messageClickedChannel: (s: string | null) => void) => { + const list = document.getElementById('list')!; + list.innerHTML = ''; + + data.forEach(({ id, displayMetadata }) => { + const node = document.createElement('div'); + node.setAttribute('tabIndex', '0'); + + const span = document.createElement('span'); + span.classList.add('glyph'); + + if (displayMetadata?.color) { + span.style.color = selectHighestContrast(displayMetadata.color, 'white', 'black'); + span.style.backgroundColor = displayMetadata.color; + span.style.borderColor = displayMetadata.color; + } + span.textContent = displayMetadata?.glyph ?? ''; + node.appendChild(span); + + if (displayMetadata?.name) { + const span2 = document.createElement('span'); + span2.classList.add('name'); + span2.textContent = displayMetadata.name; + node.appendChild(span2); + } + + list.appendChild(node); + node.addEventListener('click', () => { + messageClickedChannel(id); + }); + + if (id === selected) { + node.setAttribute('aria-selected', 'true'); + node.style.backgroundColor = '#bbb'; + } + }); + + //add an element for leaving all channels + const node = document.createElement('div'); + node.setAttribute('tabIndex', '0'); + + const span = document.createElement('span'); + span.classList.add('glyph'); + span.textContent = 'X'; + node.appendChild(span); + + const span2 = document.createElement('span'); + span2.classList.add('name'); + span2.textContent = 'none'; + node.appendChild(span2); + + list.appendChild(node); + node.addEventListener('click', () => { + messageClickedChannel(null); + }); + + if (selected === null) { + node.setAttribute('aria-selected', 'true'); + node.style.backgroundColor = '#bbb'; + } +}; + +window.addEventListener('load', () => { + const parent = window.parent; + const logo = document.getElementById('logo')!; + + const mc = new MessageChannel(); + const myPort = mc.port1; + + myPort.addEventListener('message', ({ data }) => { + console.debug('Received message: ', data); + + if (isFdc3UserInterfaceHandshake(data)) { + collapse(); + } else if (isFdc3UserInterfaceChannels(data)) { + logo.removeEventListener('click', expand); + const { userChannels, selected } = data.payload; + fillChannels(userChannels, selected, channelStr => { + const message: Fdc3UserInterfaceChannelSelected = { + type: 'Fdc3UserInterfaceChannelSelected', + payload: { + selected: channelStr || null, + }, + }; + myPort.postMessage(message); + console.log('Channel Selected: ', message); + collapse(); + }); + + const selectedChannel = userChannels.find(c => c.id === selected); + logo.style.fill = selectedChannel?.displayMetadata?.color ?? 'white'; + console.log('Adding click event listener'); + logo.addEventListener('click', expand); + } + }); + myPort.start(); + + const helloMessage: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + implementationDetails: 'FDC3 Reference Channel Selector UI', + initialCSS: { + width: `${8 * 6}px`, + height: `${8 * 8}px`, + right: '2px', + bottom: '8px', + zIndex: '1000', + 'z-index': '1000', + position: 'fixed', + }, + }, + }; + parent.postMessage(helloMessage, '*', [mc.port2]); + + const expand = () => { + document.body.setAttribute('data-expanded', 'true'); + const restyleMessage: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: `100%`, + height: `100%`, + top: '0', + left: '0', + zIndex: '1000', + 'z-index': '1000', + position: 'fixed', + }, + }, + }; + myPort.postMessage(restyleMessage); + }; + + const collapse = () => { + const restyleMessage: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: `${8 * 6}px`, + height: `${8 * 8}px`, + right: '8px', + bottom: '2px', + zIndex: '1000', + 'z-index': '1000', + position: 'fixed', + }, + }, + }; + myPort.postMessage(restyleMessage); + + // If you immediately change to the logo, before the iframe has a chance to finish restyling, + // you see a flicker of a giant, colored logo. + // Here, we wait a negligible amount of time, and hope that the restyling has finished. This avoids the flicker. + // It's not a *good* idea, it's just the best available, since we don't know when the restyle finishes. + setTimeout(() => { + document.body.setAttribute('data-expanded', 'false'); + }, 15); + }; +}); diff --git a/toolbox/fdc3-for-web/reference-ui/src/contrast.ts b/toolbox/fdc3-for-web/reference-ui/src/contrast.ts new file mode 100644 index 000000000..b07f3cfe3 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/src/contrast.ts @@ -0,0 +1,17 @@ +import Color from 'color'; + +export function selectHighestContrast(bgColorCSS: string, ...candidates: string[]) { + const bgColor = Color(bgColorCSS); + const contrasts: number[] = candidates.map(candidate => { + return bgColor.contrast(Color(candidate)); + }); + let bestCandidate = candidates[0], + highestContrast = contrasts[0]; + for (let i = 1; i < contrasts.length; i++) { + if (contrasts[i] > highestContrast) { + bestCandidate = candidates[i]; + highestContrast = contrasts[i]; + } + } + return bestCandidate; +} diff --git a/toolbox/fdc3-for-web/reference-ui/src/intent_resolver.ts b/toolbox/fdc3-for-web/reference-ui/src/intent_resolver.ts new file mode 100644 index 000000000..794cfc3f1 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/src/intent_resolver.ts @@ -0,0 +1,239 @@ +import { Icon } from '@finos/fdc3'; +import { AppIntent } from '@finos/fdc3'; +import { + Fdc3UserInterfaceHello, + Fdc3UserInterfaceResolve, + Fdc3UserInterfaceResolveAction, + Fdc3UserInterfaceRestyle, + isFdc3UserInterfaceResolve, +} from '@finos/fdc3-schema/dist/generated/api/BrowserTypes'; + +const setup = ( + data: Fdc3UserInterfaceResolve['payload'], + callback: (payload: Fdc3UserInterfaceResolveAction['payload']) => void +) => { + document.body.setAttribute('data-visible', 'true'); + document.querySelector('dialog')?.showModal(); + + const intentSelect = document.getElementById('displayIntent') as HTMLSelectElement; + + const justIntents = data.appIntents.map(({ intent }) => intent); + const doneIntents = new Set(); + + justIntents.forEach(({ name, displayName }) => { + if (doneIntents.has(name)) { + return; + } + doneIntents.add(name); + const option = document.createElement('option'); + option.textContent = displayName as string; + option.value = name; + intentSelect.appendChild(option); + }); + + intentSelect.addEventListener('change', e => { + if (e.target) { + const option = e.target as HTMLOptionElement; + fillList( + data.appIntents.filter(ai => ai.intent.name == option.value), + option.value, + callback + ); + } + }); + + fillList( + data.appIntents.filter(ai => ai.intent.name == intentSelect.value), + intentSelect.value, + callback + ); + + const tabs = Array.from(document.querySelectorAll("[role='tab']")); + tabs.forEach(tab => { + tab.addEventListener('click', () => { + // Remove selected state from every tab + tabs.forEach(t => { + t.setAttribute('aria-selected', 'false'); + }); + // Hide lists + Array.from(document.querySelectorAll('.list')).forEach(elem => { + elem.setAttribute('data-visible', 'false'); + }); + + tab.setAttribute('aria-selected', 'true'); + const listRef = tab.getAttribute('data-list-ref')!; + document.getElementById(listRef)!.setAttribute('data-visible', 'true'); + }); + }); + + document.getElementById('cancel')?.addEventListener('click', () => { + callback({ + action: 'cancel', + }); + }); +}; + +function createIcon(icons: Icon[] | undefined): HTMLElement { + const img = document.createElement('img'); + if (icons && icons.length > 0) { + img.src = icons[0].src; + } else { + img.style.opacity = '0'; + } + + return img; +} + +const fillList = ( + ai: AppIntent[], + intent: string, + callback: (payload: Fdc3UserInterfaceResolveAction['payload']) => void +) => { + const allApps = ai.flatMap(a => a.apps); + const openApps = allApps.filter(a => a.instanceId); + const newApps = allApps.filter(a => !a.instanceId); + + // first, populate the "New Apps" tab + const newList = document.getElementById('new-list') as HTMLDivElement; + + newList.innerHTML = ''; + newApps.forEach(({ appId, title, name, icons }) => { + const node = document.createElement('div'); + node.setAttribute('tabIndex', '0'); + node.setAttribute('data-appId', appId); + + const span = document.createElement('span'); + span.textContent = title ?? name ?? appId; + + const img = createIcon(icons); + + node.appendChild(img); + node.appendChild(span); + + node.addEventListener('click', () => { + callback({ + action: 'click', + intent, + appIdentifier: { + appId, + }, + }); + }); + + node.addEventListener('hover', () => { + callback({ + action: 'hover', + intent, + appIdentifier: { + appId, + }, + }); + }); + + newList.appendChild(node); + }); + + // then, populate the "Open Apps" tab + const openList = document.getElementById('open-list')!; + openList.innerHTML = ''; + + openApps.forEach(({ appId, title, icons, instanceId }) => { + const node = document.createElement('div'); + node.setAttribute('tabIndex', '0'); + node.setAttribute('data-appId', appId); + + const span = document.createElement('span'); + span.textContent = title ?? appId; + + const img = createIcon(icons); + + node.appendChild(img); + node.appendChild(span); + + node.addEventListener('click', () => { + callback({ + action: 'click', + intent, + appIdentifier: { + appId, + instanceId, + }, + }); + }); + + node.addEventListener('hover', () => { + callback({ + action: 'hover', + intent, + appIdentifier: { + appId, + instanceId, + }, + }); + }); + + openList.appendChild(node); + }); +}; + +window.addEventListener('load', () => { + const parent = window.parent; + + const mc = new MessageChannel(); + const myPort = mc.port1; + + myPort.addEventListener('message', ({ data }) => { + console.debug('Received message: ', data); + if (isFdc3UserInterfaceResolve(data)) { + const restyleMessage: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: '100%', + height: '100%', + top: '0', + left: '0', + position: 'fixed', + display: 'block', + }, + }, + }; + myPort.postMessage(restyleMessage); + + setup(data.payload, payload => { + document.querySelector('dialog')?.close(); + const resolveAction: Fdc3UserInterfaceResolveAction = { + type: 'Fdc3UserInterfaceResolveAction', + payload, + }; + myPort.postMessage(resolveAction); + + const restyleMessage: Fdc3UserInterfaceRestyle = { + type: 'Fdc3UserInterfaceRestyle', + payload: { + updatedCSS: { + width: '0', + height: '0', + display: 'none', + }, + }, + }; + + myPort.postMessage(restyleMessage); + }); + } + }); + myPort.start(); + + const helloMessage: Fdc3UserInterfaceHello = { + type: 'Fdc3UserInterfaceHello', + payload: { + implementationDetails: '', + initialCSS: { + width: '0', + height: '0', + }, + }, + }; + parent.postMessage(helloMessage, '*', [mc.port2]); +}); diff --git a/toolbox/fdc3-for-web/reference-ui/src/vite-env.d.ts b/toolbox/fdc3-for-web/reference-ui/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/toolbox/fdc3-for-web/reference-ui/tsconfig.json b/toolbox/fdc3-for-web/reference-ui/tsconfig.json new file mode 100644 index 000000000..75abdef26 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/toolbox/fdc3-for-web/reference-ui/vite.config.ts b/toolbox/fdc3-for-web/reference-ui/vite.config.ts new file mode 100644 index 000000000..f8bc51096 --- /dev/null +++ b/toolbox/fdc3-for-web/reference-ui/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + server: { port: 4002 }, + build: { + outDir: 'dist', + rollupOptions: { + input: { + channelSelector: 'channel_selector.html', + intentResolver: 'intent_resolver.html', + }, + }, + }, +}); diff --git a/toolbox/fdc3-workbench/.eslintignore b/toolbox/fdc3-workbench/.eslintignore deleted file mode 100644 index b6e513352..000000000 --- a/toolbox/fdc3-workbench/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -.github/ -build/ -dist/ -node_modules/ -*.d.ts -*.md -yarn.lock -package.json diff --git a/toolbox/fdc3-workbench/.eslintrc.json b/toolbox/fdc3-workbench/.eslintrc.json deleted file mode 100644 index 47b2f4182..000000000 --- a/toolbox/fdc3-workbench/.eslintrc.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "env": { - "browser": true, - "es6": true, - "commonjs": true - }, - "extends": ["plugin:react/recommended", "prettier"], - "settings": { - "react": { - "version": "detect" - } - }, - "globals": { - "fdc3": "readonly" - }, - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 2018, - "sourceType": "module" - }, - "plugins": ["react", "import", "@typescript-eslint"], - "rules": { - "react/jsx-uses-vars": 2, - "class-methods-use-this": 0, - "no-plusplus": 0, - "no-undef": 2, - "prefer-arrow-callback": 1, - "prefer-destructuring": [ - "warn", - { - "object": true, - "array": false - } - ], - "quote-props": ["warn", "as-needed"], - "lines-between-class-members": 1, - "@typescript-eslint/no-unused-vars": 1, - "prefer-template": 1, - "arrow-parens": 1, - "no-extra-semi": 1, - "no-shadow": 1, - "import/first": 1, - "@typescript-eslint/no-use-before-define": 1, - "no-redeclare": 1, - "arrow-body-style": [ - "warn", - "as-needed", - { - "requireReturnForObjectLiteral": true - } - ], - "one-var-declaration-per-line": ["warn", "always"], - "no-mixed-operators": 1, - "no-multiple-empty-lines": 1, - "no-multi-spaces": 1, - "default-case": 1, - "no-unneeded-ternary": 1, - "operator-assignment": ["warn", "never"], - "object-property-newline": [ - "warn", - { - "allowAllPropertiesOnSameLine": true - } - ], - "new-cap": 1, - "no-case-declarations": 1, - "react/prop-types": 0, - "react/no-string-refs": 0 - } -} diff --git a/toolbox/fdc3-workbench/.prettierrc b/toolbox/fdc3-workbench/.prettierrc index 9e4ad7c81..3fce93d4b 100644 --- a/toolbox/fdc3-workbench/.prettierrc +++ b/toolbox/fdc3-workbench/.prettierrc @@ -1,7 +1,7 @@ { - "useTabs": true, - "arrowParens": "always", - "trailingComma": "es5", - "proseWrap": "always", - "printWidth": 120 -} \ No newline at end of file + "useTabs": true, + "arrowParens": "always", + "trailingComma": "es5", + "proseWrap": "always", + "printWidth": 120 +} diff --git a/toolbox/fdc3-workbench/README.md b/toolbox/fdc3-workbench/README.md index 94b5e4187..10fba0af3 100644 --- a/toolbox/fdc3-workbench/README.md +++ b/toolbox/fdc3-workbench/README.md @@ -13,11 +13,11 @@ _Created and contributed to [FDC3](http://fdc3.finos.org) by [Finsemble, Inc.](h 2. Install dependencies -`cd toolbox/fdc3-workbench & yarn install` +`cd toolbox/fdc3-workbench & npm run install` 3. Start the development server -`yarn start` +`npm run dev` 4. Add the URL http://localhost:3000 to your FDC3-enabled container or desktop agent and ensure it has access to the `window.fdc3` object. diff --git a/toolbox/fdc3-workbench/eslint.config.mjs b/toolbox/fdc3-workbench/eslint.config.mjs new file mode 100644 index 000000000..835efa093 --- /dev/null +++ b/toolbox/fdc3-workbench/eslint.config.mjs @@ -0,0 +1,126 @@ +import react from "eslint-plugin-react"; +import _import from "eslint-plugin-import"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import { fixupPluginRules } from "@eslint/compat"; +import globals from "globals"; +import tsParser from "@typescript-eslint/parser"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; +import eslintConfigPrettier from "eslint-config-prettier"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default [ + { files: ["**/*.{js,mjs,cjs,ts}"] }, + { + ignores: [ + "**/.github/", + "**/build/", + "**/dist/", + "**/node_modules/", + "**/*.d.ts", + "**/*.md", + "**/yarn.lock", + "**/package.json", + ], + }, + ...compat.extends("plugin:react/recommended", "prettier"), + { + plugins: { + react, + import: fixupPluginRules(_import), + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.commonjs, + fdc3: "readonly", + }, + + parser: tsParser, + ecmaVersion: 2018, + sourceType: "module", + + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + + settings: { + react: { + version: "detect", + }, + }, + + rules: { + "react/jsx-uses-vars": 2, + "class-methods-use-this": 0, + "no-plusplus": 0, + "no-undef": 2, + "prefer-arrow-callback": 1, + + "prefer-destructuring": [ + "warn", + { + object: true, + array: false, + }, + ], + + "quote-props": ["warn", "as-needed"], + "lines-between-class-members": 1, + "@typescript-eslint/no-unused-vars": 1, + "prefer-template": 1, + "arrow-parens": 1, + "no-extra-semi": 1, + "no-shadow": 1, + "import/first": 1, + "@typescript-eslint/no-use-before-define": 1, + "no-redeclare": 1, + + "arrow-body-style": [ + "warn", + "as-needed", + { + requireReturnForObjectLiteral: true, + }, + ], + + "one-var-declaration-per-line": ["warn", "always"], + "no-mixed-operators": 1, + "no-multiple-empty-lines": 1, + "no-multi-spaces": 1, + "default-case": 1, + "no-unneeded-ternary": 1, + "operator-assignment": ["warn", "never"], + + "object-property-newline": [ + "warn", + { + allowAllPropertiesOnSameLine: true, + }, + ], + + "new-cap": 1, + "no-case-declarations": 1, + "react/prop-types": 0, + "react/no-string-refs": 0, + }, + }, + pluginJs.configs.recommended, + eslintConfigPrettier, +]; diff --git a/toolbox/fdc3-workbench/index.html b/toolbox/fdc3-workbench/index.html index 015c27e41..f2caf8258 100644 --- a/toolbox/fdc3-workbench/index.html +++ b/toolbox/fdc3-workbench/index.html @@ -1,4 +1,4 @@ - + diff --git a/toolbox/fdc3-workbench/package-lock.json b/toolbox/fdc3-workbench/package-lock.json deleted file mode 100644 index c03cac0c3..000000000 --- a/toolbox/fdc3-workbench/package-lock.json +++ /dev/null @@ -1,6061 +0,0 @@ -{ - "name": "fdc3-workbench", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "fdc3-workbench", - "version": "2.0.0", - "license": "Apache-2.0", - "devDependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.9", - "@fontsource/roboto": "^4.4.5", - "@fontsource/source-code-pro": "^4.5.0", - "@material-ui/core": "^4.11.4", - "@material-ui/icons": "^4.11.2", - "@material-ui/lab": "^4.0.0-alpha.59", - "@types/jsoneditor": "^8.6.1", - "@types/node": "^14.0.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.48.0", - "@typescript-eslint/parser": "^5.48.0", - "@vitejs/plugin-legacy": "^3.0.1", - "@vitejs/plugin-react": "^3.0.1", - "eslint": "^7.28.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-react": "^7.24.0", - "fdc3-1.2": "npm:@finos/fdc3@1.2.x", - "fdc3-2.0": "npm:@finos/fdc3@2.0.x", - "jsoneditor": "^9.5.6", - "lint-staged": "^11.0.0", - "mobx": "^6.3.2", - "mobx-react": "^7.2.0", - "nanoid": "^3.1.31", - "normalize.css": "^8.0.1", - "prettier": "^2.3.1", - "pretty-quick": "^3.1.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "terser": "^5.16.1", - "typescript": "^4.1.2", - "uuid": "^9.0.0", - "vite": "^4.5.3", - "web-vitals": "^1.0.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", - "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", - "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/standalone": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.21.8.tgz", - "integrity": "sha512-Od6cBJ8dm9wjAt+3olvO7N3s+8UsCkX3hH41Ew3BlFJw1QQtbctplq3kuwzzfk+YcmXE95k8fJCzbnhf32+BxQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@fontsource/roboto": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", - "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==", - "dev": true - }, - "node_modules/@fontsource/source-code-pro": { - "version": "4.5.14", - "resolved": "https://registry.npmjs.org/@fontsource/source-code-pro/-/source-code-pro-4.5.14.tgz", - "integrity": "sha512-EWE0djE7wFCBmExWa9oT1vIp+qj5MUroVvXWb9G7Ig4t4aXDd9QDidYZzMzNemb8gQxTdOzGmhx6EZnDTFMh5Q==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "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 - } - } - }, - "node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "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 - } - } - }, - "node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.61", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", - "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.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 - } - } - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "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 - } - } - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "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 - } - } - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "dev": true, - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sphinxxxx/color-conversion": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", - "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", - "dev": true - }, - "node_modules/@types/ace": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/ace/-/ace-0.0.48.tgz", - "integrity": "sha512-esV6hOWiDOZ6d7w5S11iLu6LQsPGe/9RPzhri7gNNLdrK1LFpO9/m7IZhQL6dat0JHICJ7l51zvHAiCgnPLLHA==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/jsoneditor": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-8.6.2.tgz", - "integrity": "sha512-ZzL6XANCYEWtYMfD5DLM5yjJdJ+cnuqtxOaJ5vV521HIDOuSyJM7eH8GXB72HL6HCZclqRr7Ix4UnHKeSS4WjA==", - "dev": true, - "dependencies": { - "@types/ace": "*", - "ajv": "^6.12.0" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.46", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.46.tgz", - "integrity": "sha512-n4yVT5FuY5NCcGHCosQSGvvCT74HhowymPN2OEcsHPw6U1NuxV9dvxWbrM2dnBukWjdMYzig1WfIkWdTTQJqng==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.59", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", - "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.5", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-legacy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-3.0.2.tgz", - "integrity": "sha512-9BT2mXunC7kQGKHP70BIbNZ/85P/KUMGKBS9CiV+XKNDZGNBjUnyrh3ofgtqgObmxKaEP2xJsEIRNIFJ+hjI8w==", - "dev": true, - "dependencies": { - "@babel/standalone": "^7.20.13", - "core-js": "^3.27.2", - "magic-string": "^0.27.0", - "regenerator-runtime": "^0.13.11", - "systemjs": "^6.13.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "terser": "^5.4.0", - "vite": "^4.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.20.12", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.1.0-beta.0" - } - }, - "node_modules/ace-builds": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.19.0.tgz", - "integrity": "sha512-7iRX9MsxyhMUsqfWpWrJVf7dmv0nQcidOQOhzfYLQnNELdVpaqXVWcewfQqEHP+M0RR2TNie0gqoxPSstUc8Ww==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.388", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.388.tgz", - "integrity": "sha512-xZ0y4zjWZgp65okzwwt00f2rYibkFPHUv9qBz+Vzn8cB9UXIo9Zc6Dw81LJYhhNt0G/vR1OJEfStZ49NKl0YxQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdc3-1.2": { - "name": "@finos/fdc3", - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@finos/fdc3/-/fdc3-1.2.0.tgz", - "integrity": "sha512-im/vqpS96qsCKMPkwR/Fg2t2FQtwh+/LOvTekIY0eYyuz/CZQoqhwcxwk/Re0pqJiA3inisV7DSfQ1JYLi+bxw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/fdc3-2.0": { - "name": "@finos/fdc3", - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@finos/fdc3/-/fdc3-2.0.1.tgz", - "integrity": "sha512-BdfTPFQKYjwTaPNHavhwmA/be4+zg/4265DAx0DoasCjnlhvLA8WB9IIJZheXTYtevE3KvGNsFTo52yYzVF3Jg==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", - "dev": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", - "dev": true - }, - "node_modules/jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsoneditor": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.10.0.tgz", - "integrity": "sha512-vmVSD3ubZ8jwkiDKVW5MB5ESI/MUm4trVUw5WnT4j5FV6m81liA2YfQ0l84PlN4qJ3DCeYWFWfprOUoCjzkDhQ==", - "dev": true, - "dependencies": { - "ace-builds": "^1.15.2", - "ajv": "^6.12.6", - "javascript-natural-sort": "^0.7.1", - "jmespath": "^0.16.0", - "json-source-map": "^0.6.1", - "jsonrepair": "^3.0.2", - "mobius1-selectr": "^2.4.13", - "picomodal": "^3.0.0", - "vanilla-picker": "^2.12.1" - } - }, - "node_modules/jsonrepair": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.1.0.tgz", - "integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==", - "dev": true, - "bin": { - "jsonrepair": "bin/cli.js" - } - }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/jss/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lint-staged": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", - "integrity": "sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==", - "dev": true, - "dependencies": { - "cli-truncate": "2.1.0", - "colorette": "^1.4.0", - "commander": "^8.2.0", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "execa": "^5.1.1", - "listr2": "^3.12.2", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "3.3.0", - "supports-color": "8.1.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mobius1-selectr": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", - "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==", - "dev": true - }, - "node_modules/mobx": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", - "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/mobx-react": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", - "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", - "dev": true, - "dependencies": { - "mobx-react-lite": "^3.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mobx-react-lite": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", - "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "dev": true - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/picomodal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", - "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==", - "dev": true - }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "dependencies": { - "semver-compare": "^1.0.0" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", - "dev": true - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-quick": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.3.tgz", - "integrity": "sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "execa": "^4.0.0", - "find-up": "^4.1.0", - "ignore": "^5.1.4", - "mri": "^1.1.5", - "multimatch": "^4.0.0" - }, - "bin": { - "pretty-quick": "bin/pretty-quick.js" - }, - "engines": { - "node": ">=10.13" - }, - "peerDependencies": { - "prettier": ">=2.0.0" - } - }, - "node_modules/pretty-quick/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-quick/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/pretty-quick/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/pretty-quick/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/pretty-quick/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-quick/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-quick/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/pretty-quick/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/systemjs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.1.tgz", - "integrity": "sha512-8ftwWd+XnQtZ/aGbatrN4QFNGrKJzmbtixW+ODpci7pyoTajg4sonPP8aFLESAcuVxaC1FyDESt+SpfFCH9rZQ==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/terser": { - "version": "5.17.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", - "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vanilla-picker": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz", - "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==", - "dev": true, - "dependencies": { - "@sphinxxxx/color-conversion": "^2.2.2" - } - }, - "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - } - } -} diff --git a/toolbox/fdc3-workbench/package.json b/toolbox/fdc3-workbench/package.json index dc47e5903..66eba4ad2 100644 --- a/toolbox/fdc3-workbench/package.json +++ b/toolbox/fdc3-workbench/package.json @@ -1,9 +1,12 @@ { "name": "fdc3-workbench", - "version": "2.0.0", + "version": "2.2.0-alpha.3", "private": true, - "homepage": ".", - "dependencies": {}, + "homepage": "https://fdc3.finos.org", + "repository": { + "type": "git", + "url": "git+https://github.com/finos/FDC3.git" + }, "license": "Apache-2.0", "scripts": { "dev": "vite", @@ -31,42 +34,42 @@ ] }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@eslint/compat": "^1.2.5", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.19.0", + "@finos/fdc3": "2.2.0-alpha.3", + "@fontsource/roboto": "5.1.0", + "@fontsource/source-code-pro": "5.1.0", + "@material-ui/core": "4.12.4", + "@material-ui/icons": "4.11.3", + "@material-ui/lab": "4.0.0-alpha.61", "@types/jsoneditor": "^8.6.1", - "@typescript-eslint/eslint-plugin": "^5.48.0", - "@typescript-eslint/parser": "^5.48.0", - "@vitejs/plugin-legacy": "^3.0.1", - "@vitejs/plugin-react": "^3.0.1", - "eslint": "^7.28.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-react": "^7.24.0", - "lint-staged": "^11.0.0", - "prettier": "^2.3.1", - "pretty-quick": "^3.1.0", - "terser": "^5.16.1", - "vite": "^4.5.3", - "@apidevtools/json-schema-ref-parser": "^9.0.9", - "@fontsource/roboto": "^4.4.5", - "@fontsource/source-code-pro": "^4.5.0", - "@material-ui/core": "^4.11.4", - "@material-ui/icons": "^4.11.2", - "@material-ui/lab": "^4.0.0-alpha.59", - "@types/node": "^14.0.0", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/uuid": "^8.3.4", + "@types/react-dom": "18.3.1", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "@vitejs/plugin-legacy": "^5.4.2", + "@vitejs/plugin-react": "^4.3.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-react": "^7.37.1", "fdc3-1.2": "npm:@finos/fdc3@1.2.x", - "fdc3-2.0": "npm:@finos/fdc3@2.0.x", - "jsoneditor": "^9.5.6", - "mobx": "^6.3.2", - "mobx-react": "^7.2.0", - "nanoid": "^3.1.31", + "globals": "^15.14.0", + "jsoneditor": "^9.10.5", + "lint-staged": "^15.2.10", + "mobx": "^6.13.3", + "mobx-react": "^7.6.0", + "nanoid": "^3.3.7", "normalize.css": "^8.0.1", + "pretty-quick": "^4.0.0", "react": "^17.0.2", "react-dom": "^17.0.2", - "typescript": "^4.1.2", - "uuid": "^9.0.0", - "web-vitals": "^1.0.1" + "terser": "^5.34.1", + "typescript": "^5.6.3", + "uuid": "^9.0.1", + "vite": "^5.4.9", + "web-vitals": "^1.1.2" }, "lint-staged": { "*.{ts,tsx,js,jsx}": [ diff --git a/toolbox/fdc3-workbench/src/App.tsx b/toolbox/fdc3-workbench/src/App.tsx index 2ab183532..7573055a0 100644 --- a/toolbox/fdc3-workbench/src/App.tsx +++ b/toolbox/fdc3-workbench/src/App.tsx @@ -22,8 +22,8 @@ import { ContextCreate } from "./components/ContextCreate"; import { Intents } from "./components/Intents"; import { AppChannels } from "./components/AppChannels"; import snackbarStore from "./store/SnackbarStore"; -import fdc3 from "./utility/Fdc3Api"; import "./App.css"; +import { getAgent } from "@finos/fdc3"; const mainTheme = createTheme({ palette: { @@ -45,16 +45,16 @@ const mainTheme = createTheme({ underline: "hover", }, MuiTableCell: { - padding: "normal" - } + padding: "normal", + }, }, overrides: { MuiTableCell: { root: { - padding: "1px" - } - } - } + padding: "1px", + }, + }, + }, }); mainTheme.typography.h4 = { @@ -101,17 +101,17 @@ const useStyles = makeStyles((theme: Theme) => cursor: "default", }, ".MuiInputBase-root": { - marginBlockEnd: "0px" + marginBlockEnd: "0px", }, ".MuiListSubheader-root": { lineHeight: "24px", - marginBlockStart: "10px" + marginBlockStart: "10px", }, ".MuiMenuItem-root": { fontSize: "0.9rem", marginBlockEnd: "5px", - marginBlockStart: "5px" - } + marginBlockStart: "5px", + }, }, root: { flexGrow: 1, @@ -218,7 +218,7 @@ export const App = observer(() => { useEffect(() => { (async () => { try { - await fdc3.fdc3Ready(5000); + await getAgent(); setFdc3Available(true); } catch (e) {} })(); @@ -280,15 +280,12 @@ export const App = observer(() => { FDC3 API not detected! - - An FDC3 desktop agent implementation was not found at{" "} - window.fdc3. - + An FDC3 desktop agent implementation was not found. For web applications to be FDC3-enabled, they need to run in the context of an agent that makes the FDC3 API available to the application. This desktop agent is also responsible for launching and - coordinating applications. It could be a browser extension, web app, or full-fledged desktop - container framework. + coordinating applications. It could be a browser extension, web app, or full-fledged desktop container + framework. See the FDC3 standard documentation for details on{" "} diff --git a/toolbox/fdc3-workbench/src/components/ChannelField.tsx b/toolbox/fdc3-workbench/src/components/ChannelField.tsx index 32f6e256b..599663bf0 100644 --- a/toolbox/fdc3-workbench/src/components/ChannelField.tsx +++ b/toolbox/fdc3-workbench/src/components/ChannelField.tsx @@ -119,7 +119,7 @@ const useStyles = makeStyles((theme: Theme) => }, rightPadding: { paddingRight: theme.spacing(0.5), - } + }, }) ); @@ -182,7 +182,9 @@ export const ChannelField = observer( let foundChannel = currentChannelList.find((currentChannel: any) => currentChannel.id === channel); if (foundChannel) { setContextItem(context); - runInAction(() => { foundChannel.context = context }); + runInAction(() => { + foundChannel.context = context; + }); } }; @@ -222,7 +224,9 @@ export const ChannelField = observer( newListener = newValue; } - runInAction(() => { foundChannel.currentListener = newListener }); + runInAction(() => { + foundChannel.currentListener = newListener; + }); foundChannel.listenerError = ""; }; @@ -294,7 +298,11 @@ export const ChannelField = observer( - + @@ -317,7 +325,7 @@ export const ChannelField = observer( filterOptions={filterOptions} options={contextListenersOptions} getOptionLabel={getOptionLabel} - getOptionSelected={(option, value) => option.type === value.type } + getOptionSelected={(option, value) => option.type === value.type} freeSolo={true} renderOption={(option) => option.type} renderInput={(params) => ( @@ -354,12 +362,21 @@ export const ChannelField = observer( - + -
    diff --git a/toolbox/fdc3-workbench/src/components/Channels.tsx b/toolbox/fdc3-workbench/src/components/Channels.tsx index ac7fe2737..cf3846e2c 100644 --- a/toolbox/fdc3-workbench/src/components/Channels.tsx +++ b/toolbox/fdc3-workbench/src/components/Channels.tsx @@ -84,7 +84,7 @@ const useStyles = makeStyles((theme: Theme) => rightAlign: { flexDirection: "row", justifyContent: "flex-end", - } + }, }) ); @@ -159,14 +159,17 @@ export const Channels = observer(({ handleTabChange }: { handleTabChange: any }) - + -
    @@ -237,7 +240,11 @@ export const Channels = observer(({ handleTabChange }: { handleTabChange: any }) - + @@ -280,13 +287,17 @@ export const Channels = observer(({ handleTabChange }: { handleTabChange: any }) - + - +
    diff --git a/toolbox/fdc3-workbench/src/components/ContextCreate.tsx b/toolbox/fdc3-workbench/src/components/ContextCreate.tsx index 5fa9d4666..c61a69f65 100644 --- a/toolbox/fdc3-workbench/src/components/ContextCreate.tsx +++ b/toolbox/fdc3-workbench/src/components/ContextCreate.tsx @@ -107,8 +107,8 @@ const useStyles: any = makeStyles((theme: Theme) => tableContainer: { maxHeight: 250, "& > table": { - width: "calc(100% - 4px)" - } + width: "calc(100% - 4px)", + }, }, }) ); diff --git a/toolbox/fdc3-workbench/src/components/ContextLinking.tsx b/toolbox/fdc3-workbench/src/components/ContextLinking.tsx index a20734073..0789679b3 100644 --- a/toolbox/fdc3-workbench/src/components/ContextLinking.tsx +++ b/toolbox/fdc3-workbench/src/components/ContextLinking.tsx @@ -70,7 +70,7 @@ const useStyles = makeStyles((theme: Theme) => rightAlign: { flexDirection: "row", justifyContent: "flex-end", - } + }, }) ); @@ -158,7 +158,7 @@ export const ContextLinking = observer(() => { Add context listener - + { - @@ -212,14 +211,17 @@ export const ContextLinking = observer(() => { - + - ); }); diff --git a/toolbox/fdc3-workbench/src/components/Header.tsx b/toolbox/fdc3-workbench/src/components/Header.tsx index 80448254d..32aaadf63 100644 --- a/toolbox/fdc3-workbench/src/components/Header.tsx +++ b/toolbox/fdc3-workbench/src/components/Header.tsx @@ -7,7 +7,8 @@ import React, { useEffect, useState } from "react"; import { createStyles, makeStyles, Theme } from "@material-ui/core/styles"; import { AppBar, Toolbar, Tooltip, Typography } from "@material-ui/core"; import WarningIcon from "@material-ui/icons/Warning"; -import fdc3, { ImplementationMetadata } from "../utility/Fdc3Api"; +import { getAgent } from "@finos/fdc3"; +import { ImplementationMetadata } from "../utility/Fdc3Api"; declare global { interface Window { @@ -74,7 +75,7 @@ export const Header = (props: { fdc3Available: boolean }) => { const classes = useStyles(); const [appInfo, setAppInfo] = useState(); const params = new URLSearchParams(window.location.search); - const paramVersion = params.get("fdc3Version")?.replace(/\/$/, '') || ''; + const paramVersion = params.get("fdc3Version")?.replace(/\/$/, "") || ""; const [chosenVersion, setChosenVersion] = useState("2.0"); let warningText = `Your FDC3 version (${appInfo?.fdc3Version}) doesn't match the version of the FDC3 Workbench you are using (${chosenVersion})`; const supportedVersion = ["2.0", "1.2"]; @@ -84,18 +85,17 @@ export const Header = (props: { fdc3Available: boolean }) => { //getInfo is not available in FDC3 < v1.2, handle any errors thrown when trying to use it const updateInfo = async () => { let implInfo: ImplementationMetadata | null = null; - + //Then if chosenVersion == "2.0" then implInfo = await implInfoPromise else implInfo = implInfoPromise (with handling for <1.2 where getInfo() doesn't exist at all. try { - - const implInfoPromise: Promise | ImplementationMetadata = fdc3.getInfo(); - if (paramVersion == "1.2" && (implInfoPromise as unknown as ImplementationMetadata).fdc3Version){ + const implInfoPromise = getAgent().then((agent) => agent.getInfo()); + if (paramVersion == "1.2" && (implInfoPromise as unknown as ImplementationMetadata).fdc3Version) { //should not expect a promise if we're really working with 1.2 - implInfo = (implInfoPromise as unknown as ImplementationMetadata); + implInfo = implInfoPromise as unknown as ImplementationMetadata; } else { implInfo = await implInfoPromise; } - + let displayInfo = { fdc3Version: "not specified", provider: "not specified", @@ -107,20 +107,19 @@ export const Header = (props: { fdc3Available: boolean }) => { }; let mergedAppMetaData = Object.assign({}, displayInfo.appMetadata, implInfo.appMetadata); - displayInfo = Object.assign(displayInfo, implInfo, {appMetadata: mergedAppMetaData}); + displayInfo = Object.assign(displayInfo, implInfo, { appMetadata: mergedAppMetaData }); - setAppInfo(displayInfo); + setAppInfo(displayInfo); } catch (e) { console.error("Failed to retrieve FDC3 implementation info", e); } - if (paramVersion) { setChosenVersion(paramVersion); - } else if(implInfo?.fdc3Version && implInfo.fdc3Version == "2.1") { + } else if (implInfo?.fdc3Version && implInfo.fdc3Version == "2.1") { //API version 2.1 is backwards compatible with 2.0 setChosenVersion("2.0"); - }else if(implInfo?.fdc3Version && supportedVersion.includes(implInfo.fdc3Version)) { + } else if (implInfo?.fdc3Version && supportedVersion.includes(implInfo.fdc3Version)) { setChosenVersion(implInfo.fdc3Version); } else { setChosenVersion("2.0"); @@ -143,12 +142,14 @@ export const Header = (props: { fdc3Available: boolean }) => { - version:  + version:  {supportedVersion.map((ver, index) => ( {ver === chosenVersion ? ( //version 2.0 serves for both 2.0 and 2.1 - {ver == "2.0" ? "2.0+" : ver} + + {ver == "2.0" ? "2.0+" : ver} + ) : ( {ver == "2.0" ? "2.0+" : ver} @@ -166,7 +167,8 @@ export const Header = (props: { fdc3Available: boolean }) => { FDC3 Version {appInfo?.fdc3Version ? ( - ((chosenVersion === appInfo.fdc3Version) || (chosenVersion === "2.0" && appInfo.fdc3Version === "2.1")) ? ( + chosenVersion === appInfo.fdc3Version || + (chosenVersion === "2.0" && appInfo.fdc3Version === "2.1") ? ( {appInfo.fdc3Version} ) : ( @@ -189,13 +191,15 @@ export const Header = (props: { fdc3Available: boolean }) => { {appInfo?.providerVersion ? appInfo.providerVersion : "unknown"} {chosenVersion != "1.2" ? ( - - My AppId - - {appInfo?.appMetadata?.appId ? appInfo.appMetadata.appId : "unknown"} - - - ) : ""} + + My AppId + + {appInfo?.appMetadata?.appId ? appInfo.appMetadata.appId : "unknown"} + + + ) : ( + "" + )} diff --git a/toolbox/fdc3-workbench/src/components/Intents.tsx b/toolbox/fdc3-workbench/src/components/Intents.tsx index 728f1fbce..00bb460f3 100644 --- a/toolbox/fdc3-workbench/src/components/Intents.tsx +++ b/toolbox/fdc3-workbench/src/components/Intents.tsx @@ -4,7 +4,14 @@ */ import React, { ChangeEvent, ReactElement, useEffect, useState } from "react"; -import fdc3, { AppMetadata, ContextType, IntentResolution, IntentTargetOption } from "../utility/Fdc3Api"; +import { + AppMetadata, + ContextType, + getTargetOptions, + getTargetOptionsForContext, + IntentResolution, + IntentTargetOption, +} from "../utility/Fdc3Api"; import { toJS } from "mobx"; import { createStyles, makeStyles, Theme } from "@material-ui/core/styles"; import { @@ -21,7 +28,7 @@ import { TextField, Switch, Link, - ListSubheader + ListSubheader, } from "@material-ui/core"; import { observer } from "mobx-react"; import FileCopyIcon from "@material-ui/icons/FileCopy"; @@ -41,6 +48,7 @@ import { FormControlLabel } from "@material-ui/core"; import { RadioGroup } from "@material-ui/core"; import { Alert, ToggleButton, ToggleButtonGroup } from "@material-ui/lab"; import InfoOutlinedIcon from "@material-ui/icons/InfoOutlined"; +import { getAgent } from "@finos/fdc3"; // interface copied from lib @material-ui/lab/Autocomplete interface FilterOptionsState { @@ -233,9 +241,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) const targetObj = JSON.parse(contextTargetApp); let target = targetObj as AppMetadata; - setIntentForContextResolution( - await intentStore.raiseIntentForContext(raiseIntentWithContextContext, target) - ); + setIntentForContextResolution(await intentStore.raiseIntentForContext(raiseIntentWithContextContext, target)); return; } catch (e) { console.error("Error passing raiseIntentForContext target option value!", contextTargetApp, e); @@ -257,7 +263,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) setTargetOptionsforContext([]); }; - const handleTargetChange = (event: React.ChangeEvent<{value: unknown}>) => { + const handleTargetChange = (event: React.ChangeEvent<{ value: unknown }>) => { if (event.target.value === "None") { setTargetApp("None"); } else { @@ -271,7 +277,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) } else { setContextTargetApp(event.target.value as string); } -}; + }; const handleChangeListener = (setValue: ListenerSetValue, setError: ListenerSetError) => (event: React.ChangeEvent<{}>, newValue: any) => { @@ -314,16 +320,19 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) } else if (!raiseIntentContext) { setRaiseIntentError("Select a context first"); } else { - const intentTargetOptions: IntentTargetOption[] = await fdc3.getTargetOptions(intentValue.value, toJS(raiseIntentContext)) + const intentTargetOptions: IntentTargetOption[] = await getTargetOptions( + intentValue.value, + toJS(raiseIntentContext) + ); - if(intentTargetOptions.length === 0) { + if (intentTargetOptions.length === 0) { setUseTargets(false); clearTargets(); return; } const menuItems: ReactElement[] = []; - + //check if there are any target options if (intentTargetOptions.length === 0) { menuItems.push( @@ -342,7 +351,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) menuItems.push(Target apps); intentTargetOptions.forEach((option) => { const targetLabel: string = option.metadata.title ?? option.appId; - if(option.launchNew) { + if (option.launchNew) { menuItems.push( {targetLabel} @@ -350,18 +359,18 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) ); } }); - + //check if there are any target options - if (intentTargetOptions.find((value) => value?.instances.length > 0)){ + if (intentTargetOptions.find((value) => value?.instances.length > 0)) { //add app instance targets menuItems.push(Target app instances); intentTargetOptions.forEach((option) => { const targetLabel: string = option.metadata.title ?? option.appId; option?.instances.forEach((instance) => { menuItems.push( - - {`${targetLabel} (${instance.instanceId})`} - + + {`${targetLabel} (${instance.instanceId})`} + ); }); }); @@ -370,8 +379,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) setTargetOptions(menuItems); } - - } + }; fetchAppsAndInstances(); }; @@ -382,10 +390,9 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) if (!raiseIntentWithContextContext) { //no settable error at the moment... setRaiseIntentError("enter context name"); } else { - const contextTargetOptions = await fdc3.getTargetOptionsForContext(toJS(raiseIntentWithContextContext)); + const contextTargetOptions = await getTargetOptionsForContext(toJS(raiseIntentWithContextContext)); if (Object.keys(contextTargetOptions).length > 0) { - menuItems.push( None @@ -396,7 +403,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) menuItems.push(Target apps); contextTargetOptions.forEach((option) => { const targetLabel: string = option.metadata.title ?? option.appId; - if(option.launchNew) { + if (option.launchNew) { menuItems.push( {targetLabel} @@ -407,24 +414,24 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) //check if there are any target options //check if there are any target options - if (contextTargetOptions.find((value) => value.instances.length > 0)){ + if (contextTargetOptions.find((value) => value.instances.length > 0)) { //add app instance targets - menuItems.push(Target app instances); + menuItems.push( + Target app instances + ); contextTargetOptions.forEach((option) => { const targetLabel: string = option.metadata.title ?? option.appId; option?.instances.forEach((instance) => { menuItems.push( - - {`${targetLabel} (${instance.instanceId})`} - + + {`${targetLabel} (${instance.instanceId})`} + ); }); }); } - } } - } catch (e) { console.log(e); } @@ -439,7 +446,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) setTargetOptionsforContext(menuItems); }; fetchIntents(); - } + }; const handleAddIntentListener = () => { if (!intentListener) { @@ -521,13 +528,12 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) return; } setRaiseIntentError(false); - let appIntents = await fdc3.findIntentsByContext(toJS(raiseIntentContext)); + let appIntents = await getAgent().then((agent) => agent.findIntentsByContext(toJS(raiseIntentContext))); setUseTargets(false); clearTargets(); if (appIntents.length > 0) { - setIntentsForContext( appIntents.map(({ intent }: { intent: any }) => { return { @@ -558,8 +564,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) if (!raiseIntentWithContextContext) { setUseContextTargets(false); return; - } - + } }, [raiseIntentWithContextContext]); useEffect(() => { @@ -676,7 +681,11 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) - + @@ -711,7 +720,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) } label="Select Target" - disabled={!raiseIntentWithContextContext } + disabled={!raiseIntentWithContextContext} /> @@ -773,7 +782,11 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) - + @@ -858,7 +871,11 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) - + @@ -980,9 +997,12 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any }) )} - Desktop Agents often require apps that listen for intents to include the intent in their appD record. Refer to your Desktop Agent's documentation if the workbench doesn't appear in the intent resolver. + + Desktop Agents often require apps that listen for intents to include the intent in their appD record. + Refer to your Desktop Agent's documentation if the workbench doesn't appear in the intent + resolver. + - diff --git a/toolbox/fdc3-workbench/src/fixtures/codeExamples.ts b/toolbox/fdc3-workbench/src/fixtures/codeExamples.ts index 986397bb0..a23765549 100644 --- a/toolbox/fdc3-workbench/src/fixtures/codeExamples.ts +++ b/toolbox/fdc3-workbench/src/fixtures/codeExamples.ts @@ -3,8 +3,7 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ export const codeExamples = { - userChannels: -`// get all user channels + userChannels: `// get all user channels const channels = await fdc3.getUserChannels(); // create UI to pick from the user channels @@ -12,15 +11,13 @@ const channels = await fdc3.getUserChannels(); // join the channel on selection fdc3.joinUserChannel(selectedChannel.id);`, - getCurrentUserChannel: -`// get the current channel membership + getCurrentUserChannel: `// get the current channel membership let current = await fdc3.getCurrentChannel(); //leave the current channel\nawait fdc3.leaveCurrentChannel(); //the fdc3Listener will now cease receiving context`, - broadcast: -`const instrument = { + broadcast: `const instrument = { type: 'fdc3.instrument', id: { ticker: 'AAPL' @@ -29,8 +26,7 @@ let current = await fdc3.getCurrentChannel(); fdc3.broadcast(instrument);`, - appChannelBroadcast: -`const instrument = { + appChannelBroadcast: `const instrument = { type: 'fdc3.instrument', id: { ticker: 'AAPL' @@ -40,12 +36,12 @@ fdc3.broadcast(instrument);`, appChannel.broadcast(instrument);`, raiseIntent: (context: string, intent: string) => -`//Raise an intent with a specified context + `//Raise an intent with a specified context let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; fdc3.raiseIntent("${intent !== "null" ? intent : "ViewChart"}", context);`, -raiseIntentTarget: (context: string, intent: string) => -`//Raise an intent with a specified context + raiseIntentTarget: (context: string, intent: string) => + `//Raise an intent with a specified context let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; //Find appId in promise result let intent = await fdc3.findIntentsByContext(context); @@ -53,7 +49,7 @@ let appId = intent[0].apps[0].appId; fdc3.raiseIntent("${intent !== "null" ? intent : "ViewChart"}", context, {appId});`, raiseIntentInstance: (context: string, intent: string) => -`//Raise an intent with a specified context + `//Raise an intent with a specified context let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; //Find appId in promise result let intent = await fdc3.findIntentsByContext(context); @@ -62,8 +58,7 @@ let appId = intent[0].apps[0].appId; let instanceId = instances[0].instanceId; fdc3.raiseIntent("${intent !== "null" ? intent : "ViewChart"}", context, {appId, instanceId});`, - contextListener: -`// any context + contextListener: `// any context const listener = fdc3.addContextListener(null, context => { //add context handling code here }); @@ -73,8 +68,7 @@ const contactListener = fdc3.addContextListener('fdc3.contact', contact => { //add context handling code here });`, - appChannelContextListener: -`// any context + appChannelContextListener: `// any context const listener = appChannel.addContextListener(null, context => { //add context handling code here }); @@ -84,13 +78,11 @@ const contactListener = appChannel.addContextListener('fdc3.contact', contact => //add context handling code here });`, - intentListener: -`const listener = fdc3.addIntentListener('StartChat', context => { + intentListener: `const listener = fdc3.addIntentListener('StartChat', context => { // start chat has been requested by another application });`, - intentListenerWithContextResult: -`const instrument = { + intentListenerWithContextResult: `const instrument = { type: 'fdc3.instrument', id: { ticker: 'AAPL' @@ -102,28 +94,27 @@ const listener = fdc3.addIntentListener('StartChat', context => { return instrument; });`, - intentListenerWithAppChannel: -`const listener = fdc3.addIntentListener('StartChat', context => { + intentListenerWithAppChannel: `const listener = fdc3.addIntentListener('StartChat', context => { // start chat has been requested by another application const channel = await appChannelStore.getOrCreateChannel(channelName); return channel; });`, - intentListenerWithPrivateChannel: -`const listener = fdc3.addIntentListener('StartChat', context => { + intentListenerWithPrivateChannel: `const listener = fdc3.addIntentListener('StartChat', context => { // start chat has been requested by another application const channel = await fdc3.createPrivateChannel(); return channel; });`, raiseIntentForContext: (context: string) => -`let context = ${ - context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; + `let context = ${ + context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}' + }; const intentResolution = await fdc3.raiseIntentForContext(context);`, raiseIntentForContextTarget: (context: string) => -`let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; + `let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; //Find appId in promise result let intent = await fdc3.findIntentsByContext(context); @@ -131,7 +122,7 @@ let appId = intent[0].apps[0].appId; const intentResolution = await fdc3.raiseIntentForContext(context, {appId});`, raiseIntentForContextInstance: (context: string) => -`let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; + `let context = ${context !== "null" ? context : '{type: "fdc3.instrument", name: "Tesla, inc.", id: {ticker: "TSLA"}}'}; //Find appId in promise result let intent = await fdc3.findIntentsByContext(context); diff --git a/toolbox/fdc3-workbench/src/fixtures/contexts.ts b/toolbox/fdc3-workbench/src/fixtures/contexts.ts index 6dc3829ab..371b4835b 100644 --- a/toolbox/fdc3-workbench/src/fixtures/contexts.ts +++ b/toolbox/fdc3-workbench/src/fixtures/contexts.ts @@ -15,22 +15,22 @@ export const contexts: ContextItem[] = [ { type: "fdc3.instrument", id: { - ticker: "AAPL" - } + ticker: "AAPL", + }, }, { type: "fdc3.instrument", id: { - ticker: "GOOG" - } - } + ticker: "GOOG", + }, + }, ], range: { type: "fdc3.timeRange", startTime: "2020-09-01T08:00:00.000Z", - endTime: "2020-10-31T08:00:00.000Z" + endTime: "2020-10-31T08:00:00.000Z", }, - style: "line" + style: "line", }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/chart.schema.json"), }, @@ -38,75 +38,80 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Chat Initialization example", template: { - type: 'fdc3.chat.initSettings', - chatName: 'Chat ABCD', + type: "fdc3.chat.initSettings", + chatName: "Chat ABCD", members: { - type: 'fdc3.contactList', - contacts: [{ - type: 'fdc3.contact', - name: 'Jane Doe', - id: { - email: 'jane@mail.com' - } - },{ - type: 'fdc3.contact', - name: 'John Doe', - id: { - email: 'john@mail.com' + type: "fdc3.contactList", + contacts: [ + { + type: "fdc3.contact", + name: "Jane Doe", + id: { + email: "jane@mail.com", + }, + }, + { + type: "fdc3.contact", + name: "John Doe", + id: { + email: "john@mail.com", + }, }, - }] + ], }, options: { groupRecipients: true, // one chat with both contacts isPublic: false, // private chat room allowHistoryBrowsing: true, - allowMessageCopy: true + allowMessageCopy: true, }, message: { - type: 'fdc3.message', - text: { - 'text/plain': 'Hey all, can we discuss the issue together? I attached a screenshot' - }, - entities: { - 0: { - type: 'fdc3.fileAttachment', - data: { - name: 'myImage.png', - dataUri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII' - } - } - } - } + type: "fdc3.message", + text: { + "text/plain": "Hey all, can we discuss the issue together? I attached a screenshot", + }, + entities: { + 0: { + type: "fdc3.fileAttachment", + data: { + name: "myImage.png", + dataUri: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII", + }, + }, + }, + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/chatInitSettings.schema.json"), }, { uuid: uuidv4(), id: "Chat Message example", - template:{ + template: { type: "fdc3.chat.message", chatRoom: { - type: 'fdc3.chat.room', + type: "fdc3.chat.room", providerName: "Symphony", id: { - streamId: "j75xqXy25NBOdacUI3FNBH" - } + streamId: "j75xqXy25NBOdacUI3FNBH", + }, }, message: { - type: 'fdc3.message', + type: "fdc3.message", text: { - 'text/plain': 'Hey all, can we discuss the issue together? I attached a screenshot' + "text/plain": "Hey all, can we discuss the issue together? I attached a screenshot", }, entities: { - 0: { - type: 'fdc3.fileAttachment', + 0: { + type: "fdc3.fileAttachment", data: { - name: 'myImage.png', - dataUri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII' - } - } - } - } + name: "myImage.png", + dataUri: + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII", + }, + }, + }, + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/chatMessage.schema.json"), }, @@ -117,11 +122,11 @@ export const contexts: ContextItem[] = [ type: "fdc3.chat.room", providerName: "Symphony", id: { - streamId: "j75xqXy25NBOdacUI3FNBH" + streamId: "j75xqXy25NBOdacUI3FNBH", }, url: "http://symphony.com/ref/room/j75xqXy25NBOdacUI3FNBH___pqSsuJRdA", - name: 'My new room' - }, + name: "My new room", + }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/chatRoom.schema.json"), }, { @@ -133,22 +138,22 @@ export const contexts: ContextItem[] = [ { type: "fdc3.instrument", id: { - ticker: "AAPL" - } + ticker: "AAPL", + }, }, { type: "fdc3.contact", name: "Jane Doe", id: { - email: "jane.doe@mail.com" - } + email: "jane.doe@mail.com", + }, }, { type: "fdc3.organization", - name: "Symphony" + name: "Symphony", }, - "#OrderID45788422" - ] + "#OrderID45788422", + ], }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/chatSearchCriteria.schema.json"), }, @@ -204,11 +209,11 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Currency example", template: { - type: 'fdc3.currency', - name: 'US Dollar', + type: "fdc3.currency", + name: "US Dollar", id: { - CURRENCY_ISOCODE: "USD" - } + CURRENCY_ISOCODE: "USD", + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/currency.schema.json"), }, @@ -216,17 +221,17 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Email example", template: { - type: 'fdc3.email', + type: "fdc3.email", recipients: { - type: 'fdc3.contact', - name: 'Jane Doe', - id: { - email: 'jane.doe@example.com' - } + type: "fdc3.contact", + name: "Jane Doe", + id: { + email: "jane.doe@example.com", + }, }, - subject: 'The information you requested', - textBody: 'Blah, blah, blah ...' - }, + subject: "The information you requested", + textBody: "Blah, blah, blah ...", + }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/email.schema.json"), }, { @@ -250,7 +255,7 @@ export const contexts: ContextItem[] = [ type: "fdc3.instrument", name: "Apple", id: { - ticker: "AAPL" + ticker: "AAPL", }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/instrument.schema.json"), @@ -281,40 +286,41 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Interaction example", template: { - type: 'fdc3.interaction', + type: "fdc3.interaction", participants: { - type: 'fdc3.contactList', + type: "fdc3.contactList", contacts: [ { - type: 'fdc3.contact', - name: 'Jane Doe', + type: "fdc3.contact", + name: "Jane Doe", id: { - email: 'jane.doe@mail.com' - } - }, + email: "jane.doe@mail.com", + }, + }, { - type: 'fdc3.contact', - name: 'John Doe', + type: "fdc3.contact", + name: "John Doe", id: { - email: 'john.doe@mail.com' - } + email: "john.doe@mail.com", + }, }, - ] + ], }, - interactionType: 'Instant Message', + interactionType: "Instant Message", timeRange: { - type: 'fdc3.timeRange', - startTime: '2022-02-10T15:12:00Z' + type: "fdc3.timeRange", + startTime: "2022-02-10T15:12:00Z", }, - description: 'Laboris libero dapibus fames elit adipisicing eu, fermentum, dignissimos laboriosam, erat, risus qui deserunt. Praesentium! Reiciendis. Hic harum nostrud, harum potenti amet? Mauris. Pretium aliquid animi, eget eiusmod integer proident. Architecto ipsum blandit ducimus, possimus illum sunt illum necessitatibus ab litora sed, nonummy integer minus corrupti ducimus iste senectus accumsan, fugiat nostrud? Pede vero dictumst excepturi, iure earum consequuntur voluptatum', - initiator: { - type: 'fdc3.contact', - name: 'Jane Doe', + description: + "Laboris libero dapibus fames elit adipisicing eu, fermentum, dignissimos laboriosam, erat, risus qui deserunt. Praesentium! Reiciendis. Hic harum nostrud, harum potenti amet? Mauris. Pretium aliquid animi, eget eiusmod integer proident. Architecto ipsum blandit ducimus, possimus illum sunt illum necessitatibus ab litora sed, nonummy integer minus corrupti ducimus iste senectus accumsan, fugiat nostrud? Pede vero dictumst excepturi, iure earum consequuntur voluptatum", + initiator: { + type: "fdc3.contact", + name: "Jane Doe", id: { - email: 'jane.doe@mail.com' - } + email: "jane.doe@mail.com", + }, }, - origin: 'Outlook' + origin: "Outlook", }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/interaction.schema.json"), }, @@ -322,7 +328,7 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Nothing example", template: { - type: 'fdc3.nothing' + type: "fdc3.nothing", }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/nothing.schema.json"), }, @@ -333,22 +339,22 @@ export const contexts: ContextItem[] = [ type: "fdc3.order", name: "...", id: { - myOMS: "12345" + myOMS: "12345", }, details: { product: { type: "fdc3.product", id: { - productId: "ABC123" + productId: "ABC123", }, instrument: { type: "fdc3.instrument", id: { - ticker: "MSFT" - } - } - } - } + ticker: "MSFT", + }, + }, + }, + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/order.schema.json"), }, @@ -426,14 +432,14 @@ export const contexts: ContextItem[] = [ template: { type: "fdc3.product", id: { - productId: "ABC123" + productId: "ABC123", }, instrument: { - type: "fdc3.instrument", - id: { - ticker: "MSFT" - } - } + type: "fdc3.instrument", + id: { + ticker: "MSFT", + }, + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/product.schema.json"), }, @@ -444,20 +450,20 @@ export const contexts: ContextItem[] = [ type: "fdc3.trade", name: "...", id: { - myEMS: "12345" + myEMS: "12345", }, product: { type: "fdc3.product", id: { - productId: "ABC123" + productId: "ABC123", }, - instrument: { + instrument: { type: "fdc3.instrument", id: { - ticker: "MSFT" - } - } - } + ticker: "MSFT", + }, + }, + }, }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/trade.schema.json"), }, @@ -471,10 +477,10 @@ export const contexts: ContextItem[] = [ type: "fdc3.contact", name: "Jane Doe", id: { - email: "jane.doe@mail.com" - } + email: "jane.doe@mail.com", + }, }, - message: "record with id 'jane.doe@mail.com' was updated" + message: "record with id 'jane.doe@mail.com' was updated", }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/transactionresult.schema.json"), }, @@ -482,11 +488,11 @@ export const contexts: ContextItem[] = [ uuid: uuidv4(), id: "Valuation example", template: { - type: 'fdc3.valuation', + type: "fdc3.valuation", value: 500.0, price: 5.0, - CURRENCY_ISOCODE: 'USD', - expiryTime: "2022-05-13T16:16:24+01:00" + CURRENCY_ISOCODE: "USD", + expiryTime: "2022-05-13T16:16:24+01:00", }, schemaUrl: new URL("https://fdc3.finos.org/schemas/next/context/valuation.schema.json"), }, diff --git a/toolbox/fdc3-workbench/src/fixtures/intentTypes.ts b/toolbox/fdc3-workbench/src/fixtures/intentTypes.ts index 904f2ca44..0920baf56 100644 --- a/toolbox/fdc3-workbench/src/fixtures/intentTypes.ts +++ b/toolbox/fdc3-workbench/src/fixtures/intentTypes.ts @@ -78,5 +78,5 @@ export const intentTypes: Array<{ title: string; value: string }> = [ { title: "ViewResearch", value: "ViewResearch", - } + }, ]; diff --git a/toolbox/fdc3-workbench/src/fixtures/logMessages.ts b/toolbox/fdc3-workbench/src/fixtures/logMessages.ts index ee7386fe3..ce5cf5561 100644 --- a/toolbox/fdc3-workbench/src/fixtures/logMessages.ts +++ b/toolbox/fdc3-workbench/src/fixtures/logMessages.ts @@ -4,11 +4,7 @@ */ import { logMessagesName, logMessagesType } from "../store/SystemLogStore"; -type LogMessages = { - [name in logMessagesName]: { - [type in logMessagesType]?: string; - }; -}; +type LogMessages = Record>>; export const getLogMessage = (name: logMessagesName, type: logMessagesType, value: string = ""): string => { const logMessages: LogMessages = { diff --git a/toolbox/fdc3-workbench/src/fixtures/openApiDocs.ts b/toolbox/fdc3-workbench/src/fixtures/openApiDocs.ts index 6363be559..8069e04c9 100644 --- a/toolbox/fdc3-workbench/src/fixtures/openApiDocs.ts +++ b/toolbox/fdc3-workbench/src/fixtures/openApiDocs.ts @@ -2,7 +2,7 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright FINOS FDC3 contributors - see NOTICE file */ - import React from "react"; +import React from "react"; export const openApiDocsLink = (event: React.MouseEvent) => { event.preventDefault(); diff --git a/toolbox/fdc3-workbench/src/index.tsx b/toolbox/fdc3-workbench/src/index.tsx index 030b00922..6252fa9a4 100644 --- a/toolbox/fdc3-workbench/src/index.tsx +++ b/toolbox/fdc3-workbench/src/index.tsx @@ -8,7 +8,7 @@ import ReactDOM from "react-dom"; import App from "./App"; //make sure URL ends with trailing / for resolution of image paths -if (!window.location.href.endsWith("/")){ +if (!window.location.href.endsWith("/")) { window.location.href = `${window.location.href}/`; } diff --git a/toolbox/fdc3-workbench/src/store/AppChannelStore.tsx b/toolbox/fdc3-workbench/src/store/AppChannelStore.tsx index 1fd94c290..62682ec0c 100644 --- a/toolbox/fdc3-workbench/src/store/AppChannelStore.tsx +++ b/toolbox/fdc3-workbench/src/store/AppChannelStore.tsx @@ -3,9 +3,10 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ import { makeObservable, observable, action, runInAction, toJS } from "mobx"; -import fdc3, { ContextType, Channel, Fdc3Listener } from "../utility/Fdc3Api"; +import { ContextType, Fdc3Listener } from "../utility/Fdc3Api"; import systemLogStore from "./SystemLogStore"; import { nanoid } from "nanoid"; +import { Channel, getAgent } from "@finos/fdc3"; interface ListenerOptionType { title: string; @@ -41,7 +42,7 @@ class AppChannelStore { async getOrCreateChannel(channelId: string) { try { - const currentAppChannelObj = await fdc3.getOrCreateChannel(channelId); + const currentAppChannelObj = await getAgent().then((agent) => agent.getOrCreateChannel(channelId)); if (currentAppChannelObj) { const record = { id: channelId, @@ -130,8 +131,9 @@ class AppChannelStore { async leaveChannel() { try { + const agent = await getAgent(); //check that we're on a channel - let currentChannel = await fdc3.getCurrentChannel(); + let currentChannel = await agent.getCurrentChannel(); if (!currentChannel) { systemLogStore.addLog({ name: "leaveChannel", @@ -140,8 +142,8 @@ class AppChannelStore { variant: "text", }); } else { - await fdc3.leaveCurrentChannel(); - currentChannel = await fdc3.getCurrentChannel(); + await agent.leaveCurrentChannel(); + currentChannel = await agent.getCurrentChannel(); const isSuccess = currentChannel === null; runInAction(() => { diff --git a/toolbox/fdc3-workbench/src/store/ChannelStore.ts b/toolbox/fdc3-workbench/src/store/ChannelStore.ts index f35b58885..dcf17b0f5 100644 --- a/toolbox/fdc3-workbench/src/store/ChannelStore.ts +++ b/toolbox/fdc3-workbench/src/store/ChannelStore.ts @@ -3,8 +3,8 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ import { makeObservable, observable, action, runInAction } from "mobx"; -import fdc3, { Channel } from "../utility/Fdc3Api"; import systemLogStore from "./SystemLogStore"; +import { Channel, getAgent } from "@finos/fdc3"; class ChannelStore { userChannels: Channel[] = []; @@ -25,8 +25,9 @@ class ChannelStore { } async getCurrentUserChannel() { + const agent = await getAgent(); try { - const userChannel = await fdc3.getCurrentChannel(); + const userChannel = await agent.getCurrentChannel(); runInAction(() => { systemLogStore.addLog({ name: "getCurrentChannel", @@ -41,6 +42,7 @@ class ChannelStore { systemLogStore.addLog({ name: "getCurrentChannel", type: "error", + body: (e as Error).message ?? (e as string), variant: "text", }); }); @@ -48,45 +50,35 @@ class ChannelStore { } async getUserChannels() { + const agent = await getAgent(); //defer retrieving channels until fdc3 API is ready - fdc3 - .fdc3Ready(5000) - .then(async () => { - try { - const userChannels = await fdc3.getUserChannels(); - const currentUserChannel = await fdc3.getCurrentChannel(); + try { + const userChannels = await agent.getUserChannels(); + const currentUserChannel = await agent.getCurrentChannel(); - runInAction(() => { - systemLogStore.addLog({ - name: "getChannels", - type: "success", - }); - this.userChannels = userChannels; - this.currentUserChannel = currentUserChannel; - }); - } catch (e) { - systemLogStore.addLog({ - name: "getChannels", - type: "error", - variant: "code", - body: JSON.stringify(e, null, 4), - }); - } - }) - .catch((reason) => { + runInAction(() => { systemLogStore.addLog({ - name: "getFdc3", - type: "error", - variant: "text", - value: reason, + name: "getChannels", + type: "success", }); + this.userChannels = userChannels; + this.currentUserChannel = currentUserChannel; + }); + } catch (e) { + systemLogStore.addLog({ + name: "getChannels", + type: "error", + variant: "code", + body: JSON.stringify(e, null, 4), }); + } } async joinUserChannel(channelId: string) { + const agent = await getAgent(); try { - await fdc3.joinUserChannel(channelId); - const currentUserChannel = await fdc3.getCurrentChannel(); + await agent.joinUserChannel(channelId); + const currentUserChannel = await agent.getCurrentChannel(); const isSuccess = currentUserChannel !== null; runInAction(() => { @@ -110,9 +102,10 @@ class ChannelStore { } async leaveUserChannel() { + const agent = await getAgent(); try { //check that we're on a channel - let currentUserChannel = await fdc3.getCurrentChannel(); + let currentUserChannel = await agent.getCurrentChannel(); if (!currentUserChannel) { systemLogStore.addLog({ name: "leaveChannel", @@ -121,8 +114,8 @@ class ChannelStore { variant: "text", }); } else { - await fdc3.leaveCurrentChannel(); - currentUserChannel = await fdc3.getCurrentChannel(); + await agent.leaveCurrentChannel(); + currentUserChannel = await agent.getCurrentChannel(); const isSuccess = currentUserChannel === null; runInAction(() => { diff --git a/toolbox/fdc3-workbench/src/store/ContextStore.ts b/toolbox/fdc3-workbench/src/store/ContextStore.ts index 058610c4e..9452602a6 100644 --- a/toolbox/fdc3-workbench/src/store/ContextStore.ts +++ b/toolbox/fdc3-workbench/src/store/ContextStore.ts @@ -3,11 +3,12 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ import { makeObservable, observable, runInAction, action, toJS } from "mobx"; -import fdc3, { ContextType, Fdc3Listener } from "../utility/Fdc3Api"; +import { ContextType, Fdc3Listener } from "../utility/Fdc3Api"; import { nanoid } from "nanoid"; import { contexts } from "../fixtures/contexts"; import systemLogStore from "./SystemLogStore"; import { v4 as uuidv4 } from "uuid"; +import { getAgent } from "@finos/fdc3"; export type ContextItem = { id: string; @@ -47,7 +48,7 @@ class ContextStore { } } } catch (err) { - console.log("Failed to parse context list from localstorage"); + console.error("Failed to parse context list from localstorage", err); } if (usingDefaultContexts) { this.updateLocalStorage(JSON.stringify(contexts)); @@ -90,6 +91,8 @@ class ContextStore { } async broadcast(context: ContextType) { + const agent = await getAgent(); + if (!context) { systemLogStore.addLog({ name: "broadcast", @@ -100,7 +103,7 @@ class ContextStore { return; } else { //check that we're on a channel - let currentChannel = await fdc3.getCurrentChannel(); + let currentChannel = await agent.getCurrentChannel(); if (!currentChannel) { systemLogStore.addLog({ name: "broadcast", @@ -110,7 +113,7 @@ class ContextStore { }); } else { try { - await fdc3.broadcast(toJS(context)); + await agent.broadcast(toJS(context)); systemLogStore.addLog({ name: "broadcast", type: "success", @@ -134,8 +137,10 @@ class ContextStore { if (typeof contextType === "string") { const listenerId = nanoid(); + const agent = await getAgent(); + // TODO: remove window after fixing https://github.com/finos/FDC3/issues/435 - const contextListener = await fdc3.addContextListener( + const contextListener = await agent.addContextListener( contextType.toLowerCase() === "all" ? null : contextType, (context: ContextType, metaData?: any) => { const currentListener = this.contextListeners.find(({ id }) => id === listenerId); diff --git a/toolbox/fdc3-workbench/src/store/IntentStore.ts b/toolbox/fdc3-workbench/src/store/IntentStore.ts index 972b76e34..d2d83a797 100644 --- a/toolbox/fdc3-workbench/src/store/IntentStore.ts +++ b/toolbox/fdc3-workbench/src/store/IntentStore.ts @@ -3,19 +3,13 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ import { makeObservable, observable, action, runInAction, toJS } from "mobx"; -import fdc3, { - ContextType, - IntentResolution, - Fdc3Listener, - AppMetadata, - Channel, - PrivateChannel, -} from "../utility/Fdc3Api"; +import { ContextType, IntentResolution, Fdc3Listener, AppMetadata, PrivateChannel } from "../utility/Fdc3Api"; import { nanoid } from "nanoid"; import { intentTypes } from "../fixtures/intentTypes"; import systemLogStore from "./SystemLogStore"; import appChannelStore from "./AppChannelStore"; import privateChannelStore from "./PrivateChannelStore"; +import { Channel, getAgent, IntentResult } from "@finos/fdc3"; type IntentItem = { title: string; value: string }; @@ -46,55 +40,62 @@ class IntentStore { try { const listenerId = nanoid(); - const intentListener = await fdc3.addIntentListener(intent, async (context: ContextType, metaData?: any) => { - const currentListener = this.intentListeners.find(({ id }) => id === listenerId); - let channel: Channel | undefined; + const agent = await getAgent(); - //app channel - if (channelName && !isPrivate) { - channel = await appChannelStore.getOrCreateChannel(channelName); - } + const intentListener = await agent.addIntentListener( + intent, + async (context: ContextType, metaData?: any): Promise => { + const currentListener = this.intentListeners.find(({ id }) => id === listenerId); + let channel: Channel | undefined; - //private channel - if (isPrivate && !channelName) { - channel = await privateChannelStore.createPrivateChannel(); - privateChannelStore.addChannelListener(channel, "all"); + //app channel + if (channelName && !isPrivate) { + channel = await appChannelStore.getOrCreateChannel(channelName); + } - privateChannelStore.onDisconnect(channel); - privateChannelStore.onUnsubscribe(channel); - privateChannelStore.onAddContextListener(channel, channelContexts, channelContextDelay); - } + //private channel + if (isPrivate && !channelName) { + channel = await privateChannelStore.createPrivateChannel(); + privateChannelStore.addChannelListener(channel, "all"); - if (!isPrivate && channel) { - if (Object.keys(channelContexts).length !== 0) { - Object.keys(channelContexts).forEach((key) => { - let broadcast = setTimeout(async () => { - appChannelStore.broadcast(channel, channelContexts[key]); - clearTimeout(broadcast); - }, channelContextDelay[key]); - }); - } else { - await channel.broadcast(context); + privateChannelStore.onDisconnect(channel); + privateChannelStore.onUnsubscribe(channel); + privateChannelStore.onAddContextListener(channel, channelContexts, channelContextDelay); } - } - runInAction(() => { - if (currentListener) { - currentListener.lastReceivedContext = context; - currentListener.metaData = metaData; + if (!isPrivate && channel) { + if (Object.keys(channelContexts).length !== 0) { + Object.keys(channelContexts).forEach((key) => { + let broadcast = setTimeout(async () => { + appChannelStore.broadcast(channel, channelContexts[key]); + clearTimeout(broadcast); + }, channelContextDelay[key]); + }); + } else { + await channel.broadcast(context); + } } - }); - systemLogStore.addLog({ - name: "receivedIntentListener", - type: "info", - value: intent, - variant: "code", - body: JSON.stringify(context, null, 4), - }); + runInAction(() => { + if (currentListener) { + currentListener.lastReceivedContext = context; + currentListener.metaData = metaData; + } + }); - return channel || resultContext; - }); + systemLogStore.addLog({ + name: "receivedIntentListener", + type: "info", + value: intent, + variant: "code", + body: JSON.stringify(context, null, 4), + }); + + const result: IntentResult = channel || (resultContext ?? undefined); + + return result; + } + ); runInAction(() => { systemLogStore.addLog({ @@ -145,6 +146,8 @@ class IntentStore { } async raiseIntent(intent: string, context: ContextType, app?: AppMetadata) { + const agent = await getAgent(); + if (!context) { systemLogStore.addLog({ name: "raiseIntent", @@ -158,9 +161,9 @@ class IntentStore { let resolution: IntentResolution; if (app) { - resolution = await fdc3.raiseIntent(intent, toJS(context), app); + resolution = await agent.raiseIntent(intent, toJS(context), app); } else { - resolution = await fdc3.raiseIntent(intent, toJS(context)); + resolution = await agent.raiseIntent(intent, toJS(context)); } systemLogStore.addLog({ @@ -184,6 +187,8 @@ class IntentStore { } async raiseIntentForContext(context: ContextType, app?: AppMetadata) { + const agent = await getAgent(); + if (!context) { systemLogStore.addLog({ name: "raiseIntentForContext", @@ -196,9 +201,9 @@ class IntentStore { let resolution: IntentResolution; if (app) { - resolution = await fdc3.raiseIntentForContext(toJS(context), app); + resolution = await agent.raiseIntentForContext(toJS(context), app); } else { - resolution = await fdc3.raiseIntentForContext(toJS(context)); + resolution = await agent.raiseIntentForContext(toJS(context)); } systemLogStore.addLog({ name: "raiseIntentForContext", diff --git a/toolbox/fdc3-workbench/src/store/PrivateChannelStore.tsx b/toolbox/fdc3-workbench/src/store/PrivateChannelStore.tsx index ad381eeff..31295f05c 100644 --- a/toolbox/fdc3-workbench/src/store/PrivateChannelStore.tsx +++ b/toolbox/fdc3-workbench/src/store/PrivateChannelStore.tsx @@ -3,9 +3,10 @@ * Copyright FINOS FDC3 contributors - see NOTICE file */ import { makeObservable, observable, action, runInAction, toJS } from "mobx"; -import fdc3, { ContextType, Fdc3Listener, PrivateChannel } from "../utility/Fdc3Api"; +import { ContextType, Fdc3Listener, PrivateChannel } from "../utility/Fdc3Api"; import systemLogStore from "./SystemLogStore"; import { nanoid } from "nanoid"; +import { getAgent } from "@finos/fdc3"; // interface ListenerOptionType { // title: string; @@ -36,7 +37,7 @@ class PrivateChannelStore { async createPrivateChannel() { try { - const currentPrivateChannel: any = await fdc3.createPrivateChannel(); + const currentPrivateChannel: any = await getAgent().then((agent) => agent.createPrivateChannel()); const isSuccess = currentPrivateChannel !== null; if (isSuccess) { this.privateChannelsList.push(currentPrivateChannel); diff --git a/toolbox/fdc3-workbench/src/utility/Fdc3Api.ts b/toolbox/fdc3-workbench/src/utility/Fdc3Api.ts index 8cee6da8f..54bc1e133 100644 --- a/toolbox/fdc3-workbench/src/utility/Fdc3Api.ts +++ b/toolbox/fdc3-workbench/src/utility/Fdc3Api.ts @@ -2,9 +2,8 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright FINOS FDC3 contributors - see NOTICE file */ -import * as fdc3_2 from "fdc3-2.0"; +import * as fdc3_2 from "@finos/fdc3"; import * as fdc3_1 from "fdc3-1.2"; -import { group } from "console"; interface fdc3_1IntentResolution extends fdc3_1.IntentResolution { getResult?: any; @@ -44,8 +43,6 @@ export type IntentResolution = fdc3_1IntentResolution | fdc3_2IntentResolution; export type TargetApp = fdc3_1.TargetApp; -export type Channel = fdc3_2.Channel | fdc3_1.Channel; - export type ImplementationMetadata = fdc3_1ImplementationMetadata | fdc3_2ImplementationMetadata; export type AppMetadata = fdc3_2.AppMetadata; @@ -61,136 +58,95 @@ export type Context = fdc3_1.Context | fdc3_2.Context; export type PrivateChannel = fdc3_2.PrivateChannel; -export type IntentTargetOption = { appId: string, metadata: AppMetadata, instances: fdc3_2.AppMetadata[], launchNew: boolean }; - -export type ContextTargetOption = { intent: string, targetOptions: IntentTargetOption[]}; - -class Fdc3Api { - fdc3Methods: typeof fdc3_1 | typeof fdc3_2; - - constructor() { - this.fdc3Methods = window.fdc3Version === "2.0" ? fdc3_2 : fdc3_1; - } - - getCurrentChannel() { - return this.fdc3Methods.getCurrentChannel(); - } - - broadcast(context: fdc3_1.Context | fdc3_2.Context) { - return this.fdc3Methods.broadcast(context); - } - - async addIntentListener(intent: string, handler: fdc3_1.ContextHandler | fdc3_2.ContextHandler) { - return await this.fdc3Methods.addIntentListener(intent, handler); - } +export type IntentTargetOption = { + appId: string; + metadata: AppMetadata; + instances: fdc3_2.AppMetadata[]; + launchNew: boolean; +}; - async addContextListener( - contextTypeOrNull: string | null, - handler: fdc3_1.ContextHandler | fdc3_2.ContextHandler - ) { - if (window.fdc3Version === "2.0") { - return await fdc3_2.addContextListener(contextTypeOrNull, handler); - } else { - if (contextTypeOrNull === null) { - return await fdc3_1.addContextListener(handler); +export type ContextTargetOption = { intent: string; targetOptions: IntentTargetOption[] }; + +export async function getTargetOptions(intent: string, context: ContextType): Promise { + const agent = await fdc3_2.getAgent(); + + let appIntent = await agent.findIntent(intent, context); + if (!appIntent?.apps) { + return []; + } + + const groupedApps: IntentTargetOption[] = []; + + if (window.fdc3Version === "2.0") { + (appIntent as fdc3_2.AppIntent).apps.forEach((currentApp) => { + let foundApp = groupedApps.find((app) => app.appId === currentApp.appId); + if (!foundApp) { + //separate out the instanceId if present + // eslint-disable-next-line no-unused-vars + const { instanceId: _, ...metadata } = currentApp; + const option: IntentTargetOption = { + appId: currentApp.appId, + metadata: metadata, + instances: [], + launchNew: false, + }; + if (currentApp.instanceId) { + option.instances.push(currentApp); + } else { + option.launchNew = true; + } + groupedApps.push(option); } else { - return await fdc3_1.addContextListener(contextTypeOrNull, handler); + if (currentApp.instanceId) { + foundApp.instances.push(currentApp); + } else { + foundApp.launchNew = true; + } } - } - - } - - async raiseIntent(intent: string, context: fdc3_1.Context | fdc3_2.Context, app?: AppMetadata | undefined) { - if (window.fdc3Version === "2.0") { - return await fdc3_2.raiseIntent(intent, context, app ? { - appId: app?.appId ? app.appId : "", - instanceId: (app as fdc3_2.AppMetadata)?.instanceId, - } : undefined); - } else { - return fdc3_1.raiseIntent(intent, context, app?.appId ?? app?.name ?? undefined); - } - } - - async raiseIntentForContext( - context: fdc3_1.Context & fdc3_2.Context, - app?: AppMetadata - ) { - if (window.fdc3Version === "2.0") { - return await fdc3_2.raiseIntentForContext(context, app as fdc3_2.AppMetadata); - } else { - return await fdc3_1.raiseIntentForContext(context, app as fdc3_1.AppMetadata); - } - } - - getUserChannels() { - if (window.fdc3Version === "2.0") { - return fdc3_2.getUserChannels(); - } else { - return fdc3_1.getSystemChannels(); - } - } - - joinUserChannel(channelId: string) { - if (window.fdc3Version === "2.0") { - return fdc3_2.joinUserChannel(channelId); - } else { - return fdc3_1.joinChannel(channelId); - } - } - - leaveCurrentChannel() { - return this.fdc3Methods.leaveCurrentChannel(); - } - - fdc3Ready(waitForMs?: number | undefined) { - return this.fdc3Methods.fdc3Ready(waitForMs); - } - - async getOrCreateChannel(channelId: string) { - return await this.fdc3Methods.getOrCreateChannel(channelId); - } - - getInfo() { - return this.fdc3Methods.getInfo(); - } - - findIntent(intent: string, context: Context) { - return this.fdc3Methods.findIntent(intent, context); + }); + } else { + //no instances in FDC3 < 2 + (appIntent as fdc3_1.AppIntent).apps.forEach((currentApp) => { + //deduplicate results in case a 2.0 implementation returned instances + let foundApp = groupedApps.find((app) => app.appId === currentApp.appId); + if (!foundApp) { + groupedApps.push({ + appId: currentApp.appId ?? currentApp.name, + metadata: currentApp as fdc3_2.AppMetadata, //hack to avoid type error + instances: [], + launchNew: true, + }); + } + }); } - findIntentsByContext(context: Context) { - return this.fdc3Methods.findIntentsByContext(context); - } + return groupedApps; +} - async createPrivateChannel() { - return fdc3_2.createPrivateChannel(); - } +export async function getTargetOptionsForContext(context: ContextType): Promise { + const agent = await fdc3_2.getAgent(); - async findInstances(targetApp: any) { - return await fdc3_2.findInstances(targetApp); + let appIntents = await agent.findIntentsByContext(context); + if (appIntents.length === 0) { + return []; } - - async getTargetOptions(intent: string, context: ContextType): Promise { - let appIntent = await this.findIntent(intent, context); - if (!appIntent?.apps) { - return []; - } - const groupedApps: IntentTargetOption[] = []; + //We only return apps to target which means we need to deduplicate where they are returned more than once + const groupedApps: IntentTargetOption[] = []; - if (window.fdc3Version === "2.0") { - appIntent = appIntent as fdc3_2.AppIntent; - appIntent.apps.forEach((currentApp)=>{ - let foundApp = groupedApps.find((app)=>app.appId === currentApp.appId); - if(!foundApp) { + if (window.fdc3Version === "2.0") { + (appIntents as fdc3_2.AppIntent[]).forEach((currentIntent) => { + currentIntent.apps.forEach((currentApp) => { + let foundApp = groupedApps.find((app) => app.appId === currentApp.appId); + if (!foundApp) { //separate out the instanceId if present - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const {instanceId: _, ...metadata} = currentApp; + // eslint-disable-next-line no-unused-vars + const { instanceId: _, ...metadata } = currentApp; const option: IntentTargetOption = { appId: currentApp.appId, metadata: metadata, - instances: [ ], - launchNew: false + instances: [], + launchNew: false, }; if (currentApp.instanceId) { option.instances.push(currentApp); @@ -200,100 +156,33 @@ class Fdc3Api { groupedApps.push(option); } else { if (currentApp.instanceId) { - foundApp.instances.push(currentApp); + //deduplicate instances + let foundInstance = foundApp.instances.find((instance) => instance.instanceId === currentApp.instanceId); + if (!foundInstance) { + foundApp.instances.push(currentApp); + } } else { foundApp.launchNew = true; } } - }); - - } else { - //no instances in FDC3 < 2 - appIntent = appIntent as fdc3_1.AppIntent; - appIntent.apps.forEach((currentApp)=>{ - //deduplicate results in case a 2.0 implementation returned instances - let foundApp = groupedApps.find((app)=>app.appId === currentApp.appId); + }); + }); + } else { + (appIntents as fdc3_1.AppIntent[]).forEach((currentIntent) => { + currentIntent.apps.forEach((currentApp) => { + //deduplicate in case a 2.0 implementation returned some instances + let foundApp = groupedApps.find((app) => app.appId === currentApp.appId); if (!foundApp) { groupedApps.push({ appId: currentApp.appId ?? currentApp.name, metadata: currentApp as fdc3_2.AppMetadata, //hack to avoid type error instances: [], - launchNew: true + launchNew: true, }); } - }); - } - - return groupedApps; + }); } - async getTargetOptionsForContext(context: ContextType): Promise { - let appIntents = await this.findIntentsByContext(context); - if (appIntents.length === 0) { - return []; - } - - //We only return apps to target which means we need to deduplicate where they are returned more than once - const groupedApps: IntentTargetOption[] = []; - - if (window.fdc3Version === "2.0") { - appIntents = appIntents as fdc3_2.AppIntent[]; - - appIntents.forEach((currentIntent) => { - currentIntent.apps.forEach((currentApp) => { - let foundApp = groupedApps.find((app)=>app.appId === currentApp.appId); - if(!foundApp) { - //separate out the instanceId if present - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const {instanceId: _, ...metadata} = currentApp; - const option: IntentTargetOption = { - appId: currentApp.appId, - metadata: metadata, - instances: [ ], - launchNew: false - }; - if (currentApp.instanceId) { - option.instances.push(currentApp); - } else { - option.launchNew = true; - } - groupedApps.push(option); - } else { - if (currentApp.instanceId) { - //deduplicate instances - let foundInstance = foundApp.instances.find((instance)=>instance.instanceId === currentApp.instanceId); - if (!foundInstance){ foundApp.instances.push(currentApp); } - } else { - foundApp.launchNew = true; - } - } - }); - }); - - } else { - appIntents = appIntents as fdc3_1.AppIntent[]; - appIntents.forEach((currentIntent) => { - currentIntent.apps.forEach((currentApp) => { - //deduplicate in case a 2.0 implementation returned some instances - let foundApp = groupedApps.find((app)=>app.appId === currentApp.appId); - if (!foundApp) { - groupedApps.push({ - appId: currentApp.appId ?? currentApp.name, - metadata: currentApp as fdc3_2.AppMetadata, //hack to avoid type error - instances: [], - launchNew: true - }); - } - }); - - }); - } - - return groupedApps; - } + return groupedApps; } - -const fdc3 = new Fdc3Api(); - -export default fdc3; diff --git a/toolbox/fdc3-workbench/tsconfig.json b/toolbox/fdc3-workbench/tsconfig.json index f23042048..d4ff2660b 100644 --- a/toolbox/fdc3-workbench/tsconfig.json +++ b/toolbox/fdc3-workbench/tsconfig.json @@ -1,29 +1,30 @@ { - "compilerOptions": { - "target": "esnext", - "useDefineForClassFields": true, - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "types": ["node", "vite/client"] - }, - "include": [ - "src" - ], - "references": [{ "path": "./tsconfig.node.json" }] + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "types": ["node", "vite/client"] + }, + "include": ["src"], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "../../packages/fdc3" + } + ] } diff --git a/toolbox/fdc3-workbench/tsconfig.node.json b/toolbox/fdc3-workbench/tsconfig.node.json index 9d31e2aed..d3bf4b829 100644 --- a/toolbox/fdc3-workbench/tsconfig.node.json +++ b/toolbox/fdc3-workbench/tsconfig.node.json @@ -1,9 +1,9 @@ { - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] } diff --git a/toolbox/fdc3-workbench/vite.config.ts b/toolbox/fdc3-workbench/vite.config.ts index f68c6ece2..635920097 100644 --- a/toolbox/fdc3-workbench/vite.config.ts +++ b/toolbox/fdc3-workbench/vite.config.ts @@ -14,7 +14,6 @@ export default defineConfig({ }, define: { "process.env": "import.meta.env", - "process.platform": "({})", "global.process": "globalThis.process", }, plugins: [ @@ -23,5 +22,5 @@ export default defineConfig({ targets: ["defaults", "not IE 11"], }), ], - server: { port: 3000 }, + server: { port: 4001 }, }); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index e3847f95d..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs - "include": ["src", "types", "test"], - "compilerOptions": { - "module": "esnext", - "lib": ["dom", "esnext"], - "importHelpers": true, - // output .d.ts declaration files for consumers - "declaration": true, - "outDir": "dist", - // output .js.map sourcemap files for consumers - "sourceMap": true, - // match output dir to input dir. e.g. dist/index instead of dist/src/index - "rootDir": "./", - // stricter type-checking for stronger correctness. Recommended by TS - "strict": true, - // linter checks for common issues - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - // noUnused* overlap with @typescript-eslint/no-unused-vars, can disable if duplicative - "noUnusedLocals": true, - "noUnusedParameters": true, - // use Node's module resolution algorithm, instead of the legacy TS one - "moduleResolution": "node", - // transpile JSX to React.createElement - "jsx": "react", - // interop between ESM and CJS modules. Recommended by TS - "esModuleInterop": true, - // significant perf increase by skipping checking .d.ts files, particularly those in node_modules. Recommended by TS - "skipLibCheck": true, - // error out if import and file system have a casing mismatch. Recommended by TS - "forceConsistentCasingInFileNames": true, - // `tsdx build` ignores this option, but it is commonly used when type-checking separately with `tsc` - "noEmit": true, - } -} diff --git a/tsconfig.root.json b/tsconfig.root.json new file mode 100644 index 000000000..9cc1f9590 --- /dev/null +++ b/tsconfig.root.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + /* Basic Options */ + "esModuleInterop": true, + "module": "CommonJS", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "sourceMap": true, + /* output setting */ + "lib": [ + "es2021", + "DOM" + ], + "target": "ESNext", + "composite": true, + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noImplicitReturns": true, + /* From Coverage Work */ + "skipLibCheck": true, + /* From Distribution Work */ + "declarationMap": true + } +} \ No newline at end of file diff --git a/docs/.markdownlint.jsonc b/website/docs/.markdownlint.jsonc similarity index 100% rename from docs/.markdownlint.jsonc rename to website/docs/.markdownlint.jsonc diff --git a/docs/agent-bridging/ref/PrivateChannel.broadcast.md b/website/docs/agent-bridging/ref/PrivateChannel.broadcast.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.broadcast.md rename to website/docs/agent-bridging/ref/PrivateChannel.broadcast.md diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md b/website/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md rename to website/docs/agent-bridging/ref/PrivateChannel.eventListenerAdded.md diff --git a/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md b/website/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md rename to website/docs/agent-bridging/ref/PrivateChannel.eventListenerRemoved.md diff --git a/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md b/website/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md rename to website/docs/agent-bridging/ref/PrivateChannel.onAddContextListener.md diff --git a/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md b/website/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.onDisconnect.md rename to website/docs/agent-bridging/ref/PrivateChannel.onDisconnect.md diff --git a/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md b/website/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md similarity index 100% rename from docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md rename to website/docs/agent-bridging/ref/PrivateChannel.onUnsubscribe.md diff --git a/docs/agent-bridging/ref/broadcast.md b/website/docs/agent-bridging/ref/broadcast.md similarity index 100% rename from docs/agent-bridging/ref/broadcast.md rename to website/docs/agent-bridging/ref/broadcast.md diff --git a/docs/agent-bridging/ref/findInstances.md b/website/docs/agent-bridging/ref/findInstances.md similarity index 100% rename from docs/agent-bridging/ref/findInstances.md rename to website/docs/agent-bridging/ref/findInstances.md diff --git a/docs/agent-bridging/ref/findIntent.md b/website/docs/agent-bridging/ref/findIntent.md similarity index 100% rename from docs/agent-bridging/ref/findIntent.md rename to website/docs/agent-bridging/ref/findIntent.md diff --git a/docs/agent-bridging/ref/findIntentsByContext.md b/website/docs/agent-bridging/ref/findIntentsByContext.md similarity index 100% rename from docs/agent-bridging/ref/findIntentsByContext.md rename to website/docs/agent-bridging/ref/findIntentsByContext.md diff --git a/docs/agent-bridging/ref/getAppMetadata.md b/website/docs/agent-bridging/ref/getAppMetadata.md similarity index 100% rename from docs/agent-bridging/ref/getAppMetadata.md rename to website/docs/agent-bridging/ref/getAppMetadata.md diff --git a/docs/agent-bridging/ref/open.md b/website/docs/agent-bridging/ref/open.md similarity index 100% rename from docs/agent-bridging/ref/open.md rename to website/docs/agent-bridging/ref/open.md diff --git a/docs/agent-bridging/ref/raiseIntent.md b/website/docs/agent-bridging/ref/raiseIntent.md similarity index 100% rename from docs/agent-bridging/ref/raiseIntent.md rename to website/docs/agent-bridging/ref/raiseIntent.md diff --git a/docs/agent-bridging/spec.md b/website/docs/agent-bridging/spec.md similarity index 100% rename from docs/agent-bridging/spec.md rename to website/docs/agent-bridging/spec.md diff --git a/docs/api/conformance/App-Channel-Tests.md b/website/docs/api/conformance/App-Channel-Tests.md similarity index 100% rename from docs/api/conformance/App-Channel-Tests.md rename to website/docs/api/conformance/App-Channel-Tests.md diff --git a/docs/api/conformance/Basic-Tests.md b/website/docs/api/conformance/Basic-Tests.md similarity index 100% rename from docs/api/conformance/Basic-Tests.md rename to website/docs/api/conformance/Basic-Tests.md diff --git a/docs/api/conformance/Intents-Tests.md b/website/docs/api/conformance/Intents-Tests.md similarity index 100% rename from docs/api/conformance/Intents-Tests.md rename to website/docs/api/conformance/Intents-Tests.md diff --git a/docs/api/conformance/Metadata-Tests.md b/website/docs/api/conformance/Metadata-Tests.md similarity index 100% rename from docs/api/conformance/Metadata-Tests.md rename to website/docs/api/conformance/Metadata-Tests.md diff --git a/docs/api/conformance/Open-Tests.md b/website/docs/api/conformance/Open-Tests.md similarity index 100% rename from docs/api/conformance/Open-Tests.md rename to website/docs/api/conformance/Open-Tests.md diff --git a/docs/api/conformance/Overview.md b/website/docs/api/conformance/Overview.md similarity index 100% rename from docs/api/conformance/Overview.md rename to website/docs/api/conformance/Overview.md diff --git a/docs/api/conformance/User-Channel-Tests.md b/website/docs/api/conformance/User-Channel-Tests.md similarity index 100% rename from docs/api/conformance/User-Channel-Tests.md rename to website/docs/api/conformance/User-Channel-Tests.md diff --git a/docs/api/ref/Channel.md b/website/docs/api/ref/Channel.md similarity index 100% rename from docs/api/ref/Channel.md rename to website/docs/api/ref/Channel.md diff --git a/docs/api/ref/DesktopAgent.md b/website/docs/api/ref/DesktopAgent.md similarity index 100% rename from docs/api/ref/DesktopAgent.md rename to website/docs/api/ref/DesktopAgent.md diff --git a/docs/api/ref/Errors.md b/website/docs/api/ref/Errors.md similarity index 92% rename from docs/api/ref/Errors.md rename to website/docs/api/ref/Errors.md index 3470a2697..4cdadac9e 100644 --- a/docs/api/ref/Errors.md +++ b/website/docs/api/ref/Errors.md @@ -33,6 +33,11 @@ enum AgentError { /** Returned if the failover function is not a function, or it did not * resolve to one of the allowed types.*/ InvalidFailover = "InvalidFailover", + + /** Returned if an API call rejects after a timeout. Used where an API call + * is not aligned to another error enumeration. + */ + ApiTimeout = 'ApiTimeout' } ``` @@ -69,6 +74,10 @@ enum ChannelError { * that has a `string` value. */ MalformedContext = "MalformedContext", + + /** Returned if a timeout occurs before any Channel related API call is resolved. + */ + ApiTimeout = 'ApiTimeout' } ``` @@ -103,6 +112,7 @@ public static class ChannelError /// that has a `String` value. /// public static readonly string MalformedContext = nameof(MalformedContext); + } ``` @@ -149,9 +159,15 @@ enum OpenError { */ MalformedContext = "MalformedContext", - /** @experimental Returned if the specified Desktop Agent is not found, via a connected - * Desktop Agent Bridge. */ + /** @experimental Returned if the specified Desktop Agent is not found, via a connected + * Desktop Agent Bridge. + * */ DesktopAgentNotFound = "DesktopAgentNotFound", + + /** Returned if a timeout occurs before a call to open is resolved for any + * reason other than the not adding its context listener in time. + */ + ApiTimeout = 'ApiTimeout' } ``` @@ -251,9 +267,17 @@ export enum ResolveError { */ MalformedContext = "MalformedContext", - /** @experimental Returned if the specified Desktop Agent is not found, via a connected - * Desktop Agent Bridge. */ + /** @experimental Returned if the specified Desktop Agent is not found, via a + * connected Desktop Agent Bridge. + */ DesktopAgentNotFound = "DesktopAgentNotFound", + + /** Returned if a timeout occurs before the API call is resolved for any reason other + * than the resolver timing out (use ResolverTimeout) or an app launched by a + * raiseIntent function doesn't add its intent listener in time (use + * IntentDeliveryFailed). + */ + ApiTimeout = 'ApiTimeout' } ``` @@ -344,6 +368,10 @@ enum ResultError { * throws an error or rejects the Promise it returned. */ IntentHandlerRejected = "IntentHandlerRejected", + + /** Returned if a timeout occurs before the getResult() API call is resolved. + */ + ApiTimeout = 'ApiTimeout' } ``` diff --git a/docs/api/ref/Events.md b/website/docs/api/ref/Events.md similarity index 100% rename from docs/api/ref/Events.md rename to website/docs/api/ref/Events.md diff --git a/docs/api/ref/GetAgent.md b/website/docs/api/ref/GetAgent.md similarity index 92% rename from docs/api/ref/GetAgent.md rename to website/docs/api/ref/GetAgent.md index 5e8e00b5b..4e37549a6 100644 --- a/docs/api/ref/GetAgent.md +++ b/website/docs/api/ref/GetAgent.md @@ -98,15 +98,55 @@ A small number of arguments are accepted that can affect the behavior of `getAge * or an iframe's `contentWindow`) for a window or frame in which it has loaded * a Desktop Agent or suitable proxy to one that works with FDC3 Web Connection * and Desktop Agent Communication Protocols. - */ + * + * @property {GetAgentLogLevels} logLevels Settings that determine what should + * will logged by the getAgent() implementation and DesktopAgentProxy to the + * JavaScript console. + */ type GetAgentParams = { timeoutMs?: number, identityUrl?: string, channelSelector?: boolean, intentResolver?: boolean, dontSetWindowFdc3?: boolean, - failover?: (args: GetAgentParams) => Promise + failover?: (args: GetAgentParams) => Promise, + logLevels?: GetAgentLogLevels; +}; + +/** + * The default timeout used by getAgent when discovering Desktop Agents. + */ +const DEFAULT_GETAGENT_TIMEOUT_MS = 1000; + +/** + * @typedef {Object} GetAgentLogLevels Type representing log-level parameters \ + * passed to the getAgent function that control what is logged to the JavaScript + * console by the getAgent() implementation and any DesktopAgentProxy it creates. + * + * @property {boolean} connection Log-level for messages relating to establishing + * a connection to the Desktop Agent (default INFO). + * + * @property {boolean} proxy Log-level for messages from a DesktopAgentProxy + * created by getAgent. These include log of messages sent or received from the + * DesktopAgent at the INFO level and heartbeat messages at the DEBUG level + * (default WARN). + * + */ +type GetAgentLogLevels = { + connection: LogLevel, + proxy: LogLevel }; + +/** + * Type representing the different log-levels that can be set. + */ +enum LogLevel { + NONE = 0, + ERROR = 1, + WARN = 2, + INFO = 3, + DEBUG = 4, +} ``` :::note @@ -159,7 +199,7 @@ Failover functions MUST be asynchronous and MUST resolve to one of the following ## Persisted Connection Data -The `getAgent()` function uses [`SessionStorage`](https://html.spec.whatwg.org/multipage/webstorage.html) ([MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)) to persist information on an instance of an app and how it connected to a Desktop Agent in order to ensure a consistent connection type and `instanceId` when reconnecting after navigation or refresh events. +The `getAgent()` function uses [`SessionStorage`](https://html.spec.whatwg.org/multipage/webstorage.html) ([MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)) to persist information on an instance of an app and how it connected to a Desktop Agent in order to ensure a consistent connection type and `instanceId` when reconnecting after navigation or refresh events. :::warning Apps do not need to and SHOULD NOT interact with data persisted in SessionStorage by `getAgent` directly, rather it is set and used by the `getAgent()` implementation. @@ -257,6 +297,4 @@ enum WebDesktopAgentType { } const DESKTOP_AGENT_SESSION_STORAGE_KEY_PREFIX = 'fdc3-desktop-agent-details'; - -const DEFAULT_TIMEOUT_MS = 1000; ``` diff --git a/docs/api/ref/Metadata.md b/website/docs/api/ref/Metadata.md similarity index 100% rename from docs/api/ref/Metadata.md rename to website/docs/api/ref/Metadata.md diff --git a/docs/api/ref/PrivateChannel.md b/website/docs/api/ref/PrivateChannel.md similarity index 100% rename from docs/api/ref/PrivateChannel.md rename to website/docs/api/ref/PrivateChannel.md diff --git a/docs/api/ref/Types.md b/website/docs/api/ref/Types.md similarity index 100% rename from docs/api/ref/Types.md rename to website/docs/api/ref/Types.md diff --git a/docs/api/spec.md b/website/docs/api/spec.md similarity index 100% rename from docs/api/spec.md rename to website/docs/api/spec.md diff --git a/docs/api/specs/browserResidentDesktopAgents.md b/website/docs/api/specs/browserResidentDesktopAgents.md similarity index 98% rename from docs/api/specs/browserResidentDesktopAgents.md rename to website/docs/api/specs/browserResidentDesktopAgents.md index 2da15f53c..9dfc43587 100644 --- a/docs/api/specs/browserResidentDesktopAgents.md +++ b/website/docs/api/specs/browserResidentDesktopAgents.md @@ -4,17 +4,17 @@ sidebar_label: Browser Desktop Agents title: Browser-Resident Desktop Agents (next) --- -:::info _[@experimental](../fdc3-compliance#experimental-features)_ +:::info _[@experimental](../../fdc3-compliance#experimental-features)_ Browser Resident Desktop Agents (DAs) are an experimental feature added to FDC3 in 2.2. Limited aspects of their design may change in future versions and they are exempted from the FDC3 Standard's normal versioning and deprecation policies in order to facilitate any necessary change. ::: -This document specifies the required behavior for Browser-Resident Desktop Agents (DA). Such agents allow FDC3 applications running directly in a browser to participate in FDC3 interop by way of a `getAgent()` function that is provided by the [`@finos/fdc3` NPM module](https://www.npmjs.com/package/@finos/fdc3) and a standardized communication protocol. This approach is in contrast to "Preload DAs" which run on technology that allows the FDC3 interface to be injected (such as Electron, WebView2 or a browser-extension based implementation). +This document specifies the required behavior for Browser-Resident Desktop Agents (DA). Such agents allow FDC3 applications running directly in a browser to participate in FDC3 interop by way of a `getAgent()` function that is provided by the [`@finos/fdc3` npm module](https://www.npmjs.com/package/@finos/fdc3) and a standardized communication protocol. This approach is in contrast to "Preload DAs" which run on technology that allows the FDC3 interface to be injected (such as Electron, WebView2 or a browser-extension based implementation). This specification only applies to apps running in a browser and therefore assumes use of JavaScript/TypeScript and HTML APIs. Implementations in other languages such as .NET are not covered. -Along with this specification, a new general connection strategy has been established for FDC3 compliant web-applications: FDC3 compliant apps SHOULD make use of `getAgent()` function provided by the [`@finos/fdc3` NPM module](https://www.npmjs.com/package/@finos/fdc3) to retrieve their FDC3 interface (an instance of an implementation of the [`DesktopAgent`](../ref/DesktopAgent) interface). Apps that follow these guidelines will be able to interop through either Browser-Resident DAs or [Preload DAs](./preloadDesktopAgents) without the inclusion of code or libraries specific to a particular Desktop Agent vendor or implementation. We refer to this concept as Write Once Run Anywhere (WORA). +Along with this specification, a new general connection strategy has been established for FDC3 compliant web-applications: FDC3 compliant apps SHOULD make use of `getAgent()` function provided by the [`@finos/fdc3` npm module](https://www.npmjs.com/package/@finos/fdc3) to retrieve their FDC3 interface (an instance of an implementation of the [`DesktopAgent`](../ref/DesktopAgent) interface). Apps that follow these guidelines will be able to interop through either Browser-Resident DAs or [Preload DAs](./preloadDesktopAgents) without the inclusion of code or libraries specific to a particular Desktop Agent vendor or implementation. We refer to this concept as Write Once Run Anywhere (WORA). :::info @@ -24,7 +24,7 @@ Prior to FDC3 2.2, only [Preload Desktop Agents](./preloadDesktopAgents) were su :::note -This document covers the requirements for _implementors of Browser-Resident Desktop Agents_. The `getAgent()` function that applications use to gain access to an FDC3 interface is provided by the [`@finos/fdc3` NPM module](https://www.npmjs.com/package/@finos/fdc3). Many behavioral details of `getAgent()` are purposefully omitted from this document in order to reduce the required scope of understanding. Please refer to the [getAgent() specification in the FDC3 Web Connection Protocol](webConnectionProtocol.md) for information on how the client side operates or [supported platforms](../supported-platforms) for details of how to access the Desktop Agent API in an application. +This document covers the requirements for _implementors of Browser-Resident Desktop Agents_. The `getAgent()` function that applications use to gain access to an FDC3 interface is provided by the [`@finos/fdc3` npm module](https://www.npmjs.com/package/@finos/fdc3). Many behavioral details of `getAgent()` are purposefully omitted from this document in order to reduce the required scope of understanding. Please refer to the [getAgent() specification in the FDC3 Web Connection Protocol](webConnectionProtocol.md) for information on how the client side operates or [supported platforms](../supported-platforms) for details of how to access the Desktop Agent API in an application. ::: diff --git a/docs/api/specs/desktopAgentCommunicationProtocol.md b/website/docs/api/specs/desktopAgentCommunicationProtocol.md similarity index 91% rename from docs/api/specs/desktopAgentCommunicationProtocol.md rename to website/docs/api/specs/desktopAgentCommunicationProtocol.md index 29e6c1ad5..0384d6158 100644 --- a/docs/api/specs/desktopAgentCommunicationProtocol.md +++ b/website/docs/api/specs/desktopAgentCommunicationProtocol.md @@ -4,7 +4,7 @@ sidebar_label: Desktop Agent Communication Protocol title: Desktop Agent Communication Protocol (next) --- -:::info _[@experimental](../fdc3-compliance#experimental-features)_ +:::info _[@experimental](../../fdc3-compliance#experimental-features)_ FDC3's Desktop Agent Communication Protocol (DACP) is an experimental feature added to FDC3 in 2.2. Limited aspects of its design may change in future versions and it is exempted from the FDC3 Standard's normal versioning and deprecation polices in order to facilitate any necessary change. @@ -83,6 +83,34 @@ Further, the design of the DACP is based on the assumption that applications wil As a Desktop Agent is expected to act as a router for messages sent through the Desktop Agent API, the DACP provides message exchanges for the registration and un-registration of listeners for particular message types (e.g. events, contexts broadcast on user channels, contexts broadcast on other channel types, raised intents etc.). In most cases, apps can register multiple listeners for the same messages (often filtered for different context or event types). However, where multiple listeners are present, only a single DACP message should be sent representing the action taken in the FDC3 API (e.g. broadcasting a message to a channel) and any multiplexing to multiple listeners should be applied at the receiving end. For example, when working with the WCP, this should be handled by the Desktop Agent Proxy implementation provided by the `getAgent()` implementation. +### Timeouts for Message Exchanges + +As the DACP is used to communicate with a different browsing context, timeouts are applied to message exchanges allowing them to fail and for the Desktop Agent Proxy to return an error to the caller. A default timeout of 10 seconds is applied to all message exchanges, with the exception of those that may involve the launch of an application (`open()`, `raiseIntent()` and `raiseIntentForContext()`). Implementations of the FDC3 Desktop Agent API are required to allow a minimum timeout of 15 seconds for an application to launch and add any necessary context or intent listeners (see [Desktop Agent API Compliance](../spec#desktop-agent-api-standard-compliance) for further details). However, no upper bound for the timeout is currently specified. Message exchanges that involve the launch of an application use a default timeout of 100 seconds. + +Desktop Agents may specify custom values for both the default message exchange timeout and the timeout used for exchanges that may involve the launch of an application. Custom values are passed to the Desktop Agent proxy by setting the optional `payload.messageExchangeTimeout` and `payload.appLaunchTimeout` fields in the `WCP3Handshake` Response sent by the Desktop Agent to an application connecting to it. `payload.messageExchangeTimeout` MUST be set to a value greater than or equal to 100 ms, and `payload.appLaunchTimeout` MUST be set to a value greater than or equal to 15,000 ms. + +```ts +/** Default timeout used by a DesktopAgentProxy for all message exchanges + * with a DesktopAgent, except those that involve the launch of an application. + * May be overridden by a DesktopAgent by passing a value in the + * payload.messageExchangeTimeout of a WCP3Handshake message. + */ +export const DEFAULT_MESSAGE_EXCHANGE_TIMEOUT_MS = 10000; + +/** Default timeout used by a DesktopAgentProxy for message exchanges with a + * DesktopAgent that involve launching applications. May be overridden by a + * DesktopAgent by passing a value in the payload.appLaunchTimeout of a + * WCP3Handshake message. + * */ +export const DEFAULT_APP_LAUNCH_TIMEOUT_MS = 100000; +``` + +:::info + +The message exchange timeouts are used to detect a lack of response from the Desktop Agent, which will be reported via the `ApiTimeout` error message. However, there are also defined error messages for apps failing to add an expected context listener (`OpenError.AppTimeout`) or intent listener (`ResolveError.IntentDeliveryFailed`) after launch. To return these errors, the Desktop Agent should set a longer timeout via the `payload.appLaunchTimeout` field in its `WCP3Handshake` message than it uses internally to detect such failures. Doing so will ensure that timeouts can be separately attributed to the App or to the Desktop Agent. + +::: + ## Message Definitions Supporting FDC3 API calls This section provides details of the messages defined in the DACP, grouped according to the FDC3 API functions that they support, and defined by JSON Schema files. Many of these message definitions make use of JSON versions of [metadata](../ref/Metadata) and other [types](../ref/Types) defined by the Desktop Agent API, the JSON versions of which can be found in [api.schema.json](https://fdc3.finos.org/schemas/next/api/api.schema.json), while a number of DACP specific object definitions that are reused through the messages can be found in [common.schema.json](https://fdc3.finos.org/schemas/next/api/common.schema.json). diff --git a/docs/api/specs/preloadDesktopAgents.md b/website/docs/api/specs/preloadDesktopAgents.md similarity index 83% rename from docs/api/specs/preloadDesktopAgents.md rename to website/docs/api/specs/preloadDesktopAgents.md index 9e25259ce..7d59b6b22 100644 --- a/docs/api/specs/preloadDesktopAgents.md +++ b/website/docs/api/specs/preloadDesktopAgents.md @@ -15,7 +15,7 @@ A Preload Desktop Agent is an FDC3 Desktop Agent (DA) supporting web application ## Injecting the global FDC3 object -Since FDC3 is typically available to the whole web application, Desktop Agents are expected to make the [`DesktopAgent`](../api/ref/DesktopAgent) interface available at a global level. Hence, a Preload Desktop Agent MUST provide the FDC3 API via a global accessible as `window.fdc3`. Implementors MAY additionally make the API available through modules, imports, or other means. +Since FDC3 is typically available to the whole web application, Desktop Agents are expected to make the [`DesktopAgent`](../ref/DesktopAgent) interface available at a global level. Hence, a Preload Desktop Agent MUST provide the FDC3 API via a global accessible as `window.fdc3`. Implementors MAY additionally make the API available through modules, imports, or other means. The global `window.fdc3` MUST only be available after the API is ready to use. Implementors MUST provide a global `fdc3Ready` event that is fired when the API is ready for use. diff --git a/docs/api/specs/webConnectionProtocol.md b/website/docs/api/specs/webConnectionProtocol.md similarity index 95% rename from docs/api/specs/webConnectionProtocol.md rename to website/docs/api/specs/webConnectionProtocol.md index 7b4dc2221..66e92790e 100644 --- a/docs/api/specs/webConnectionProtocol.md +++ b/website/docs/api/specs/webConnectionProtocol.md @@ -4,13 +4,13 @@ sidebar_label: Web Connection Protocol title: Web Connection Protocol (next) --- -:::info _[@experimental](../fdc3-compliance#experimental-features)_ +:::info _[@experimental](../../fdc3-compliance#experimental-features)_ FDC3's Web Connection Protocol (WCP) is an experimental feature added to FDC3 in 2.2. Limited aspects of its design may change in future versions and it is exempted from the FDC3 Standard's normal versioning and deprecation polices in order to facilitate any necessary change. ::: -The FDC3 Web Connection Protocol (WCP) defines the procedure for a web-application to connect to an FDC3 Desktop Agent. The WCP is used to implement a [`getAgent()`](../ref/GetAgent) function in the [`@finos/fdc3` npm module](https://www.npmjs.com/package/@finos/fdc3), which is the recommended way for web applications to connect to a Desktop Agent. This specification details how it retrieves and provides the FDC3 `DesktopAgent` interface object and requirements that Desktop Agents MUST implement in order to support discovery and connection via `getAgent()`. Please see the [`getAgent` reference document](../ref/GetAgent.md) for its TypeScript definition and related types. +The FDC3 Web Connection Protocol (WCP) defines the procedure for a web-application to connect to an FDC3 Desktop Agent. The WCP is used to implement a [`getAgent()`](../ref/GetAgent) function in the [`@finos/fdc3` npm module](https://www.npmjs.com/package/@finos/fdc3), which is the recommended way for web applications to connect to a Desktop Agent. This specification details how it retrieves and provides the FDC3 [`DesktopAgent`](../ref/DesktopAgent) interface object and requirements that Desktop Agents MUST implement in order to support discovery and connection via `getAgent()`. Please see the [`getAgent` reference document](../ref/GetAgent.md) for its TypeScript definition and related types. :::tip @@ -148,23 +148,34 @@ const discoverPreloadDA = async (timeoutMs: number): Promise => { To discover a Desktop Agent Proxy interface, locate all candidates for a `parent` window or frame by first checking the values of `window.opener` and `window.parent`. If `window.opener !== null` or `window.parent !== window` then they are candidates for a parent window or frame. As iframes can be nested we can also search for candidates that are parents of a parent frame, e.g.: ```ts -const discoverProxyCandidates = (): WindowProxy[] => { - const candidates: WindowProxy[] = []; - //parent window - if (!!window.opener) { candidates.push(window.opener); } - - //parent frames - let currentWin = window; - while (currentWin.parent !== currentWin) { - candidates.push(currentWin.parent); - currentWin = currentWin.parent; - } +/** + * Recursive search for all possible parent frames (windows) that we may + * target with the WCP. + * @param startWindow window object to search + * @param found window objects found so far + * @return An array of Window Objects representing 'parent' frames of the + * specified window. + */ +function discoverProxyCandidates(startWindow: Window, found: Window[]) { + _recursePossibleTargets(startWindow, startWindow, found); + Logger.debug(`Possible parent windows/frames found: ${found.length}`); + return found; +} + +function _recursePossibleTargets(startWindow: Window, w: Window, found: Window[]) { + if (w) { + if (found.indexOf(w) == -1 && w != startWindow) { + found.push(w); + } - //parent window of top-level parent frame - if (window !== currentWin && !!currentWin.opener) { - candidates.push(currentWin.opener); + if (!!w.opener) { + _recursePossibleTargets(startWindow, w.opener, found); + } + + if (w.parent != w) { + _recursePossibleTargets(startWindow, w.parent, found); + } } - return candidates; } ``` @@ -216,7 +227,7 @@ Setup a timer for specified timeout, and then for each `candidate` found, attemp ::: - 5. At this stage, a [`WCP3Handshake`](https://fdc3.finos.org/schemas/next/api/WCP3Handshake.schema.json) message should have been received from either a candidate parent or a hidden iframe created in step 4 above. This message MUST have a `MessagePort` appended to it, which is used for further communication with the Desktop Agent. + 5. At this stage, a [`WCP3Handshake`](https://fdc3.finos.org/schemas/next/api/WCP3Handshake.schema.json) message should have been received from either a candidate parent or a hidden iframe created in step 4 above. This message MUST have a `MessagePort` appended to it, which is used for further communication with the Desktop Agent. It MUST also contain URLs for any Intent Resolver or Channel Selector UIs to be injected into the page (or `false` to indicate that they are not in use) and MAY contain custom timeout settings to use for API message exchanges. Add a listener (`port.addEventListener("message", (event) => {})`) to receive messages from the selected `candidate`, before moving on to the next stage. 6. If no candidates were found or no [`WCP3Handshake`](https://fdc3.finos.org/schemas/next/api/WCP3Handshake.schema.json) has been received by the time that the timeout expires, then neither a Desktop Agent Preload or Desktop Agent Proxy interface has been discovered. If this occurs, the `getAgent()` implementation will run any `failover` function provided as a parameter to `getAgent()`, allowing the application to provide an alternative means of connecting to or starting up a Desktop Agent. diff --git a/docs/api/supported-platforms.md b/website/docs/api/supported-platforms.md similarity index 100% rename from docs/api/supported-platforms.md rename to website/docs/api/supported-platforms.md diff --git a/docs/app-directory/overview.md b/website/docs/app-directory/overview.md similarity index 100% rename from docs/app-directory/overview.md rename to website/docs/app-directory/overview.md diff --git a/docs/app-directory/spec.md b/website/docs/app-directory/spec.md similarity index 100% rename from docs/app-directory/spec.md rename to website/docs/app-directory/spec.md diff --git a/docs/context/ref/Action.md b/website/docs/context/ref/Action.md similarity index 97% rename from docs/context/ref/Action.md rename to website/docs/context/ref/Action.md index 8e26904aa..232775148 100644 --- a/docs/context/ref/Action.md +++ b/website/docs/context/ref/Action.md @@ -17,7 +17,7 @@ Accepts an optional `app` parameter in order to specify a specific app. ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/action.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/action.schema.json)) ## Type @@ -141,4 +141,3 @@ An optional target application identifier that should perform the action. The `a } } ``` - diff --git a/docs/context/ref/BaseContext.md b/website/docs/context/ref/BaseContext.md similarity index 100% rename from docs/context/ref/BaseContext.md rename to website/docs/context/ref/BaseContext.md diff --git a/docs/context/ref/Chart.md b/website/docs/context/ref/Chart.md similarity index 96% rename from docs/context/ref/Chart.md rename to website/docs/context/ref/Chart.md index cafa4f3a4..315fe3cb1 100644 --- a/docs/context/ref/Chart.md +++ b/website/docs/context/ref/Chart.md @@ -17,7 +17,7 @@ In addition to handling requests to plot charts, a charting application may use ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/chart.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/chart.schema.json)) ## Type diff --git a/docs/context/ref/ChatInitSettings.md b/website/docs/context/ref/ChatInitSettings.md similarity index 95% rename from docs/context/ref/ChatInitSettings.md rename to website/docs/context/ref/ChatInitSettings.md index 5d0b69339..11ee61777 100644 --- a/docs/context/ref/ChatInitSettings.md +++ b/website/docs/context/ref/ChatInitSettings.md @@ -10,7 +10,7 @@ A collection of settings to start a new chat conversation ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/chatInitSettings.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/chatInitSettings.schema.json)) ## Type diff --git a/docs/context/ref/ChatMessage.md b/website/docs/context/ref/ChatMessage.md similarity index 91% rename from docs/context/ref/ChatMessage.md rename to website/docs/context/ref/ChatMessage.md index 1b92ce33e..9e84a50dd 100644 --- a/docs/context/ref/ChatMessage.md +++ b/website/docs/context/ref/ChatMessage.md @@ -10,7 +10,7 @@ A context representing a chat message. Typically used to send the message or to ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/chatMessage.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/chatMessage.schema.json)) ## Type diff --git a/docs/context/ref/ChatRoom.md b/website/docs/context/ref/ChatRoom.md similarity index 91% rename from docs/context/ref/ChatRoom.md rename to website/docs/context/ref/ChatRoom.md index 781ae339a..3659110e7 100644 --- a/docs/context/ref/ChatRoom.md +++ b/website/docs/context/ref/ChatRoom.md @@ -10,7 +10,7 @@ Reference to the chat room which could be used to send a message to the room ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/chatRoom.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/chatRoom.schema.json)) ## Type diff --git a/docs/context/ref/ChatSearchCriteria.md b/website/docs/context/ref/ChatSearchCriteria.md similarity index 92% rename from docs/context/ref/ChatSearchCriteria.md rename to website/docs/context/ref/ChatSearchCriteria.md index 6486cd5f2..c67e1054b 100644 --- a/docs/context/ref/ChatSearchCriteria.md +++ b/website/docs/context/ref/ChatSearchCriteria.md @@ -10,7 +10,7 @@ A context type that represents a simple search criterion, based on a list of oth ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/chatSearchCriteria.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/chatSearchCriteria.schema.json)) ## Type diff --git a/docs/context/ref/Contact.md b/website/docs/context/ref/Contact.md similarity index 89% rename from docs/context/ref/Contact.md rename to website/docs/context/ref/Contact.md index 8056b405e..25a8fb850 100644 --- a/docs/context/ref/Contact.md +++ b/website/docs/context/ref/Contact.md @@ -10,7 +10,7 @@ A person contact that can be engaged with through email, calling, messaging, CMS ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/contact.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/contact.schema.json)) ## Type diff --git a/docs/context/ref/ContactList.md b/website/docs/context/ref/ContactList.md similarity index 92% rename from docs/context/ref/ContactList.md rename to website/docs/context/ref/ContactList.md index 6ed5ff9a6..44bbe8b45 100644 --- a/docs/context/ref/ContactList.md +++ b/website/docs/context/ref/ContactList.md @@ -12,7 +12,7 @@ The contact list schema does not explicitly include identifiers in the `id` sect ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/contactList.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/contactList.schema.json)) ## Type diff --git a/docs/context/ref/Context.md b/website/docs/context/ref/Context.md similarity index 100% rename from docs/context/ref/Context.md rename to website/docs/context/ref/Context.md diff --git a/docs/context/ref/Country.md b/website/docs/context/ref/Country.md similarity index 94% rename from docs/context/ref/Country.md rename to website/docs/context/ref/Country.md index 081fb515b..c441d61db 100644 --- a/docs/context/ref/Country.md +++ b/website/docs/context/ref/Country.md @@ -18,7 +18,7 @@ Notes: ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/country.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/country.schema.json)) ## Type diff --git a/docs/context/ref/Currency.md b/website/docs/context/ref/Currency.md similarity index 88% rename from docs/context/ref/Currency.md rename to website/docs/context/ref/Currency.md index 375d32d51..b181a52ad 100644 --- a/docs/context/ref/Currency.md +++ b/website/docs/context/ref/Currency.md @@ -10,7 +10,7 @@ A context representing an individual Currency. ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/currency.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/currency.schema.json)) ## Type diff --git a/docs/context/ref/DocumentedContext.md b/website/docs/context/ref/DocumentedContext.md similarity index 100% rename from docs/context/ref/DocumentedContext.md rename to website/docs/context/ref/DocumentedContext.md diff --git a/docs/context/ref/Email.md b/website/docs/context/ref/Email.md similarity index 90% rename from docs/context/ref/Email.md rename to website/docs/context/ref/Email.md index 2c56b4ae9..f30942617 100644 --- a/docs/context/ref/Email.md +++ b/website/docs/context/ref/Email.md @@ -10,7 +10,7 @@ A collection of information to be used to initiate an email with a Contact or Co ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/email.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/email.schema.json)) ## Type diff --git a/docs/context/ref/FileAttachment.md b/website/docs/context/ref/FileAttachment.md similarity index 88% rename from docs/context/ref/FileAttachment.md rename to website/docs/context/ref/FileAttachment.md index 1226218e9..839993290 100644 --- a/docs/context/ref/FileAttachment.md +++ b/website/docs/context/ref/FileAttachment.md @@ -10,7 +10,7 @@ A File attachment encoded in the form of a data URI. Can be added to a Message. ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/fileAttachment.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/fileAttachment.schema.json)) ## Type diff --git a/docs/context/ref/Instrument.md b/website/docs/context/ref/Instrument.md similarity index 96% rename from docs/context/ref/Instrument.md rename to website/docs/context/ref/Instrument.md index 22310950d..7fffd8402 100644 --- a/docs/context/ref/Instrument.md +++ b/website/docs/context/ref/Instrument.md @@ -10,7 +10,7 @@ A financial instrument from any asset class. ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/instrument.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/instrument.schema.json)) ## Type diff --git a/docs/context/ref/InstrumentList.md b/website/docs/context/ref/InstrumentList.md similarity index 93% rename from docs/context/ref/InstrumentList.md rename to website/docs/context/ref/InstrumentList.md index b01e3bdb3..9ce8f42f6 100644 --- a/docs/context/ref/InstrumentList.md +++ b/website/docs/context/ref/InstrumentList.md @@ -12,7 +12,7 @@ The instrument list schema does not explicitly include identifiers in the `id` s ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/instrumentList.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/instrumentList.schema.json)) ## Type diff --git a/docs/context/ref/Interaction.md b/website/docs/context/ref/Interaction.md similarity index 97% rename from docs/context/ref/Interaction.md rename to website/docs/context/ref/Interaction.md index afadb2427..e6dcbdfd9 100644 --- a/docs/context/ref/Interaction.md +++ b/website/docs/context/ref/Interaction.md @@ -10,7 +10,7 @@ An `Interaction` is a significant direct exchange of ideas or information betwee ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/interaction.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/interaction.schema.json)) ## Type diff --git a/docs/context/ref/Message.md b/website/docs/context/ref/Message.md similarity index 95% rename from docs/context/ref/Message.md rename to website/docs/context/ref/Message.md index 41703b868..73b84830c 100644 --- a/docs/context/ref/Message.md +++ b/website/docs/context/ref/Message.md @@ -10,7 +10,7 @@ A chat message to be sent through an instant messaging application. Can contain ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/message.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/message.schema.json)) ## Type diff --git a/docs/context/ref/Nothing.md b/website/docs/context/ref/Nothing.md similarity index 87% rename from docs/context/ref/Nothing.md rename to website/docs/context/ref/Nothing.md index 8dd3d2265..8006aadc0 100644 --- a/docs/context/ref/Nothing.md +++ b/website/docs/context/ref/Nothing.md @@ -18,7 +18,7 @@ Notes: ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/nothing.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/nothing.schema.json)) ## Type diff --git a/docs/context/ref/Order.md b/website/docs/context/ref/Order.md similarity index 95% rename from docs/context/ref/Order.md rename to website/docs/context/ref/Order.md index 2cb134994..60ad982e9 100644 --- a/docs/context/ref/Order.md +++ b/website/docs/context/ref/Order.md @@ -12,7 +12,7 @@ This type currently only defines a required `id` field, which should provide a r ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/order.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/order.schema.json)) ## Type diff --git a/docs/context/ref/OrderList.md b/website/docs/context/ref/OrderList.md similarity index 93% rename from docs/context/ref/OrderList.md rename to website/docs/context/ref/OrderList.md index fbb460773..42d02d136 100644 --- a/docs/context/ref/OrderList.md +++ b/website/docs/context/ref/OrderList.md @@ -12,7 +12,7 @@ The OrderList schema does not explicitly include identifiers in the id section, ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/orderList.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/orderList.schema.json)) ## Type diff --git a/docs/context/ref/Organization.md b/website/docs/context/ref/Organization.md similarity index 93% rename from docs/context/ref/Organization.md rename to website/docs/context/ref/Organization.md index 99a08ee32..83f528260 100644 --- a/docs/context/ref/Organization.md +++ b/website/docs/context/ref/Organization.md @@ -12,7 +12,7 @@ It is valid to include extra properties and metadata as part of the organization ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/organization.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/organization.schema.json)) ## Type diff --git a/docs/context/ref/Portfolio.md b/website/docs/context/ref/Portfolio.md similarity index 95% rename from docs/context/ref/Portfolio.md rename to website/docs/context/ref/Portfolio.md index 8236211da..451db620e 100644 --- a/docs/context/ref/Portfolio.md +++ b/website/docs/context/ref/Portfolio.md @@ -16,7 +16,7 @@ The portfolio schema does not explicitly include identifiers in the `id` section ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/portfolio.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/portfolio.schema.json)) ## Type diff --git a/docs/context/ref/Position.md b/website/docs/context/ref/Position.md similarity index 93% rename from docs/context/ref/Position.md rename to website/docs/context/ref/Position.md index 210f5c7e0..57cc3c796 100644 --- a/docs/context/ref/Position.md +++ b/website/docs/context/ref/Position.md @@ -16,7 +16,7 @@ The position schema does not explicitly include identifiers in the `id` section, ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/position.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/position.schema.json)) ## Type diff --git a/docs/context/ref/Product.md b/website/docs/context/ref/Product.md similarity index 93% rename from docs/context/ref/Product.md rename to website/docs/context/ref/Product.md index b027ccbcb..9159f71df 100644 --- a/docs/context/ref/Product.md +++ b/website/docs/context/ref/Product.md @@ -14,7 +14,7 @@ The Product schema does not explicitly include identifiers in the id section, as ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/product.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/product.schema.json)) ## Type diff --git a/docs/context/ref/TimeRange.md b/website/docs/context/ref/TimeRange.md similarity index 95% rename from docs/context/ref/TimeRange.md rename to website/docs/context/ref/TimeRange.md index 8aba9f07f..8c6f6b184 100644 --- a/docs/context/ref/TimeRange.md +++ b/website/docs/context/ref/TimeRange.md @@ -27,7 +27,7 @@ Notes: ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/timeRange.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/timeRange.schema.json)) ## Type diff --git a/docs/context/ref/Trade.md b/website/docs/context/ref/Trade.md similarity index 94% rename from docs/context/ref/Trade.md rename to website/docs/context/ref/Trade.md index 779cf68a3..e5d00d00c 100644 --- a/docs/context/ref/Trade.md +++ b/website/docs/context/ref/Trade.md @@ -14,7 +14,7 @@ This type currently only defines a required `id` field, which should provide a r ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/trade.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/trade.schema.json)) ## Type diff --git a/docs/context/ref/TradeList.md b/website/docs/context/ref/TradeList.md similarity index 94% rename from docs/context/ref/TradeList.md rename to website/docs/context/ref/TradeList.md index d6d33b88c..c2f298ff2 100644 --- a/docs/context/ref/TradeList.md +++ b/website/docs/context/ref/TradeList.md @@ -12,7 +12,7 @@ The TradeList schema does not explicitly include identifiers in the id section, ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/tradeList.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/tradeList.schema.json)) ## Type diff --git a/docs/context/ref/TransactionResult.md b/website/docs/context/ref/TransactionResult.md similarity index 91% rename from docs/context/ref/TransactionResult.md rename to website/docs/context/ref/TransactionResult.md index 3d10cf01c..d95570a27 100644 --- a/docs/context/ref/TransactionResult.md +++ b/website/docs/context/ref/TransactionResult.md @@ -10,7 +10,7 @@ A context type representing the result of a transaction initiated via FDC3, whic ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/transactionresult.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/transactionresult.schema.json)) ## Type diff --git a/docs/context/ref/Valuation.md b/website/docs/context/ref/Valuation.md similarity index 92% rename from docs/context/ref/Valuation.md rename to website/docs/context/ref/Valuation.md index 7d7bfeaa0..5a534e517 100644 --- a/docs/context/ref/Valuation.md +++ b/website/docs/context/ref/Valuation.md @@ -10,7 +10,7 @@ A context type representing the price and value of a holding. ## Schema - ([github](https://github.com/finos/FDC3/tree/main/schemas/context/valuation.schema.json)) + ([github](https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/context/valuation.schema.json)) ## Type diff --git a/docs/context/spec.md b/website/docs/context/spec.md similarity index 100% rename from docs/context/spec.md rename to website/docs/context/spec.md diff --git a/docs/fdc3-charter.md b/website/docs/fdc3-charter.md similarity index 100% rename from docs/fdc3-charter.md rename to website/docs/fdc3-charter.md diff --git a/docs/fdc3-compliance.md b/website/docs/fdc3-compliance.md similarity index 100% rename from docs/fdc3-compliance.md rename to website/docs/fdc3-compliance.md diff --git a/docs/fdc3-glossary.md b/website/docs/fdc3-glossary.md similarity index 100% rename from docs/fdc3-glossary.md rename to website/docs/fdc3-glossary.md diff --git a/docs/fdc3-intro.md b/website/docs/fdc3-intro.md similarity index 100% rename from docs/fdc3-intro.md rename to website/docs/fdc3-intro.md diff --git a/docs/fdc3-standard.md b/website/docs/fdc3-standard.md similarity index 100% rename from docs/fdc3-standard.md rename to website/docs/fdc3-standard.md diff --git a/docs/guides/submit-new-intent.md b/website/docs/guides/submit-new-intent.md similarity index 100% rename from docs/guides/submit-new-intent.md rename to website/docs/guides/submit-new-intent.md diff --git a/docs/intents/ref/CreateInteraction.md b/website/docs/intents/ref/CreateInteraction.md similarity index 100% rename from docs/intents/ref/CreateInteraction.md rename to website/docs/intents/ref/CreateInteraction.md diff --git a/docs/intents/ref/CreateOrUpdateProfile.md b/website/docs/intents/ref/CreateOrUpdateProfile.md similarity index 100% rename from docs/intents/ref/CreateOrUpdateProfile.md rename to website/docs/intents/ref/CreateOrUpdateProfile.md diff --git a/docs/intents/ref/SendChatMessage.md b/website/docs/intents/ref/SendChatMessage.md similarity index 100% rename from docs/intents/ref/SendChatMessage.md rename to website/docs/intents/ref/SendChatMessage.md diff --git a/docs/intents/ref/StartCall.md b/website/docs/intents/ref/StartCall.md similarity index 100% rename from docs/intents/ref/StartCall.md rename to website/docs/intents/ref/StartCall.md diff --git a/docs/intents/ref/StartChat.md b/website/docs/intents/ref/StartChat.md similarity index 100% rename from docs/intents/ref/StartChat.md rename to website/docs/intents/ref/StartChat.md diff --git a/docs/intents/ref/StartEmail.md b/website/docs/intents/ref/StartEmail.md similarity index 100% rename from docs/intents/ref/StartEmail.md rename to website/docs/intents/ref/StartEmail.md diff --git a/docs/intents/ref/ViewAnalysis.md b/website/docs/intents/ref/ViewAnalysis.md similarity index 100% rename from docs/intents/ref/ViewAnalysis.md rename to website/docs/intents/ref/ViewAnalysis.md diff --git a/docs/intents/ref/ViewChart.md b/website/docs/intents/ref/ViewChart.md similarity index 100% rename from docs/intents/ref/ViewChart.md rename to website/docs/intents/ref/ViewChart.md diff --git a/docs/intents/ref/ViewChat.md b/website/docs/intents/ref/ViewChat.md similarity index 100% rename from docs/intents/ref/ViewChat.md rename to website/docs/intents/ref/ViewChat.md diff --git a/docs/intents/ref/ViewContact.md b/website/docs/intents/ref/ViewContact.md similarity index 100% rename from docs/intents/ref/ViewContact.md rename to website/docs/intents/ref/ViewContact.md diff --git a/docs/intents/ref/ViewHoldings.md b/website/docs/intents/ref/ViewHoldings.md similarity index 100% rename from docs/intents/ref/ViewHoldings.md rename to website/docs/intents/ref/ViewHoldings.md diff --git a/docs/intents/ref/ViewInstrument.md b/website/docs/intents/ref/ViewInstrument.md similarity index 100% rename from docs/intents/ref/ViewInstrument.md rename to website/docs/intents/ref/ViewInstrument.md diff --git a/docs/intents/ref/ViewInteractions.md b/website/docs/intents/ref/ViewInteractions.md similarity index 100% rename from docs/intents/ref/ViewInteractions.md rename to website/docs/intents/ref/ViewInteractions.md diff --git a/docs/intents/ref/ViewMessages.md b/website/docs/intents/ref/ViewMessages.md similarity index 100% rename from docs/intents/ref/ViewMessages.md rename to website/docs/intents/ref/ViewMessages.md diff --git a/docs/intents/ref/ViewNews.md b/website/docs/intents/ref/ViewNews.md similarity index 100% rename from docs/intents/ref/ViewNews.md rename to website/docs/intents/ref/ViewNews.md diff --git a/docs/intents/ref/ViewOrders.md b/website/docs/intents/ref/ViewOrders.md similarity index 100% rename from docs/intents/ref/ViewOrders.md rename to website/docs/intents/ref/ViewOrders.md diff --git a/docs/intents/ref/ViewProfile.md b/website/docs/intents/ref/ViewProfile.md similarity index 100% rename from docs/intents/ref/ViewProfile.md rename to website/docs/intents/ref/ViewProfile.md diff --git a/docs/intents/ref/ViewQuote.md b/website/docs/intents/ref/ViewQuote.md similarity index 100% rename from docs/intents/ref/ViewQuote.md rename to website/docs/intents/ref/ViewQuote.md diff --git a/docs/intents/ref/ViewResearch.md b/website/docs/intents/ref/ViewResearch.md similarity index 100% rename from docs/intents/ref/ViewResearch.md rename to website/docs/intents/ref/ViewResearch.md diff --git a/docs/intents/spec.md b/website/docs/intents/spec.md similarity index 100% rename from docs/intents/spec.md rename to website/docs/intents/spec.md diff --git a/docs/references.md b/website/docs/references.md similarity index 100% rename from docs/references.md rename to website/docs/references.md diff --git a/docs/trademarks.md b/website/docs/trademarks.md similarity index 100% rename from docs/trademarks.md rename to website/docs/trademarks.md diff --git a/docs/use-cases/001-equity-sell-side-trader.md b/website/docs/use-cases/001-equity-sell-side-trader.md similarity index 100% rename from docs/use-cases/001-equity-sell-side-trader.md rename to website/docs/use-cases/001-equity-sell-side-trader.md diff --git a/docs/use-cases/002-buy-side-portfolio-manager.md b/website/docs/use-cases/002-buy-side-portfolio-manager.md similarity index 100% rename from docs/use-cases/002-buy-side-portfolio-manager.md rename to website/docs/use-cases/002-buy-side-portfolio-manager.md diff --git a/docs/use-cases/003-inhouse-cross-platform-launcher.md b/website/docs/use-cases/003-inhouse-cross-platform-launcher.md similarity index 100% rename from docs/use-cases/003-inhouse-cross-platform-launcher.md rename to website/docs/use-cases/003-inhouse-cross-platform-launcher.md diff --git a/docs/use-cases/004-client-side-fx-trader.md b/website/docs/use-cases/004-client-side-fx-trader.md similarity index 100% rename from docs/use-cases/004-client-side-fx-trader.md rename to website/docs/use-cases/004-client-side-fx-trader.md diff --git a/docs/use-cases/005-buy-side-treasurer.md b/website/docs/use-cases/005-buy-side-treasurer.md similarity index 100% rename from docs/use-cases/005-buy-side-treasurer.md rename to website/docs/use-cases/005-buy-side-treasurer.md diff --git a/docs/use-cases/006-call-transcription-to-crm.md b/website/docs/use-cases/006-call-transcription-to-crm.md similarity index 100% rename from docs/use-cases/006-call-transcription-to-crm.md rename to website/docs/use-cases/006-call-transcription-to-crm.md diff --git a/docs/use-cases/007-realtime-trade-ticket-population.md b/website/docs/use-cases/007-realtime-trade-ticket-population.md similarity index 100% rename from docs/use-cases/007-realtime-trade-ticket-population.md rename to website/docs/use-cases/007-realtime-trade-ticket-population.md diff --git a/docs/use-cases/008-user-launches-multiple-apps-from-a-single-container.md b/website/docs/use-cases/008-user-launches-multiple-apps-from-a-single-container.md similarity index 100% rename from docs/use-cases/008-user-launches-multiple-apps-from-a-single-container.md rename to website/docs/use-cases/008-user-launches-multiple-apps-from-a-single-container.md diff --git a/docs/use-cases/009-sales-floor-base-workflow.md b/website/docs/use-cases/009-sales-floor-base-workflow.md similarity index 100% rename from docs/use-cases/009-sales-floor-base-workflow.md rename to website/docs/use-cases/009-sales-floor-base-workflow.md diff --git a/docs/use-cases/010-quantifying-fdc3-interactions.md b/website/docs/use-cases/010-quantifying-fdc3-interactions.md similarity index 100% rename from docs/use-cases/010-quantifying-fdc3-interactions.md rename to website/docs/use-cases/010-quantifying-fdc3-interactions.md diff --git a/docs/use-cases/011-fine-tuning-interop-with-channels.md b/website/docs/use-cases/011-fine-tuning-interop-with-channels.md similarity index 100% rename from docs/use-cases/011-fine-tuning-interop-with-channels.md rename to website/docs/use-cases/011-fine-tuning-interop-with-channels.md diff --git a/docs/use-cases/meeting-minutes/2020-01-16 uc-wg meeting notes.md b/website/docs/use-cases/meeting-minutes/2020-01-16 uc-wg meeting notes.md similarity index 100% rename from docs/use-cases/meeting-minutes/2020-01-16 uc-wg meeting notes.md rename to website/docs/use-cases/meeting-minutes/2020-01-16 uc-wg meeting notes.md diff --git a/docs/use-cases/meeting-minutes/2020-02-20 uc-wg meeting notes.md b/website/docs/use-cases/meeting-minutes/2020-02-20 uc-wg meeting notes.md similarity index 100% rename from docs/use-cases/meeting-minutes/2020-02-20 uc-wg meeting notes.md rename to website/docs/use-cases/meeting-minutes/2020-02-20 uc-wg meeting notes.md diff --git a/docs/use-cases/meeting-minutes/2020-03-19 uc-wg meeting notes.md b/website/docs/use-cases/meeting-minutes/2020-03-19 uc-wg meeting notes.md similarity index 100% rename from docs/use-cases/meeting-minutes/2020-03-19 uc-wg meeting notes.md rename to website/docs/use-cases/meeting-minutes/2020-03-19 uc-wg meeting notes.md diff --git a/docs/use-cases/overview.md b/website/docs/use-cases/overview.md similarity index 100% rename from docs/use-cases/overview.md rename to website/docs/use-cases/overview.md diff --git a/docs/use-cases/readme.md b/website/docs/use-cases/readme.md similarity index 100% rename from docs/use-cases/readme.md rename to website/docs/use-cases/readme.md diff --git a/docs/why-fdc3.md b/website/docs/why-fdc3.md similarity index 100% rename from docs/why-fdc3.md rename to website/docs/why-fdc3.md diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 13cadf52a..0ced4c7ef 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -28,7 +28,7 @@ module.exports={ "docs": { "showLastUpdateAuthor": true, "showLastUpdateTime": true, - "path": "../docs", + "path": "./docs", "sidebarPath": "./sidebars.json", }, "blog": { @@ -64,7 +64,7 @@ module.exports={ "navbar": { "title": "FDC3", "logo": { - "src": "img/fdc3-icon-light-2019.svg", + "src": "img/fdc3-icon-light-2019.svg", "srcDark": "img/fdc3-icon-2019.svg" }, "items": [ diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 000000000..0f714b31f --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,17790 @@ +{ + "name": "website", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "axios": "0.28.1", + "trim": "1.0.1" + }, + "devDependencies": { + "@docusaurus/core": "~2.4.1", + "@docusaurus/preset-classic": "~2.4.1", + "@docusaurus/theme-mermaid": "~2.4.1", + "clsx": "^1.2.1", + "cpy-cli": "4.2.0", + "cross-env": "^7.0.3", + "del-cli": "5.0.0", + "fs-extra": "^11.2.0", + "js-yaml": "^4.1.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "replace-in-files-cli": "2.0.0", + "replace-json-property": "1.8.0", + "rimraf": "5.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", + "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", + "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", + "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", + "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.13.0.tgz", + "integrity": "sha512-2SP6bGGWOTN920MLZv8s7yIR3OqY03vEe4U+vb2MGdL8a/8EQznF3L/nTC/rGf/hvEfZlX2tGFxPJaF2waravg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", + "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.13.0.tgz", + "integrity": "sha512-s2ge3uZ6Zg2sPSFibqijgEYsuorxcc8KVHg3I95nOPHvFHdnBtSHymhZvq4sp/fu8ijt/Y8jLwkuqm5myn+2Sg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.13.0", + "@algolia/requester-browser-xhr": "5.13.0", + "@algolia/requester-fetch": "5.13.0", + "@algolia/requester-node-http": "5.13.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", + "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", + "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.13.0.tgz", + "integrity": "sha512-NV6oSCt5lFuzfsVQoSBpewEWf/h4ySr7pv2bfwu9yF/jc/g39pig8+YpuqsxlRWBm/lTGVA2V0Ai9ySwrNumIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.13.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.13.0.tgz", + "integrity": "sha512-094bK4rumf+rXJazxv3mq6eKRM0ep5AxIo8T0YmOdldswQt79apeufFiPLN19nHEWH22xR2FelimD+T/wRSP+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.13.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.13.0.tgz", + "integrity": "sha512-JY5xhEYMgki53Wm+A6R2jUpOUdD0zZnBq+PC5R1TGMNOYL1s6JjDrJeMsvaI2YWxYMUSoCnRoltN/yf9RI8n3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.13.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", + "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", + "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", + "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", + "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz", + "integrity": "sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.4.3", + "@docusaurus/logger": "2.4.3", + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-common": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^2.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.3.tgz", + "integrity": "sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/logger": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.3.tgz", + "integrity": "sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.3.tgz", + "integrity": "sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/mdx-loader/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz", + "integrity": "sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.3", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.3.tgz", + "integrity": "sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/logger": "2.4.3", + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-common": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.3.tgz", + "integrity": "sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/logger": "2.4.3", + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/module-type-aliases": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.3.tgz", + "integrity": "sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.3.tgz", + "integrity": "sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.3.tgz", + "integrity": "sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz", + "integrity": "sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.3.tgz", + "integrity": "sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.3.tgz", + "integrity": "sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/logger": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-common": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.3.tgz", + "integrity": "sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/plugin-content-blog": "2.4.3", + "@docusaurus/plugin-content-docs": "2.4.3", + "@docusaurus/plugin-content-pages": "2.4.3", + "@docusaurus/plugin-debug": "2.4.3", + "@docusaurus/plugin-google-analytics": "2.4.3", + "@docusaurus/plugin-google-gtag": "2.4.3", + "@docusaurus/plugin-google-tag-manager": "2.4.3", + "@docusaurus/plugin-sitemap": "2.4.3", + "@docusaurus/theme-classic": "2.4.3", + "@docusaurus/theme-common": "2.4.3", + "@docusaurus/theme-search-algolia": "2.4.3", + "@docusaurus/types": "2.4.3" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.3.tgz", + "integrity": "sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/module-type-aliases": "2.4.3", + "@docusaurus/plugin-content-blog": "2.4.3", + "@docusaurus/plugin-content-docs": "2.4.3", + "@docusaurus/plugin-content-pages": "2.4.3", + "@docusaurus/theme-common": "2.4.3", + "@docusaurus/theme-translations": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-common": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.3.tgz", + "integrity": "sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "2.4.3", + "@docusaurus/module-type-aliases": "2.4.3", + "@docusaurus/plugin-content-blog": "2.4.3", + "@docusaurus/plugin-content-docs": "2.4.3", + "@docusaurus/plugin-content-pages": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-common": "2.4.3", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-2.4.3.tgz", + "integrity": "sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.4.3", + "@docusaurus/module-type-aliases": "2.4.3", + "@docusaurus/theme-common": "2.4.3", + "@docusaurus/types": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "@mdx-js/react": "^1.6.22", + "mermaid": "^9.2.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz", + "integrity": "sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.4.3", + "@docusaurus/logger": "2.4.3", + "@docusaurus/plugin-content-docs": "2.4.3", + "@docusaurus/theme-common": "2.4.3", + "@docusaurus/theme-translations": "2.4.3", + "@docusaurus/utils": "2.4.3", + "@docusaurus/utils-validation": "2.4.3", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.3.tgz", + "integrity": "sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/theme-translations/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz", + "integrity": "sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz", + "integrity": "sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "2.4.3", + "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.3.tgz", + "integrity": "sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.3.tgz", + "integrity": "sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "2.4.3", + "@docusaurus/utils": "2.4.3", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/utils/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", + "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", + "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.2.tgz", + "integrity": "sha512-3YQ6eo7uYOCHeQ2ZpD+OoT3aJJwMNKEnwtu8WMzm81XmBOSCwRjQditH9CeSOQ38qhHkuGw23pbq+kULkIJLcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz", + "integrity": "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz", + "integrity": "sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.1.tgz", + "integrity": "sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/cp-file": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", + "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", + "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^3.0.0", + "cp-file": "^9.1.0", + "globby": "^13.1.1", + "junk": "^4.0.0", + "micromatch": "^4.0.4", + "nested-error-stacks": "^2.1.0", + "p-filter": "^3.0.0", + "p-map": "^5.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy-cli": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-4.2.0.tgz", + "integrity": "sha512-b04b+cbdr29CdpREPKw/itrfjO43Ty0Aj7wRM6M6LoE4GJxZJCk9Xp+Eu1IqztkKh3LxIBt1tDplENsa6KYprg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cpy": "^9.0.0", + "meow": "^10.1.2" + }, + "bin": { + "cpy": "cli.js" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", + "dev": true, + "license": "MIT", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.0.0.tgz", + "integrity": "sha512-rENFhUaYcjoMODwFhhlON+ogN7DoG+4+GFN+bsA1XeDt4w2OKQnQadFP1thHSAlK9FAtl88qgP66wOV+eFZZiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^7.0.0", + "meow": "^10.1.3" + }, + "bin": { + "del": "cli.js", + "del-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/del": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", + "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/del-cli/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", + "dev": true, + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", + "dev": true, + "license": "EPL-2.0" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "license": "MIT" + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.0.3.tgz", + "integrity": "sha512-0Jud3OMUdMbrlr3PyUMKESq51LXVAB+a239Ywdvd+Kgxj3MaBRml/nVRxf8tQFyfthMjuRkxkv7Vg58pmIMfuQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "cliui": "^7.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.9.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", + "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", + "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", + "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.9", + "dayjs": "^1.11.7", + "dompurify": "2.4.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", + "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true, + "license": "MIT" + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", + "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^5.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.0.tgz", + "integrity": "sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz", + "integrity": "sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "cosmiconfig-typescript-loader": "^4.3.0", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "ts-node": ">=10", + "typescript": ">=4", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", + "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-in-files-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-2.0.0.tgz", + "integrity": "sha512-N2JsH7OenOxwv5Ww/tT3Fo6HAwYObAIOFNCu9W9oZJpxE+l7xxN8Aigx2z3JDxM2bIGmznYGJpI9HFEliIdZfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "globby": "^12.0.2", + "meow": "^10.1.1", + "normalize-path": "^3.0.0", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "replace-in-files": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace-in-files-cli/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace-in-files-cli/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace-in-files-cli/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace-in-files-cli/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace-json-property": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/replace-json-property/-/replace-json-property-1.8.0.tgz", + "integrity": "sha512-x0TN9mR0Q6b9THtl9tKJj+MGokgC4OMSacgZx2BrX6nce2FufNiu+j8QG05eN0GXDBqlrFs+0OnxOGzWEnSrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "commander": "^2.19.0", + "jsonfile": "^5.0.0" + }, + "bin": { + "replace-json-property": "bin/replace-json-property.bin.js", + "rjp": "bin/replace-json-property.bin.js" + } + }, + "node_modules/replace-json-property/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/replace-json-property/node_modules/jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^0.1.2" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/replace-json-property/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.0.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.1.tgz", + "integrity": "sha512-ngom3wq2UhjdbmRE/krgkD8BQyi1KZ5l+D2dVm4+Yj+jJIBp74/ZGunL6gNGc/CYuQmvUBiavWEXIotRiv5R6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "fs.realpath": "^1.0.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "dev": true + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true, + "license": "MIT" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-1.0.1.tgz", + "integrity": "sha512-3JVP2YVqITUisXblCDq/Bi4P9457G/sdEamInkyvCsjbTcXLXIiG7XCb4kGMFWh6JGXesS3TKxOPtrncN/xe8w==", + "deprecated": "Use String.prototype.trim() instead", + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/wait-on/node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", + "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json index 891c7e6d4..024383f49 100644 --- a/website/package.json +++ b/website/package.json @@ -1,15 +1,17 @@ { "scripts": { + "clean": "npx rimraf build .docusaurus", "examples": "docusaurus-examples", - "prestart": "node schema2Markdown.js", + "prestart": "npm run copy-schemas && npm run copy-appd && node schema2Markdown.js", "start": "docusaurus start", - "prebuild": "node schema2Markdown.js && npm run copy-appd && npm run copy-schemas && npm run copy-workbench && npm run copy-explained", + "prebuild": "npm run parent-build && npm run copy-schemas && npm run copy-appd && npm run copy-workbench && npm run copy-reference-ui && node schema2Markdown.js && npm run copy-workbench && npm run copy-explained", "build": "docusaurus build", - "copy-schemas": "del-cli static/schemas/next/*/ && cpy \"../schemas/**\" static/schemas/next/", - "copy-appd": "cpy \"../src/app-directory/specification/*.schema.json\" \"static/schemas/next/\"", - "build-workbench": "cd ../toolbox/fdc3-workbench && npm install && npm run build", - "copy-workbench": "del-cli static/toolbox/fdc3-workbench && npm run build-workbench && cpy \"../toolbox/fdc3-workbench/build/**\" static/toolbox/fdc3-workbench", - "copy-explained": "del-cli static/toolbox/fdc3-explained && cpy \"../toolbox/fdc3-explained\" ../website/static/toolbox/", + "parent-build": "cd .. && npm install && npm run build", + "copy-schemas": "del-cli static/schemas/next/*/ && cpy \"../packages/fdc3-schema/schemas/**\" static/schemas/next/ && cpy \"../packages/fdc3-context/schemas/context\" static/schemas/next/", + "copy-appd": "cpy \"../packages/fdc3-standard/src/app-directory/specification/*.schema.json\" \"static/schemas/next/\"", + "copy-workbench": "del-cli static/toolbox/fdc3-workbench && cpy \"../toolbox/fdc3-workbench/build/**\" static/toolbox/fdc3-workbench", + "copy-reference-ui": "del-cli static/toolbox/fdc3-reference-ui && cpy \"../toolbox/fdc3-for-web/reference-ui/dist/**\" static/toolbox/fdc3-reference-ui", + "copy-explained": "del-cli static/toolbox/fdc3-explained && cpy \"../toolbox/fdc3-explained\" ./static/toolbox/", "version": "cross-env-shell VERSION=2.1 \"echo \\\"Creating version: $VERSION...\\\" && npm run version:docs && npm run version:docs-schema && npm run version:docs-replace && npm run version:schemas && npm run version:schemas-replace && npm run version:appd-replace", "version:docs": "cross-env-shell \"docusaurus docs:version $VERSION\"", "version:docs-schema": "cross-env-shell replace-in-files --string=/schemas/next --replacement=/schemas/$VERSION versioned_docs/version-$VERSION/**/*.md", @@ -29,12 +31,12 @@ "cpy-cli": "4.2.0", "cross-env": "^7.0.3", "del-cli": "5.0.0", + "fs-extra": "^11.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "replace-in-files-cli": "2.0.0", "replace-json-property": "1.8.0", "rimraf": "5.0.0", - "fs-extra": "^11.2.0", "js-yaml": "^4.1.0" }, "resolutions": { @@ -50,4 +52,4 @@ "trim": "1.0.1", "axios": "0.28.1" } -} +} \ No newline at end of file diff --git a/website/schema2Markdown.js b/website/schema2Markdown.js index 145f52fdc..85981c275 100644 --- a/website/schema2Markdown.js +++ b/website/schema2Markdown.js @@ -180,9 +180,12 @@ function generateObjectMD(schema, objectName, schemaFolderName, filePath) { } //if working on windows you may have the wrong slashes... - const workingPath = filePath.replaceAll("\\","/"); + const workingPath = filePath.replaceAll("\\","/"); const url = schema.$id; - const githubUrl = workingPath.replace("../schemas/", `https://github.com/finos/FDC3/tree/main/schemas/`); + const githubUrl = workingPath.includes('context') + ? workingPath.replace("static/schemas/next/", `https://github.com/finos/FDC3/tree/main/packages/fdc3-context/schemas/`) + : workingPath.replace("static/schemas/next/", `https://github.com/finos/FDC3/tree/main/packages/fdc3-schema/schemas/`); + markdownContent += `## Schema\n\n<${url}> ([github](${githubUrl}))\n\n`; if (hasAllOf(schema.allOf) || hasProperties(schema)) { @@ -231,7 +234,7 @@ function generateObjectMD(schema, objectName, schemaFolderName, filePath) { // outputDocName must not contain any spaces const outputDocName = `${title.replace(/\s+/g, '')}`; const outputDocsPath = `${schemaFolderName}/ref/${outputDocName}`; - const outputFilePath = `../docs/${schemaFolderName}/ref/${outputDocName}.md`; + const outputFilePath = `./docs/${schemaFolderName}/ref/${outputDocName}.md`; fse.outputFileSync(outputFilePath, `---\n${yaml.dump(frontMatter)}\n---\n\n${markdownContent}`); @@ -350,11 +353,15 @@ function retrieveTitleFromSchemaData(schemaData, pathInSchema) { } function parseSchemaFolder(schemaFolderName) { + const schemaFolder = `./static/schemas/next/${schemaFolderName}`; + + console.debug("Parsing schema folder: ", schemaFolder); + // Read all files in the schema folder - const schemaFiles = fse.readdirSync("../schemas/"+schemaFolderName) - .filter(file => file.endsWith('.json')) - // nosemgrep - .map(file => path.join("../schemas/"+schemaFolderName, file)); + const schemaFiles = fse.readdirSync(schemaFolder) + .filter(file => file.endsWith('.json')) + // nosemgrep + .map(file => path.join(schemaFolder, file)); // Process each schema file let sidebarItems = []; diff --git a/website/static/schemas/next/api/README.md b/website/static/schemas/next/api/README.md deleted file mode 100644 index c782f2e7a..000000000 --- a/website/static/schemas/next/api/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Intro - -Quicktype, the chosen generation tool currently has some limitations that prevent fully automatic schema generation from the existing TS types. For example it can not handle interfaces that contain methods in their definition. It also fails to generate schemas even if a type contains unused references to other types or interfaces that contain async functions (Promise return types). Therefore, in order to generate the `api\schemas\api.schema.json` some manual intervention was needed. - -Once these limitations are not an issue the `api\schemas\t2sQuicktypeUtil.js` script should be moved to the root level of the project and a new npm script `"api-schema-gen": "node t2sQuicktypeUtil.js src/api schemas/api/api.schema.json"` should be added. - -`api\schemas\api.schema.json` - partially auto-generated schema from the existing `src\api` types. -`api\schemas\baseImplementationMetadata.schema.json` - Used by bridging types that leave out the metadata of the calling application as it does not apply to bridging. -`api\schemas\intentResolution.schema.json` - At the moment it is not possible to auto-generate this due to limitations in the generation tool (quicktype) -`api\schemas\t2sQuicktypeUtil.js` - Script used to run the generation of the schema from the types. Should be moved to the root level of the repo once fully-automated generation can be achieved. diff --git a/website/static/schemas/next/api/api.schema.json b/website/static/schemas/next/api/api.schema.json deleted file mode 100644 index 581762274..000000000 --- a/website/static/schemas/next/api/api.schema.json +++ /dev/null @@ -1,472 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/api/api.schema.json", - "title": "FDC3 Desktop Agent API Schema", - "definitions": { - "AppIdentifier": { - "description": "Identifies an application, or instance of an application, and is used to target FDC3 API calls, such as `fdc3.open` or `fdc3.raiseIntent` at specific applications or application instances.\n\nWill always include at least an `appId` field, which uniquely identifies a specific app.\n\nIf the `instanceId` field is set then the `AppMetadata` object represents a specific instance of the application that may be addressed using that Id.", - "title": "AppIdentifier", - "type": "object", - "properties": { - "appId": { - "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", - "type": "string", - "title": "appId" - }, - "instanceId": { - "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", - "type": "string", - "title": "instanceId" - }, - "desktopAgent": { - "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", - "type": "string", - "title": "desktopAgent" - } - }, - "unevaluatedProperties": false, - "required": [ - "appId" - ] - }, - "Icon": { - "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", - "title": "Icon", - "type": "object", - "properties": { - "src": { - "description": "The icon url", - "type": "string", - "title": "src" - }, - "size": { - "description": "The icon dimension, formatted as `x`.", - "type": "string", - "title": "size" - }, - "type": { - "description": "Icon media type. If not present the Desktop Agent may use the src file extension.", - "type": "string", - "title": "type" - } - }, - "additionalProperties": false, - "required": [ - "src" - ] - }, - "Image": { - "description": "SPDX-License-Identifier: Apache-2.0\nCopyright FINOS FDC3 contributors - see NOTICE file", - "title": "Image", - "type": "object", - "properties": { - "src": { - "description": "The image url.", - "type": "string", - "title": "src" - }, - "size": { - "description": "The image dimension, formatted as `x`.", - "type": "string", - "title": "size" - }, - "type": { - "description": "Image media type. If not present the Desktop Agent may use the src file extension.", - "type": "string", - "title": "type" - }, - "label": { - "description": "Caption for the image.", - "type": "string", - "title": "label" - } - }, - "additionalProperties": false, - "required": [ - "src" - ] - }, - "AppMetadata": { - "description": "Extends an `AppIdentifier`, describing an application or instance of an application, with additional descriptive metadata that is usually provided by an FDC3 App Directory that the desktop agent connects to.\n\nThe additional information from an app directory can aid in rendering UI elements, such as a launcher menu or resolver UI. This includes a title, description, tooltip and icon and screenshot URLs.\n\nNote that as `AppMetadata` instances are also `AppIdentifiers` they may be passed to the `app` argument of `fdc3.open`, `fdc3.raiseIntent` etc.", - "title": "AppMetadata", - "type": "object", - "properties": { - "name": { - "description": "The 'friendly' app name. \nThis field was used with the `open` and `raiseIntent` calls in FDC3 <2.0, which now require an `AppIdentifier` wth `appId` set. \nNote that for display purposes the `title` field should be used, if set, in preference to this field.", - "type": "string", - "title": "name" - }, - "version": { - "description": "The Version of the application.", - "type": "string", - "title": "version" - }, - "instanceMetadata": { - "description": "An optional set of, implementation specific, metadata fields that can be used to disambiguate instances, such as a window title or screen position. Must only be set if `instanceId` is set.", - "type": "object", - "additionalProperties": {}, - "title": "instanceMetadata" - }, - "title": { - "description": "A more user-friendly application title that can be used to render UI elements", - "type": "string", - "title": "title" - }, - "tooltip": { - "description": "A tooltip for the application that can be used to render UI elements", - "type": "string", - "title": "tooltip" - }, - "description": { - "description": "A longer, multi-paragraph description for the application that could include markup", - "type": "string", - "title": "description" - }, - "icons": { - "description": "A list of icon URLs for the application that can be used to render UI elements", - "type": "array", - "items": { - "$ref": "#/definitions/Icon" - }, - "title": "icons" - }, - "screenshots": { - "description": "Images representing the app in common usage scenarios that can be used to render UI elements", - "type": "array", - "items": { - "$ref": "#/definitions/Image" - }, - "title": "screenshots" - }, - "resultType": { - "description": "The type of output returned for any intent specified during resolution. May express a particular context type (e.g. \"fdc3.instrument\"), channel (e.g. \"channel\") or a channel that will receive a specified type (e.g. \"channel\").", - "type": [ - "null", - "string" - ], - "title": "resultType" - }, - "appId": { - "description": "The unique application identifier located within a specific application directory instance. An example of an appId might be 'app@sub.root'", - "type": "string", - "title": "appId" - }, - "instanceId": { - "description": "An optional instance identifier, indicating that this object represents a specific instance of the application described.", - "type": "string", - "title": "instanceId" - }, - "desktopAgent": { - "description": "The Desktop Agent that the app is available on. Used in Desktop Agent Bridging to identify the Desktop Agent to target.", - "type": "string", - "title": "desktopAgent" - } - }, - "additionalProperties": false, - "required": [ - "appId" - ] - }, - "IntentMetadata": { - "description": "Intent descriptor", - "title": "IntentMetadata", - "type": "object", - "properties": { - "name": { - "description": "The unique name of the intent that can be invoked by the raiseIntent call", - "type": "string", - "title": "name" - }, - "displayName": { - "description": "Display name for the intent.", - "type": "string", - "title": "displayName" - } - }, - "additionalProperties": false, - "required": [ - "name" - ] - }, - "AppIntent": { - "description": "An interface that relates an intent to apps", - "title": "AppIntent", - "type": "object", - "properties": { - "intent": { - "$ref": "#/definitions/IntentMetadata", - "description": "Details of the intent whose relationship to resolving applications is being described.", - "title": "intent" - }, - "apps": { - "description": "Details of applications that can resolve the intent.", - "type": "array", - "items": { - "$ref": "#/definitions/AppMetadata" - }, - "title": "apps" - } - }, - "additionalProperties": false, - "required": [ - "apps", - "intent" - ] - }, - "DisplayMetadata": { - "description": "A system channel will be global enough to have a presence across many apps. This gives us some hints\nto render them in a standard way. It is assumed it may have other properties too, but if it has these,\nthis is their meaning.", - "title": "DisplayMetadata", - "type": "object", - "properties": { - "name": { - "description": "A user-readable name for this channel, e.g: `\"Red\"`", - "type": "string", - "title": "name" - }, - "color": { - "description": "The color that should be associated within this channel when displaying this channel in a UI, e.g: `0xFF0000`.", - "type": "string", - "title": "color" - }, - "glyph": { - "description": "A URL of an image that can be used to display this channel", - "type": "string", - "title": "glyph" - } - }, - "additionalProperties": false - }, - "Channel": { - "description": "Represents a context channel that applications can use to send and receive\ncontext data.\n\nPlease note that There are differences in behavior when you interact with a\nUser channel via the `DesktopAgent` interface and the `Channel` interface.\nSpecifically, when 'joining' a User channel or adding a context listener\nwhen already joined to a channel via the `DesktopAgent` interface, existing\ncontext (matching the type of the context listener) on the channel is\nreceived by the context listener immediately. Whereas, when a context\nlistener is added via the Channel interface, context is not received\nautomatically, but may be retrieved manually via the `getCurrentContext()`\nfunction.", - "title": "Channel", - "type": "object", - "properties": { - "id": { - "description": "Constant that uniquely identifies this channel.", - "type": "string", - "title": "id" - }, - "type": { - "description": "Uniquely defines each channel type.\nCan be \"user\", \"app\" or \"private\".", - "enum": [ - "app", - "private", - "user" - ], - "type": "string", - "title": "type" - }, - "displayMetadata": { - "description": "Channels may be visualized and selectable by users. DisplayMetadata may be used to provide hints on how to see them.\nFor App channels, displayMetadata would typically not be present.", - "$ref": "#/definitions/DisplayMetadata", - "title": "displayMetadata" - } - }, - "additionalProperties": false, - "required": [ - "id", - "type" - ] - }, - "ContextMetadata": { - "description": "Metadata relating to a context or intent and context received through the\n`addContextListener` and `addIntentListener` functions.", - "title": "ContextMetadata", - "type": "object", - "properties": { - "source": { - "$ref": "#/definitions/AppIdentifier", - "description": "Identifier for the app instance that sent the context and/or intent.", - "title": "source" - } - }, - "additionalProperties": false, - "required": [ - "source" - ] - }, - "DesktopAgentIdentifier": { - "description": "Identifies a particular Desktop Agent in Desktop Agent Bridging scenarios\nwhere a request needs to be directed to a Desktop Agent rather than a specific app, or a\nresponse message is returned by the Desktop Agent (or more specifically its resolver)\nrather than a specific app. Used as a substitute for `AppIdentifier` in cases where no\napp details are available or are appropriate.", - "title": "DesktopAgentIdentifier", - "type": "object", - "properties": { - "desktopAgent": { - "description": "Used in Desktop Agent Bridging to attribute or target a message to a\nparticular Desktop Agent.", - "type": "string", - "title": "desktopAgent" - } - }, - "unevaluatedProperties": false, - "required": [ - "desktopAgent" - ] - }, - "OpenError": { - "description": "Constants representing the errors that can be encountered when calling the `open` method on the DesktopAgent object (`fdc3`).", - "title": "OpenError", - "enum": [ - "AppNotFound", - "AppTimeout", - "DesktopAgentNotFound", - "ErrorOnLaunch", - "MalformedContext", - "ResolverUnavailable" - ], - "type": "string" - }, - "ResolveError": { - "description": "Constants representing the errors that can be encountered when calling the `findIntent`, `findIntentsByContext`, `raiseIntent` or `raiseIntentForContext` methods on the DesktopAgent (`fdc3`).", - "title": "ResolveError", - "enum": [ - "DesktopAgentNotFound", - "IntentDeliveryFailed", - "MalformedContext", - "NoAppsFound", - "ResolverTimeout", - "ResolverUnavailable", - "TargetAppUnavailable", - "TargetInstanceUnavailable", - "UserCancelledResolution" - ], - "type": "string" - }, - "ResultError": { - "title": "ResultError", - "enum": [ - "IntentHandlerRejected", - "NoResultReturned" - ], - "type": "string" - }, - "ChannelError": { - "title": "ChannelError", - "enum": [ - "AccessDenied", - "CreationFailed", - "MalformedContext", - "NoChannelFound" - ], - "type": "string" - }, - "BridgingError": { - "title": "BridgingError", - "enum": [ - "AgentDisconnected", - "NotConnectedToBridge", - "ResponseToBridgeTimedOut", - "MalformedMessage" - ], - "type": "string" - }, - "BaseImplementationMetadata": { - "description": "Metadata relating to the FDC3 Desktop Agent implementation and its provider.", - "title": "BaseImplementationMetadata", - "type": "object", - "properties": { - "fdc3Version": { - "description": "The version number of the FDC3 specification that the implementation provides.\nThe string must be a numeric semver version, e.g. 1.2 or 1.2.1.", - "type": "string", - "title": "fdc3Version" - }, - "provider": { - "description": "The name of the provider of the Desktop Agent implementation (e.g. Finsemble, Glue42, OpenFin etc.).", - "type": "string", - "title": "provider" - }, - "providerVersion": { - "description": "The version of the provider of the Desktop Agent implementation (e.g. 5.3.0).", - "type": "string", - "title": "providerVersion" - }, - "optionalFeatures": { - "description": "Metadata indicating whether the Desktop Agent implements optional features of\nthe Desktop Agent API.", - "type": "object", - "properties": { - "OriginatingAppMetadata": { - "description": "Used to indicate whether the exposure of 'originating app metadata' for\ncontext and intent messages is supported by the Desktop Agent.", - "type": "boolean", - "title": "OriginatingAppMetadata" - }, - "UserChannelMembershipAPIs": { - "description": "Used to indicate whether the optional `fdc3.joinUserChannel`,\n`fdc3.getCurrentChannel` and `fdc3.leaveCurrentChannel` are implemented by\nthe Desktop Agent.", - "type": "boolean", - "title": "UserChannelMembershipAPIs" - }, - "DesktopAgentBridging": { - "description": "Used to indicate whether the experimental Desktop Agent Bridging\nfeature is implemented by the Desktop Agent.", - "type": "boolean", - "title": "DesktopAgentBridging" - } - }, - "additionalProperties": false, - "required": [ - "DesktopAgentBridging", - "OriginatingAppMetadata", - "UserChannelMembershipAPIs" - ], - "title": "optionalFeatures" - } - }, - "required": [ - "fdc3Version", - "optionalFeatures", - "provider" - ] - }, - "ImplementationMetadata": { - "description": "Includes Metadata for the current application.", - "title": "ImplementationMetadata", - "type": "object", - "allOf": [ - { - "$ref": "#/definitions/BaseImplementationMetadata" - }, - { - "type": "object", - "properties": { - "appMetadata": { - "$ref": "#/definitions/AppMetadata", - "description": "The calling application instance's own metadata, according to the Desktop Agent (MUST include at least the `appId` and `instanceId`).", - "title": "appMetadata" - } - } - } - ], - "properties": { - "fdc3Version": true, - "provider": true, - "providerVersion": true, - "optionalFeatures": true, - "appMetadata": true - }, - "required": [ - "fdc3Version", - "optionalFeatures", - "provider", - "appMetadata" - ], - "additionalProperties": false - }, - "IntentResolution": { - "description": "IntentResolution provides a standard format for data returned upon resolving an intent.\n\n```javascript\n//resolve a \"Chain\" type intent\nlet resolution = await agent.raiseIntent(\"intentName\", context);\n\n//resolve a \"Client-Service\" type intent with a data response or a Channel\nlet resolution = await agent.raiseIntent(\"intentName\", context);\ntry {\n\t const result = await resolution.getResult();\n if (result && result.broadcast) {\n console.log(`${resolution.source} returned a channel with id ${result.id}`);\n } else if (result){\n console.log(`${resolution.source} returned data: ${JSON.stringify(result)}`);\n } else {\n console.error(`${resolution.source} didn't return data`\n }\n} catch(error) {\n console.error(`${resolution.source} returned an error: ${error}`);\n}\n\n// Use metadata about the resolving app instance to target a further intent\nawait agent.raiseIntent(\"intentName\", context, resolution.source);\n```", - "title": "IntentResolution", - "type": "object", - "properties": { - "source": { - "$ref": "#/definitions/AppIdentifier", - "description": "Identifier for the app instance that was selected (or started) to resolve the intent.\n`source.instanceId` MUST be set, indicating the specific app instance that\nreceived the intent.", - "title": "source" - }, - "intent": { - "description": "The intent that was raised. May be used to determine which intent the user\nchose in response to `fdc3.raiseIntentForContext()`.", - "type": "string", - "title": "intent" - } - }, - "additionalProperties": false, - "required": [ - "intent", - "source" - ] - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/appd.schema.json b/website/static/schemas/next/appd.schema.json index cd8987624..b4348c4be 100644 --- a/website/static/schemas/next/appd.schema.json +++ b/website/static/schemas/next/appd.schema.json @@ -656,7 +656,7 @@ }, "LaunchDetails": { "description": "The type specific launch details of the application. These details are intended to be vendor-agnostic and MAY be duplicated or overridden by details provided in the hostManifests object for a specific host.", - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/WebAppDetails" }, @@ -675,6 +675,7 @@ ] }, "WebAppDetails": { + "type": "object", "description": "Properties used to launch apps with `type: web`.", "required": [ "url" @@ -689,6 +690,7 @@ "additionalProperties": false }, "NativeAppDetails": { + "type": "object", "description": "Properties used to launch apps with `type: native` that are already installed on the device.", "required": [ "path" @@ -706,6 +708,7 @@ "additionalProperties": false }, "CitrixAppDetails": { + "type": "object", "description": "Properties used to launch apps virtualized apps with `type: citrix`.", "required": [ "alias" @@ -723,6 +726,7 @@ "additionalProperties": false }, "OnlineNativeAppDetails": { + "type": "object", "description": "Properties used to launch a native apps with `type: onlineNative` that have an online launcher, e.g. online ClickOnce app deployments.", "required": [ "url" @@ -737,7 +741,9 @@ "additionalProperties": false }, "OtherAppDetails": { + "type": "object", "description": "Apps with `type: other` are defined by a hostManifest and do not require other details.", + "properties": {}, "additionalProperties": false }, "HostManifests": { diff --git a/website/static/schemas/next/bridging/agentErrorResponse.schema.json b/website/static/schemas/next/bridging/agentErrorResponse.schema.json deleted file mode 100644 index 75a0051c8..000000000 --- a/website/static/schemas/next/bridging/agentErrorResponse.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/agentErrorResponse.schema.json", - "title": "Agent Error Response Message", - "type": "object", - "description": "A response message from a Desktop Agent to the Bridge containing an error, to be used in preference to the standard response when an error needs to be returned.", - "properties": { - "type": { - "title": "Response Message Type", - "type": "string", - "enum": [ - "findInstancesResponse", - "findIntentResponse", - "findIntentsByContextResponse", - "getAppMetadataResponse", - "openResponse", - "raiseIntentResponse", - "raiseIntentResultResponse" - ], - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." - }, - "payload": { - "title": "Error Response Message Payload", - "type": "object", - "description": "Error message payload containing an standardized error string.", - "properties": { - "error": { - "$ref": "common.schema.json#/$defs/ErrorMessages" - } - }, - "unevaluatedProperties": false, - "required": ["error"] - }, - "meta": { - "$ref": "agentResponse.schema.json#/$defs/AgentResponseMeta" - } - }, - "additionalProperties": false, - "required": ["type", "payload", "meta"] -} diff --git a/website/static/schemas/next/bridging/agentRequest.schema.json b/website/static/schemas/next/bridging/agentRequest.schema.json deleted file mode 100644 index f9f3ad553..000000000 --- a/website/static/schemas/next/bridging/agentRequest.schema.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/agentRequest.schema.json", - "title": "Agent Request Message", - "type": "object", - "description": "A request message from a Desktop Agent to the Bridge.", - "properties": { - "type": { - "title": "Request Message type", - "type": "string", - "enum": [ - "broadcastRequest", - "findInstancesRequest", - "findIntentRequest", - "findIntentsByContextRequest", - "getAppMetadataRequest", - "openRequest", - "PrivateChannel.broadcast", - "PrivateChannel.eventListenerAdded", - "PrivateChannel.eventListenerRemoved", - "PrivateChannel.onAddContextListener", - "PrivateChannel.onDisconnect", - "PrivateChannel.onUnsubscribe", - "raiseIntentRequest" - ], - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." - }, - "payload": { - "title": "Message payload", - "type": "object", - "description": "The message payload typically contains the arguments to FDC3 API functions." - }, - "meta": { - "$ref": "#/$defs/AgentRequestMeta" - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false, - "$defs": { - "AgentRequestMeta": { - "title": "Agent Request Metadata", - "description": "Metadata for a request message sent by Desktop Agents to the Bridge.", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - }, - "source": { - "title": "Source identifier", - "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself.", - "$ref": "common.schema.json#/$defs/RequestSource" - }, - "destination": { - "title": "Destination identifier", - "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" - } - }, - "required": ["requestUuid", "timestamp"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/agentResponse.schema.json b/website/static/schemas/next/bridging/agentResponse.schema.json deleted file mode 100644 index 8c795b59e..000000000 --- a/website/static/schemas/next/bridging/agentResponse.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/agentResponse.schema.json", - "title": "Agent Response Message", - "type": "object", - "description": "A response message from a Desktop Agent to the Bridge.", - "properties": { - "type": { - "title": "Response Message Type", - "type": "string", - "enum": [ - "findInstancesResponse", - "findIntentResponse", - "findIntentsByContextResponse", - "getAppMetadataResponse", - "openResponse", - "raiseIntentResponse", - "raiseIntentResultResponse" - ], - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." - }, - "payload": { - "title": "Response Message Payload", - "type": "object", - "description": "The message payload typically contains return values for FDC3 API functions." - }, - "meta": { - "$ref": "#/$defs/AgentResponseMeta" - } - }, - "additionalProperties": false, - "required": ["type", "payload", "meta"], - "$defs": { - "AgentResponseMeta": { - "title": "Agent Response Metadata", - "description": "Metadata for a response messages sent by a Desktop Agent to the Bridge", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - } - }, - "required": ["requestUuid", "responseUuid", "timestamp"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json deleted file mode 100644 index bd6fd15c0..000000000 --- a/website/static/schemas/next/bridging/bridgeErrorResponse.schema.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeErrorResponse.schema.json", - "title": "Bridge Error Response Message", - "type": "object", - "description": "A response message from the Bridge back to the original Desktop Agent that raised the request, used where all connected agents returned errors.", - "properties": { - "type": { - "title": "Response Message Type", - "type": "string", - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." - }, - "payload": { - "title": "Response Error Message Payload", - "type": "object", - "description": "The error message payload contains details of an error return to the app or agent that raised the original request.", - "properties": { - "error": { - "$ref": "common.schema.json#/$defs/ErrorMessages" - } - } - }, - "meta": { - "$ref": "#/$defs/BridgeErrorResponseMeta" - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false, - "$defs": { - "BridgeErrorResponseMeta": { - "title": "Bridge Response Metadata", - "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - }, - "errorSources": { - "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" - }, - "errorDetails": { - "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" - } - }, - "required": ["requestUuid", "responseUuid", "timestamp", "errorSources", "errorDetails"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/bridgeRequest.schema.json b/website/static/schemas/next/bridging/bridgeRequest.schema.json deleted file mode 100644 index 27d50f8d8..000000000 --- a/website/static/schemas/next/bridging/bridgeRequest.schema.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeRequest.schema.json", - "title": "Bridge Request Message", - "type": "object", - "description": "A request message forwarded from the Bridge onto a Desktop Agent connected to it.", - "properties": { - "type": { - "title": "Message type", - "type": "string", - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Request' appended." - }, - "payload": { - "title": "Message payload", - "type": "object", - "description": "The message payload typically contains the arguments to FDC3 API functions." - }, - "meta": { - "$ref": "#/$defs/BridgeRequestMeta" - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false, - "$defs": { - "BridgeRequestMeta": { - "title": "Bridge Request Metadata", - "description": "Metadata required in a request message forwarded on by the Bridge", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - }, - "source": { - "title": "Bridge Source identifier", - "description": "Field that represents the source application that the request was received from, or the source Desktop Agent if it issued the request itself. The Desktop Agent identifier MUST be set by the bridge.", - "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" - }, - "destination": { - "title": "Destination identifier", - "description": "Optional field that represents the destination that the request should be routed to. Must be set by the Desktop Agent for API calls that include a target app parameter and must include the name of the Desktop Agent hosting the target application.", - "$ref": "common.schema.json#/$defs/BridgeParticipantIdentifier" - } - }, - "required": ["requestUuid", "timestamp", "source"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/bridgeResponse.schema.json b/website/static/schemas/next/bridging/bridgeResponse.schema.json deleted file mode 100644 index 0e3a23bdf..000000000 --- a/website/static/schemas/next/bridging/bridgeResponse.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/bridgeResponse.schema.json", - "title": "Bridge Response Message", - "type": "object", - "description": "A response message from the Bridge back to the original Desktop Agent that raised the request.", - "properties": { - "type": { - "title": "Response Message Type", - "type": "string", - "description": "Identifies the type of the message and it is typically set to the FDC3 function name that the message relates to, e.g. 'findIntent', with 'Response' appended." - }, - "payload": { - "title": "Response Message Payload", - "type": "object", - "description": "The message payload typically contains return values for FDC3 API functions." - }, - "meta": { - "$ref": "#/$defs/BridgeResponseMeta" - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false, - "$defs": { - "BridgeResponseMeta": { - "title": "Bridge Response Metadata", - "description": "Metadata required in a response message collated and/or forwarded on by the Bridge", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - }, - "sources": { - "$ref": "common.schema.json#/$defs/BridgeResponseSources" - }, - "errorSources": { - "$ref": "common.schema.json#/$defs/BridgeResponseErrorSources" - }, - "errorDetails": { - "$ref": "common.schema.json#/$defs/BridgeResponseErrorDetails" - } - }, - "required": ["requestUuid", "responseUuid", "timestamp"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json deleted file mode 100644 index fb95b4fea..000000000 --- a/website/static/schemas/next/bridging/broadcastAgentRequest.schema.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastAgentRequest.schema.json", - "title": "Broadcast Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/BroadcastRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "BroadcastRequestBase": { - "title": "Broadcast Request", - "type":"object", - "description": "A request to broadcast context on a channel.", - "properties": { - "type": { - "title": "Broadcast Request Message Type", - "const": "broadcastRequest" - }, - "payload": { - "title": "broadcast Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The Id of the Channel that the broadcast was sent on" - }, - "context": { - "$ref": "../context/context.schema.json", - "title": "Context", - "description": "The context object that was the payload of a broadcast message." - } - }, - "additionalProperties": false, - "required": ["channelId", "context"] - }, - "meta": { - "type": "object", - "title": "broadcast request metadata", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - } - }, - "required": ["source"], - "additionalProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json deleted file mode 100644 index 0ef5401aa..000000000 --- a/website/static/schemas/next/bridging/broadcastBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/broadcastBridgeRequest.schema.json", - "title": "Broadcast Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "broadcastAgentRequest.schema.json#/$defs/BroadcastRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/common.schema.json b/website/static/schemas/next/bridging/common.schema.json deleted file mode 100644 index edbcd2858..000000000 --- a/website/static/schemas/next/bridging/common.schema.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/common.schema.json", - "title": "Bridging Commons", - "type": "object", - "description": "Common elements referenced by other schemas", - "$defs": { - "RequestUuid": { - "title": "Request UUID", - "type": "string", - "description": "UUID for the request" - }, - "ResponseUuid": { - "title": "Response UUID", - "type": "string", - "description": "UUID for this specific response message." - }, - "Timestamp": { - "title": "Timestamp", - "type": "string", - "format": "date-time", - "description": "Timestamp at which request was generated" - }, - "RequestSource": { - "title": "Source identifier", - "description": "Field that represents the source application that a request or response was received from, or the source Desktop Agent if it issued the request or response itself.", - "oneOf": [ - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - } - ] - }, - "AppRequestSource": { - "title": "App Source identifier", - "description": "Field that represents the source application that a request or response was received from.", - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - }, - "AgentDestination": { - "title": "Agent Destination identifier", - "description": "Field that represents a destination Desktop Agent that a request is to be sent to.", - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - "AppDestination": { - "title": "App Destination identifier", - "description": "Field that represents a destination App on a remote Desktop Agent that a request is to be sent to.", - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] - }, - "BridgeParticipantIdentifier": { - "title": "Bridge Participant Identifier", - "description": "Represents identifiers that MUST include the Desktop Agent name and MAY identify a specific app or instance.", - "oneOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] - } - ] - }, - "BridgeResponseSources": { - "title": "Desktop Agents that responded", - "type": "array", - "items": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - } - ], - "description": "Array of DesktopAgentIdentifiers for the sources that generated responses to the request. Will contain a single value for individual responses and multiple values for responses that were collated by the bridge. May be omitted if all sources errored. MUST include the `desktopAgent` field when returned by the bridge." - }, - "BridgeResponseErrorSources": { - "title": "Desktop Agents that errored", - "type": "array", - "items": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - } - ], - "description": "Array of DesktopAgentIdentifiers for responses that were not returned to the bridge before the timeout or because an error occurred. May be omitted if all sources responded without errors. MUST include the `desktopAgent` field when returned by the bridge." - }, - "ErrorMessages": { - "oneOf": [ - { - "$ref": "../api/api.schema.json#/definitions/ChannelError" - }, - { - "$ref": "../api/api.schema.json#/definitions/OpenError" - }, - { - "$ref": "../api/api.schema.json#/definitions/ResolveError" - }, - { - "$ref": "../api/api.schema.json#/definitions/ResultError" - }, - { - "$ref": "../api/api.schema.json#/definitions/BridgingError" - } - ] - }, - "BridgeResponseErrorDetails": { - "title": "Response Error Details", - "type": "array", - "items": { - "$ref": "#/$defs/ErrorMessages" - }, - "description": "Array of error message strings for responses that were not returned to the bridge before the timeout or because an error occurred. Should be the same length as the `errorSources` array and ordered the same. May be omitted if all sources responded without errors." - }, - "PrivateChannelEventListenerTypes": { - "title": "Private Channel Event Listener Types", - "description": "Event listener type names for Private Channel events", - "type": "string", - "enum": [ - "onAddContextListener", - "onUnsubscribe", - "onDisconnect" - ] - }, - "DesktopAgentImplementationMetadata": { - "description": "Includes the name assigned to the Desktop Agent by the Bridge.", - "title": "DesktopAgentImplementationMetadata", - "type": "object", - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/BaseImplementationMetadata" - }, - { - "type": "object", - "properties": { - "desktopAgent": { - "description": "Used in Desktop Agent Bridging to attribute or target a message to a particular Desktop Agent.", - "type": "string", - "title": "desktopAgent" - } - } - } - ], - "properties": { - "fdc3Version": true, - "provider": true, - "providerVersion": true, - "optionalFeatures": true, - "desktopAgent": true - }, - "required": [ - "fdc3Version", - "optionalFeatures", - "provider", - "desktopAgent" - ], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep.schema.json b/website/static/schemas/next/bridging/connectionStep.schema.json deleted file mode 100644 index 3c3a377b0..000000000 --- a/website/static/schemas/next/bridging/connectionStep.schema.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep.schema.json", - "title": "Connection Step Message", - "type": "object", - "description": "A message used during the connection flow for a Desktop Agent to the Bridge. Used for messages sent in either direction.", - "properties": { - "type": { - "title": "Connection Step Message type", - "type": "string", - "enum": [ - "hello", - "handshake", - "authenticationFailed", - "connectedAgentsUpdate" - ], - "description": "Identifies the type of the connection step message." - }, - "payload": { - "title": "Message payload", - "type": "object", - "description": "The message payload, containing data pertaining to this connection step.", - "unevaluatedProperties": false - }, - "meta": { - "$ref": "#/$defs/ConnectionStepMeta" - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false, - "$defs": { - "ConnectionStepMeta": { - "title": "Connection Step Metadata", - "description": "Metadata for this connection step message.", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - } - }, - "required": ["timestamp"], - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json b/website/static/schemas/next/bridging/connectionStep2Hello.schema.json deleted file mode 100644 index 0ac240f6c..000000000 --- a/website/static/schemas/next/bridging/connectionStep2Hello.schema.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep2Hello.schema.json", - "title": "ConnectionStep2Hello", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/ConnectionStep2HelloBase" - }, - { - "$ref": "connectionStep.schema.json" - } - ], - "$defs": { - "ConnectionStep2HelloBase": { - "type":"object", - "title": "ConnectionStep2Hello", - "description": "Hello message sent by the Bridge to anyone connecting to the Bridge (enables identification as a bridge and confirmation of whether authentication is required)", - "properties": { - "type": { - "title": "Connection Step 2 Message Type", - "const": "hello" - }, - "payload": { - "title": "Connection Step 2 Payload", - "type": "object", - "properties": { - "desktopAgentBridgeVersion": { - "title": "Desktop Agent Bridge Version Number", - "description": "The version of the Bridge", - "type": "string" - }, - "supportedFDC3Versions": { - "title": "Supported FDC3 Versions", - "type": "array", - "description": "The FDC3 versions supported by the Bridge", - "items": { - "type": "string" - } - }, - "authRequired": { - "title": "Authentication Required", - "type": "boolean", - "description": "A flag indicating whether the Desktop Agent Bridge requires authentication or not." - }, - "authToken": { - "title": "Authentication Token", - "type": "string", - "description": "An optional Desktop Agent Bridge JWT authentication token if the Desktop Agent want to authenticate a bridge." - } - }, - "additionalProperties": false, - "required": ["desktopAgentBridgeVersion", "supportedFDC3Versions", "authRequired"] - }, - "meta": { - "title": "Connection Step 2 Metadata", - "type": "object", - "properties": { - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - } - }, - "additionalProperties": false, - "required": ["timestamp"] - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json b/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json deleted file mode 100644 index 11c683d12..000000000 --- a/website/static/schemas/next/bridging/connectionStep3Handshake.schema.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep3Handshake.schema.json", - "title": "ConnectionStep3Handshake", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/ConnectionStep3HandshakeBase" - }, - { - "$ref": "connectionStep.schema.json" - } - ], - "$defs": { - "ConnectionStep3HandshakeBase": { - "type": "object", - "title": "ConnectionStep3Handshake", - "description": "Handshake message sent by the Desktop Agent to the Bridge (including requested name, channel state and authentication data)", - "properties": { - "type": { - "title": "Connection Step 3 Message Type", - "const": "handshake" - }, - "payload": { - "title": "Connection Step 3 Payload", - "type": "object", - "properties": { - "implementationMetadata": { - "title": "Connecting Agent ImplementationMetadata", - "description": "Desktop Agent ImplementationMetadata trying to connect to the bridge.", - "type": "object", - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/BaseImplementationMetadata" - } - ], - "properties": { - "fdc3Version": true, - "provider": true, - "providerVersion": true, - "optionalFeatures": true - }, - "required": [ - "fdc3Version", - "optionalFeatures", - "provider" - ], - "additionalProperties": false - }, - "requestedName": { - "title": "Requested name", - "description": "The requested Desktop Agent name", - "type": "string" - }, - "channelsState": { - "title": "Channel State", - "type": "object", - "description": "The current state of the Desktop Agent's App and User channels (exclude any Private channels), as a mapping of channel id to an array of Context objects, one per type found in the channel, most recent first.", - "additionalProperties": { - "title": "Channel ", - "type": "array", - "items": { - "$ref": "../context/context.schema.json" - } - } - }, - "authToken": { - "title": "Authentication Token", - "type": "string" - } - }, - "additionalProperties": false, - "required": [ - "implementationMetadata", - "requestedName", - "channelsState" - ] - }, - "meta": { - "title": "Connection Step 3 Metadata", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - } - }, - "additionalProperties": false, - "required": [ - "requestUuid", - "timestamp" - ] - } - }, - "required": [ - "type", - "payload", - "meta" - ], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json b/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json deleted file mode 100644 index 6cae52eca..000000000 --- a/website/static/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep4AuthenticationFailed.schema.json", - "title": "ConnectionStep4AuthenticationFailed", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/ConnectionStep4AuthenticationFailedBase" - }, - { - "$ref": "connectionStep.schema.json" - } - ], - "$defs": { - "ConnectionStep4AuthenticationFailedBase": { - "type":"object", - "title": "ConnectionStep4AuthenticationFailed", - "description": "Message sent by Bridge to Desktop Agent if their authentication fails.", - "properties": { - "type": { - "title": "Connection Step 4 Message Type", - "const": "authenticationFailed" - }, - "payload": { - "title": "Connection Step 4 Payload", - "type": "object", - "properties": { - "message": { - "title": "Authentication failed message", - "type": "string" - } - }, - "additionalProperties": false - }, - "meta": { - "title": "Connection Step 4 Metadata", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - } - }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] - } - }, - "required": ["type", "meta"], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json b/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json deleted file mode 100644 index df8782dd0..000000000 --- a/website/static/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/connectionStep6ConnectedAgentsUpdate.schema.json", - "title": "ConnectionStep6ConnectedAgentsUpdate", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/ConnectionStep6ConnectedAgentsUpdateBase" - }, - { - "$ref": "connectionStep.schema.json" - } - ], - "$defs": { - "ConnectionStep6ConnectedAgentsUpdateBase": { - "type":"object", - "title": "ConnectionStep6ConnectedAgentsUpdateBase", - "description": "Message sent by Bridge to all Desktop Agent when an agent joins or leaves the bridge, includes the details of all agents, the change made and the expected channel state for all agents.", - "properties": { - "type": { - "title": "Connection Step 6 Message Type", - "const": "connectedAgentsUpdate" - }, - "payload": { - "title": "Connection Step 6 Payload", - "type": "object", - "properties": { - "addAgent": { - "title": "Agents To Add", - "type": "string", - "description": "Should be set when an agent first connects to the bridge and provide its assigned name." - }, - "removeAgent": { - "title": "Agents To Remove", - "type": "string", - "description": "Should be set when an agent disconnects from the bridge and provide the name that no longer is assigned." - }, - "allAgents": { - "title": "All Connected Agents", - "type": "array", - "description": "Desktop Agent Bridge implementation metadata of all connected agents.", - "items": { - "$ref": "common.schema.json#/$defs/DesktopAgentImplementationMetadata" - } - }, - "channelsState": { - "title": "Channel State", - "type": "object", - "description": "The updated state of channels that should be adopted by the agents. Should only be set when an agent is connecting to the bridge.", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "../context/context.schema.json" - } - } - } - }, - "additionalProperties": false, - "required": ["allAgents"] - }, - "meta": { - "title": "Connection Step 6 Metadata", - "type": "object", - "properties": { - "requestUuid": { - "$ref": "common.schema.json#/$defs/RequestUuid" - }, - "responseUuid": { - "$ref": "common.schema.json#/$defs/ResponseUuid" - }, - "timestamp": { - "$ref": "common.schema.json#/$defs/Timestamp" - } - }, - "additionalProperties": false, - "required": ["requestUuid", "responseUuid", "timestamp"] - } - }, - "required": ["type", "payload", "meta"], - "additionalProperties": false - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json deleted file mode 100644 index 798840f59..000000000 --- a/website/static/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentErrorResponse.schema.json", - "title": "FindInstances Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindInstancesErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "FindInstancesErrorResponseBase": { - "title": "FindInstances Error Response", - "type": "object", - "description": "A response to a findInstances request that contains an error.", - "properties": { - "type": { - "title": "FindInstances Response Message Type", - "const": "findInstancesResponse" - }, - "payload": { - "title": "FindInstances Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "FindInstances Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "FindInstances Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json b/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json deleted file mode 100644 index 3ea08288f..000000000 --- a/website/static/schemas/next/bridging/findInstancesAgentRequest.schema.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentRequest.schema.json", - "title": "FindInstances Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindInstancesRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "FindInstancesRequestBase": { - "title": "FindInstances Request", - "type": "object", - "description": "A request for details of instances of a particular app", - "properties":{ - "type": { - "title": "FindInstances Request Message Type", - "const": "findInstancesRequest" - }, - "payload": { - "type": "object", - "title": "FindInstances Request Payload", - "properties": { - "app": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - }, - "required": ["app"], - "additionalProperties": false - }, - "meta": { - "title": "FindInstances request metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "destination": { - "$ref": "common.schema.json#/$defs/AgentDestination" - }, - "source": { - "oneOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json b/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json deleted file mode 100644 index 67f3937c6..000000000 --- a/website/static/schemas/next/bridging/findInstancesAgentResponse.schema.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesAgentResponse.schema.json", - "title": "FindInstances Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindInstancesResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "FindInstancesResponseBase": { - "title": "FindInstances Response", - "type": "object", - "description": "A response to a findInstances request.", - "properties": { - "type": { - "title": "FindInstances Response Message Type", - "const": "findInstancesResponse" - }, - "payload": { - "title": "FindInstances Response Payload", - "type": "object", - "properties": { - "appIdentifiers": { - "type": "array", - "items": { - "$ref": "../api/api.schema.json#/definitions/AppMetadata" - } - } - }, - "required": ["appIdentifiers"], - "additionalProperties": false - }, - "meta": { - "title": "FindInstances Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json deleted file mode 100644 index 705c9f62e..000000000 --- a/website/static/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeErrorResponse.schema.json", - "title": "FindInstances Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "findInstancesAgentErrorResponse.schema.json#/$defs/FindInstancesErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json deleted file mode 100644 index 9b27a2e19..000000000 --- a/website/static/schemas/next/bridging/findInstancesBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeRequest.schema.json", - "title": "FindInstances Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "findInstancesAgentRequest.schema.json#/$defs/FindInstancesRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json b/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json deleted file mode 100644 index 17d398845..000000000 --- a/website/static/schemas/next/bridging/findInstancesBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findInstancesBridgeResponse.schema.json", - "title": "FindInstances Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "findInstancesAgentResponse.schema.json#/$defs/FindInstancesResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json deleted file mode 100644 index b8d89cd9b..000000000 --- a/website/static/schemas/next/bridging/findIntentAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentErrorResponse.schema.json", - "title": "FindIntent Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "FindIntentErrorResponseBase": { - "title": "FindIntent Error Response", - "type": "object", - "description": "A response to a findIntent request that contains an error.", - "properties": { - "type": { - "title": "FindIntent Response Message Type", - "const": "findIntentResponse" - }, - "payload": { - "title": "FindIntent Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "FindIntent Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "FindIntent Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json deleted file mode 100644 index 59c3dd70e..000000000 --- a/website/static/schemas/next/bridging/findIntentAgentRequest.schema.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentRequest.schema.json", - "title": "FindIntent Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "FindIntentRequestBase": { - "title": "FindIntent Request", - "type": "object", - "description": "A request for details of apps available to resolve a particular intent and context pair.", - "properties": { - "type": { - "title": "FindIntent Request Message Type", - "const": "findIntentRequest" - }, - "payload": { - "title": "FindIntent Request Payload", - "type": "object", - "properties": { - "intent": { - "title": "Intent name", - "type": "string" - }, - "context": { - "title": "Context argument", - "$ref": "../context/context.schema.json" - }, - "resultType": { - "title": "Result type argument", - "type": "string" - } - }, - "required": ["intent"], - "additionalProperties": false - }, - "meta": { - "title" : "FindIntent Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": true - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json deleted file mode 100644 index 8969469bf..000000000 --- a/website/static/schemas/next/bridging/findIntentAgentResponse.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentAgentResponse.schema.json", - "title": "FindIntent Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "FindIntentResponseBase": { - "title": "FindIntent Response", - "type": "object", - "description": "A response to a findIntent request.", - "properties": { - "type": { - "title": "FindIntent Response Message Type", - "const": "findIntentResponse" - }, - "payload": { - "title": "FindIntent Response Payload", - "type": "object", - "properties": { - "appIntent": { - "$ref": "../api/api.schema.json#/definitions/AppIntent" - } - }, - "required": ["appIntent"], - "additionalProperties": false - }, - "meta": { - "title": "FindIntent Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json deleted file mode 100644 index 76efa5430..000000000 --- a/website/static/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeErrorResponse.schema.json", - "title": "FindIntent Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "findIntentAgentErrorResponse.schema.json#/$defs/FindIntentErrorResponseBase" - }, - - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json deleted file mode 100644 index 8903f567f..000000000 --- a/website/static/schemas/next/bridging/findIntentBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeRequest.schema.json", - "title": "FindIntent Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "findIntentAgentRequest.schema.json#/$defs/FindIntentRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json b/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json deleted file mode 100644 index 43655a400..000000000 --- a/website/static/schemas/next/bridging/findIntentBridgeResponse.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentBridgeResponse.schema.json", - "title": "FindIntent Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "findIntentAgentResponse.schema.json#/$defs/FindIntentResponseBase" - }, - - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json deleted file mode 100644 index 0bd1646c5..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentErrorResponse.schema.json", - "title": "FindIntentsByContext Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentsByContextErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "FindIntentsByContextErrorResponseBase": { - "title": "FindIntentsByContext Error Response", - "type": "object", - "description": "A response to a findIntentsByContext request that contains an error.", - "properties": { - "type": { - "title": "FindIntentsByContext Response Message Type", - "const": "findIntentsByContextResponse" - }, - "payload": { - "title": "FindIntentsByContext Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "FindIntentsByContext Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "additionalProperties": false, - "required": ["error"] - }, - "meta": { - "title": "FindIntentsByContext Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json deleted file mode 100644 index b88bc215c..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentRequest.schema.json", - "title": "FindIntentsByContext Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentsByContextRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "FindIntentsByContextRequestBase": { - "title": "FindIntentsByContext Request", - "type": "object", - "description": "A request for details of intents and apps available to resolve them for a particular context.", - "properties": { - "type": { - "title": "FindIntentsByContext Request Message Type", - "const": "findIntentsByContextRequest" - }, - "payload": { - "title": "FindIntentsByContext Request Payload", - "type": "object", - "properties": { - "context": { - "$ref": "../context/context.schema.json" - }, - "resultType": { - "title": "Result type argument", - "type": "string" - } - }, - "required": ["context"], - "additionalProperties": false - }, - "meta": { - "title": "FindIntentsByContext Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json deleted file mode 100644 index 7f909d419..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextAgentResponse.schema.json", - "title": "FindIntentsByContext Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/FindIntentsByContextResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "FindIntentsByContextResponseBase": { - "title": "FindIntentsByContext Response", - "type": "object", - "description": "A response to a findIntentsByContext request.", - "properties": { - "type": { - "title": "FindIntentsByContext Response Message Type", - "const": "findIntentsByContextResponse" - }, - "payload": { - "title": "FindIntentsByContext Response Payload", - "type": "object", - "properties": { - "appIntents": { - "type": "array", - "items": { - "$ref": "../api/api.schema.json#/definitions/AppIntent" - }, - "additionalProperties": false - } - }, - "additionalProperties": false, - "required": ["appIntents"] - }, - "meta": { - "title": "FindIntentsByContext Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json deleted file mode 100644 index 045d2c6cc..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeErrorResponse.schema.json", - "title": "FindIntentsByContext Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "findIntentsByContextAgentErrorResponse.schema.json#/$defs/FindIntentsByContextErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json deleted file mode 100644 index 61ad738d7..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeRequest.schema.json", - "title": "FindIntentsByContext Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "findIntentsByContextAgentRequest.schema.json#/$defs/FindIntentsByContextRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json b/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json deleted file mode 100644 index edb5c0683..000000000 --- a/website/static/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/findIntentsByContextBridgeResponse.schema.json", - "title": "FindIntentsByContext Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "findIntentsByContextAgentResponse.schema.json#/$defs/FindIntentsByContextResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json deleted file mode 100644 index 57cad8b2c..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentErrorResponse.schema.json", - "title": "GetAppMetadata Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/GetAppMetadataErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "GetAppMetadataErrorResponseBase": { - "title": "GetAppMetadata Error Response", - "type": "object", - "description": "A response to a getAppMetadata request that contains an error.", - "properties": { - "type": { - "title": "GetAppMetadata Response Message Type", - "const": "getAppMetadataResponse" - }, - "payload": { - "title": "GetAppMetadata Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "GetAppMetadata Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "GetAppMetadata Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json deleted file mode 100644 index 6a6fd59ec..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataAgentRequest.schema.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentRequest.schema.json", - "title": "GetAppMetadata Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/GetAppMetadataRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "GetAppMetadataRequestBase": { - "title": "GetAppMetadata Request", - "type": "object", - "description": "A request for metadata about an app", - "properties": { - "type": { - "title": "GetAppMetadata Request Message Type", - "const": "getAppMetadataRequest" - }, - "payload": { - "title": "GetAppMetadata Request Payload", - "type": "object", - "properties": { - "app": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "required": ["app"], - "additionalProperties": false - }, - "meta": { - "title" : "GetAppMetadata Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "destination": { - "$ref": "common.schema.json#/$defs/AgentDestination" - }, - "source": { - "$ref": "common.schema.json#/$defs/RequestSource" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json deleted file mode 100644 index 65aad070c..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataAgentResponse.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataAgentResponse.schema.json", - "title": "GetAppMetadata Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/GetAppMetadataResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "GetAppMetadataResponseBase": { - "title": "GetAppMetadata Response", - "type": "object", - "description": "A response to a getAppMetadata request.", - "properties": { - "type": { - "title": "GetAppMetadata Response Message Type", - "const": "getAppMetadataResponse" - }, - "payload": { - "title": "GetAppMetadata Response Payload", - "type": "object", - "properties": { - "appMetadata": { - "$ref": "../api/api.schema.json#/definitions/AppMetadata" - } - }, - "required": ["appMetadata"], - "additionalProperties": false - }, - "meta": { - "title": "GetAppMetadata Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json deleted file mode 100644 index 14c3b1e77..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeErrorResponse.schema.json", - "title": "GetAppMetadata Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "getAppMetadataAgentErrorResponse.schema.json#/$defs/GetAppMetadataErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json deleted file mode 100644 index a5bccc3d8..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeRequest.schema.json", - "title": "GetAppMetadata Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "getAppMetadataAgentRequest.schema.json#/$defs/GetAppMetadataRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json b/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json deleted file mode 100644 index 2b883d7c5..000000000 --- a/website/static/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/getAppMetadataBridgeResponse.schema.json", - "title": "GetAppMetadata Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "getAppMetadataAgentResponse.schema.json#/$defs/GetAppMetadataResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json deleted file mode 100644 index 6041edcb5..000000000 --- a/website/static/schemas/next/bridging/openAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentErrorResponse.schema.json", - "title": "Open Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/OpenErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "OpenErrorResponseBase": { - "title": "Open Error Response", - "type": "object", - "description": "A response to an open request that contains an error", - "properties": { - "type": { - "title": "Open Response Message Type", - "const": "openResponse" - }, - "payload": { - "title": "Open Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "Open Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/OpenError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "Open Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/openAgentRequest.schema.json b/website/static/schemas/next/bridging/openAgentRequest.schema.json deleted file mode 100644 index 3b20d30e6..000000000 --- a/website/static/schemas/next/bridging/openAgentRequest.schema.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentRequest.schema.json", - "title": "Open Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/OpenRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "OpenRequestBase": { - "title": "Open Request", - "type": "object", - "description": "A request to open an application", - "properties": { - "type": { - "title": "Open Request Message Type", - "const": "openRequest" - }, - "payload": { - "title": "Open Request Payload", - "type": "object", - "properties": { - "app": { - "type": "object", - "title": "App to open", - "description": "The application to open on the specified Desktop Agent", - "allOf": [ - { - "$ref": "../api/api.schema.json#/definitions/DesktopAgentIdentifier" - }, - { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - ] - }, - "context": { - "$ref": "../context/context.schema.json" - } - }, - "required": ["app"], - "additionalProperties": false - }, - "meta": { - "title": "Open Request Metadata", - "properties": { - "requestUuid": true, - "timestamp": true, - "destination": { - "$ref": "common.schema.json#/$defs/AgentDestination" - }, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - } - }, - "required": ["source"], - "additionalProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/openAgentResponse.schema.json b/website/static/schemas/next/bridging/openAgentResponse.schema.json deleted file mode 100644 index 5c714f260..000000000 --- a/website/static/schemas/next/bridging/openAgentResponse.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openAgentResponse.schema.json", - "title": "Open Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/OpenResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "OpenResponseBase": { - "title": "Open Response", - "type": "object", - "description": "A response to an open request", - "properties": { - "type": { - "title": "Open Response Message Type", - "const": "openResponse" - }, - "payload": { - "title": "Open Response Payload", - "type": "object", - "properties": { - "appIdentifier": { - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - }, - "required": ["appIdentifier"], - "additionalProperties": false - }, - "meta": { - "title": "Open Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json deleted file mode 100644 index 7668e8cea..000000000 --- a/website/static/schemas/next/bridging/openBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeErrorResponse.schema.json", - "title": "Open Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "openAgentErrorResponse.schema.json#/$defs/OpenErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/openBridgeRequest.schema.json b/website/static/schemas/next/bridging/openBridgeRequest.schema.json deleted file mode 100644 index 55ec1515a..000000000 --- a/website/static/schemas/next/bridging/openBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeRequest.schema.json", - "title": "Open Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "openAgentRequest.schema.json#/$defs/OpenRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/openBridgeResponse.schema.json b/website/static/schemas/next/bridging/openBridgeResponse.schema.json deleted file mode 100644 index 8d69b1d50..000000000 --- a/website/static/schemas/next/bridging/openBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/openBridgeResponse.schema.json", - "title": "Open Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "openAgentResponse.schema.json#/$defs/OpenResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json deleted file mode 100644 index 16c4ca25e..000000000 --- a/website/static/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastAgentRequest.schema.json", - "title": "PrivateChannelBroadcast Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelBroadcastRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelBroadcastRequestBase": { - "title": "PrivateChannelBroadcast Request", - "type": "object", - "description": "A request to broadcast on a PrivateChannel.", - "properties": { - "type": { - "title": "Private Channel Broadcast Message type", - "const": "PrivateChannel.broadcast" - }, - "payload": { - "title": "PrivateChannelBroadcast Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The Id of the PrivateChannel that the broadcast was sent on" - }, - "context": { - "$ref": "../context/context.schema.json", - "title": "Context", - "description": "The context object that was the payload of a broadcast message." - } - }, - "additionalProperties": false, - "required": ["channelId", "context"] - }, - "meta": { - "title": "PrivateChannelBroadcast Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json deleted file mode 100644 index 38bbd4f45..000000000 --- a/website/static/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelBroadcastBridgeRequest.schema.json", - "title": "PrivateChannelBroadcast Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelBroadcastAgentRequest.schema.json#/$defs/PrivateChannelBroadcastRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json deleted file mode 100644 index b7fa3a7e8..000000000 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedAgentRequest.schema.json", - "title": "PrivateChannelEventListenerAdded Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelEventListenerAddedRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelEventListenerAddedRequestBase": { - "title": "PrivateChannelEventListenerAdded Request", - "type": "object", - "description": "A request to forward on an EventListenerAdded event, relating to a PrivateChannel", - "properties": { - "type": { - "title": "Private Channel EventListenerAdded Message type", - "const": "PrivateChannel.eventListenerAdded" - }, - "payload": { - "title": "PrivateChannelEventListenerAdded Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The id of the PrivateChannel that the event listener was added to." - }, - "listenerType": { - "$ref": "common.schema.json#/$defs/PrivateChannelEventListenerTypes" - } - }, - "additionalProperties": false, - "required": ["channelId", "listenerType"] - }, - "meta": { - "title": "PrivateChannelEventListenerAdded Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json deleted file mode 100644 index 31993207b..000000000 --- a/website/static/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerAddedBridgeRequest.schema.json", - "title": "PrivateChannelEventListenerAdded Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelEventListenerAddedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerAddedRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json deleted file mode 100644 index 1f0394a25..000000000 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedAgentRequest.schema.json", - "title": "PrivateChannelEventListenerRemoved Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelEventListenerRemovedRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelEventListenerRemovedRequestBase": { - "title": "PrivateChannelEventListenerRemoved Request", - "type": "object", - "description": "A request to forward on an EventListenerRemoved event, relating to a PrivateChannel", - "properties": { - "type": { - "title": "Private Channel EventListenerRemoved Message type", - "const": "PrivateChannel.eventListenerRemoved" - }, - "payload": { - "title": "PrivateChannelEventListenerRemoved Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The id of the PrivateChannel that the event listener was removed from." - }, - "listenerType": { - "$ref": "common.schema.json#/$defs/PrivateChannelEventListenerTypes" - } - }, - "additionalProperties": false, - "required": ["channelId", "listenerType"] - }, - "meta": { - "title": "PrivateChannelEventListenerRemoved Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json deleted file mode 100644 index e41b1e1b5..000000000 --- a/website/static/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelEventListenerRemovedBridgeRequest.schema.json", - "title": "PrivateChannelEventListenerRemoved Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelEventListenerRemovedAgentRequest.schema.json#/$defs/PrivateChannelEventListenerRemovedRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json deleted file mode 100644 index 2fe47c66e..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerAgentRequest.schema.json", - "title": "PrivateChannelOnAddContextListener Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelOnAddContextListenerRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelOnAddContextListenerRequestBase": { - "title": "PrivateChannelOnAddContextListener Request", - "type": "object", - "description": "A request to forward on an AddContextListener event, relating to a PrivateChannel", - "properties": { - "type": { - "title": "Private Channel OnAddContextListener Message type", - "const": "PrivateChannel.onAddContextListener" - }, - "payload": { - "title": "PrivateChannelOnAddContextListener Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The id of the PrivateChannel that the context listener was added to." - }, - "contextType": { - "oneOf": [ - { "type": "string" }, - { "type": "null" } - ], - "title": "Context Type", - "description": "The type of the context listener added. Should be null for an untyped listener." - } - }, - "additionalProperties": false, - "required": ["channelId", "contextType"] - }, - "meta": { - "title": "PrivateChannelOnAddContextListener Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json deleted file mode 100644 index c8f093481..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnAddContextListenerBridgeRequest.schema.json", - "title": "PrivateChannelOnAddContextListener Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelOnAddContextListenerAgentRequest.schema.json#/$defs/PrivateChannelOnAddContextListenerRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json deleted file mode 100644 index 540f6ddf5..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectAgentRequest.schema.json", - "title": "PrivateChannelOnDisconnect Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelOnDisconnectRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelOnDisconnectRequestBase": { - "title": "PrivateChannelOnDisconnect Request", - "type": "object", - "description": "A request to forward on a Disconnect event, relating to a PrivateChannel", - "properties": { - "type": { - "title": "Private Channel OnDisconnect Message type", - "const": "PrivateChannel.onDisconnect" - }, - "payload": { - "title": "PrivateChannelOnDisconnect Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The id of the PrivateChannel that the agent discconnected from." - } - }, - "additionalProperties": false, - "required": ["channelId"] - }, - "meta": { - "title": "PrivateChannelOnDisconnect Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json deleted file mode 100644 index 73742515f..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnDisconnectBridgeRequest.schema.json", - "title": "PrivateChannelOnDisconnect Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelOnDisconnectAgentRequest.schema.json#/$defs/PrivateChannelOnDisconnectRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json deleted file mode 100644 index 115c9f904..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeAgentRequest.schema.json", - "title": "PrivateChannelOnUnsubscribe Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/PrivateChannelOnUnsubscribeRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "PrivateChannelOnUnsubscribeRequestBase": { - "title": "PrivateChannelOnUnsubscribe Request", - "type": "object", - "description": "A request to forward on an Unsubscribe event, relating to a PrivateChannel", - "properties": { - "type": { - "title": "Private Channel OnUnsubscribe Message type", - "const": "PrivateChannel.onUnsubscribe" - }, - "payload": { - "title": "PrivateChannelOnUnsubscribe Request Payload", - "type": "object", - "properties": { - "channelId": { - "type": "string", - "title": "Channel Id", - "description": "The id of the PrivateChannel that the context listener was unsubscribed from." - }, - "contextType": { - "oneOf": [ - { "type": "string" }, - { "type": "null" } - ], - "title": "Context Type", - "description": "The type of the context listener that was unsubscribed. Should be null for an untyped listener." - } - }, - "additionalProperties": false, - "required": ["channelId", "contextType"] - }, - "meta": { - "title": "PrivateChannelOnUnsubscribe Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - }, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "unevaluatedProperties": false - } - } - } - } -} diff --git a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json b/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json deleted file mode 100644 index 5e364e3db..000000000 --- a/website/static/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/privateChannelOnUnsubscribeBridgeRequest.schema.json", - "title": "PrivateChannelOnUnsubscribe Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "privateChannelOnUnsubscribeAgentRequest.schema.json#/$defs/PrivateChannelOnUnsubscribeRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json deleted file mode 100644 index c7dd9dcfb..000000000 --- a/website/static/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentErrorResponse.schema.json", - "title": "RaiseIntent Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/RaiseIntentErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "RaiseIntentErrorResponseBase": { - "title": "RaiseIntent Error Response", - "type": "object", - "description": "A response to a request to raise an intent that contains an error.", - "properties": { - "type": { - "title": "RaiseIntent Response Message type", - "const": "raiseIntentResponse" - }, - "payload": { - "title": "RaiseIntent Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "RaiseIntent Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResolveError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "RaiseIntent Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json deleted file mode 100644 index 4a9921859..000000000 --- a/website/static/schemas/next/bridging/raiseIntentAgentRequest.schema.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentRequest.schema.json", - "title": "RaiseIntent Agent Request", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/RaiseIntentRequestBase" - }, - { - "$ref": "agentRequest.schema.json" - } - ], - "$defs": { - "RaiseIntentRequestBase": { - "title": "RaiseIntent Request", - "type": "object", - "description": "A request to raise an intent.", - "properties": { - "type": { - "title": "RaiseIntent Request Message type", - "const": "raiseIntentRequest" - }, - "payload": { - "title": "RaiseIntent Request Payload", - "type": "object", - "properties": { - "intent": { - "type": "string" - }, - "context": { - "$ref": "../context/context.schema.json" - }, - "app": { - "$ref": "common.schema.json#/$defs/AppDestination" - } - }, - "required": ["intent", "context", "app"], - "additionalProperties": false - }, - "meta": { - "title": "RaiseIntent Request Metadata", - "type": "object", - "properties": { - "requestUuid": true, - "timestamp": true, - "destination": { - "$ref": "common.schema.json#/$defs/AppDestination" - }, - "source": { - "$ref": "common.schema.json#/$defs/AppRequestSource" - } - }, - "unevaluatedProperties": false, - "required": ["requestUuid","timestamp","destination","source"] - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json deleted file mode 100644 index 30c0ec397..000000000 --- a/website/static/schemas/next/bridging/raiseIntentAgentResponse.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentAgentResponse.schema.json", - "title": "RaiseIntent Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/RaiseIntentResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "RaiseIntentResponseBase": { - "title": "RaiseIntent Response", - "type": "object", - "description": "A response to a request to raise an intent.", - "properties": { - "type": { - "title": "RaiseIntent Response Message type", - "const": "raiseIntentResponse" - }, - "payload": { - "title": "RaiseIntent Response Payload", - "type": "object", - "properties": { - "intentResolution": { - "$ref": "../api/api.schema.json#/definitions/IntentResolution" - } - }, - "required": ["intentResolution"], - "additionalProperties": false - }, - "meta": { - "title": "RaiseIntent Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json deleted file mode 100644 index e01cd3510..000000000 --- a/website/static/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeErrorResponse.schema.json", - "title": "RaiseIntent Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "raiseIntentAgentErrorResponse.schema.json#/$defs/RaiseIntentErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json deleted file mode 100644 index 6922eae4a..000000000 --- a/website/static/schemas/next/bridging/raiseIntentBridgeRequest.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeRequest.schema.json", - "title": "RaiseIntent Bridge Request", - "type": "object", - "allOf": [ - { - "$ref": "raiseIntentAgentRequest.schema.json#/$defs/RaiseIntentRequestBase" - }, - { - "$ref": "bridgeRequest.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json deleted file mode 100644 index 4f2116658..000000000 --- a/website/static/schemas/next/bridging/raiseIntentBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentBridgeResponse.schema.json", - "title": "RaiseIntent Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "raiseIntentAgentResponse.schema.json#/$defs/RaiseIntentResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json deleted file mode 100644 index d2ec66e4f..000000000 --- a/website/static/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentErrorResponse.schema.json", - "title": "RaiseIntent Result Agent Error Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/RaiseIntentResultErrorResponseBase" - }, - { - "$ref": "agentErrorResponse.schema.json" - } - ], - "$defs": { - "RaiseIntentResultErrorResponseBase": { - "title": "RaiseIntent Result Error Response", - "type": "object", - "description": "A secondary response to a request to raise an intent used to deliver the intent result, which contains an error", - "properties": { - "type": { - "title": "RaiseIntent Result Response Message type", - "const": "raiseIntentResultResponse" - }, - "payload": { - "title": "RaiseIntent Result Error Response Payload", - "type": "object", - "properties": { - "error": { - "title": "RaiseIntent Result Error Message", - "oneOf": [ - { "$ref": "../api/api.schema.json#/definitions/ResultError" }, - { "$ref": "../api/api.schema.json#/definitions/BridgingError" } - ] - } - }, - "required": ["error"], - "additionalProperties": false - }, - "meta": { - "title": "RaiseIntent Result Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json deleted file mode 100644 index e5b8b36c7..000000000 --- a/website/static/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultAgentResponse.schema.json", - "title": "RaiseIntent Result Agent Response", - "type": "object", - "allOf": [ - { - "$ref": "#/$defs/RaiseIntentResultResponseBase" - }, - { - "$ref": "agentResponse.schema.json" - } - ], - "$defs": { - "RaiseIntentResultResponseBase": { - "title": "RaiseIntent Result Response", - "type": "object", - "description": "A secondary response to a request to raise an intent used to deliver the intent result", - "properties": { - "type": { - "title": "RaiseIntent Result Response Message type", - "const": "raiseIntentResultResponse" - }, - "payload": { - "title": "RaiseIntent Result Response Payload", - "type": "object", - "properties": { - "intentResult": { - "title": "IntentResult", - "anyOf": [ - { - "type": "object", - "title": "IntentResult Context", - "properties": { - "context": { - "$ref": "../context/context.schema.json" - } - }, - "required": ["context"], - "additionalProperties": false - }, - { - "type": "object", - "title": "IntentResult Channel", - "properties": { - "channel": { - "$ref": "../api/api.schema.json#/definitions/Channel" - } - }, - "required": ["channel"], - "additionalProperties": false - }, - { - "type": "object", - "title": "IntentResult Void", - "properties": {}, - "additionalProperties": false - } - ] - } - }, - "required": ["intentResult"], - "additionalProperties": false - }, - "meta": { - "title": "RaiseIntent Result Response Metadata", - "type": "object" - } - }, - "additionalProperties": false - } - } -} diff --git a/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json deleted file mode 100644 index 280475f34..000000000 --- a/website/static/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeErrorResponse.schema.json", - "title": "RaiseIntent Result Bridge Error Response", - "type": "object", - "allOf": [ - { - "$ref": "raiseIntentResultAgentErrorResponse.schema.json#/$defs/RaiseIntentResultErrorResponseBase" - }, - { - "$ref": "bridgeErrorResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json b/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json deleted file mode 100644 index 30c0e680f..000000000 --- a/website/static/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/bridging/raiseIntentResultBridgeResponse.schema.json", - "title": "RaiseIntent Result Bridge Response", - "type": "object", - "allOf": [ - { - "$ref": "raiseIntentResultAgentResponse.schema.json#/$defs/RaiseIntentResultResponseBase" - }, - { - "$ref": "bridgeResponse.schema.json" - } - ] -} diff --git a/website/static/schemas/next/bridgingAsyncAPI/README.md b/website/static/schemas/next/bridgingAsyncAPI/README.md deleted file mode 100644 index f097af5b5..000000000 --- a/website/static/schemas/next/bridgingAsyncAPI/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Agent Bridging AsyncAPI schema - -This folder contains an AsyncAPI schema that may be used to generate clients and server stubs for Desktop Agent Bridging. It is based on references to the JSON schema files that define the various messages in the adjacent schemas/bridging folder. - -Example commands to generate code from the AsyncAPI schema: -(run from the root of your FDC3 checkout) - -First run: - -```ps -npm install -g @asyncapi/generator -``` - -Then: - -- .NET - - ```ps - ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/dotnet-nats-template -o ../some/path/outside/FDC3/folder - ``` - -- Node.js - - ```ps - ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/nodejs-ws-template -o ../some/path/outside/FDC3/folder -p server=local - ``` - -- Markdown - - ```ps - ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/markdown-template -o ../some/path/outside/FDC3/folder - ``` - -- HTML - - ```ps - ag --install schemas/bridgingAsyncAPI/bridgingAsyncAPI.json @asyncapi/html-template -o ../some/path/outside/FDC3/folder - ``` diff --git a/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json b/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json deleted file mode 100644 index 657a4212c..000000000 --- a/website/static/schemas/next/bridgingAsyncAPI/bridgingAsyncAPI.json +++ /dev/null @@ -1,407 +0,0 @@ -{ - "asyncapi": "2.6.0", - "info": { - "title": "Desktop Agent Bridge", - "version": "1.0.0", - "description": "API for an FDC3 Desktop Agent to communicate with an FDC3 Desktop Agent Bridge and through it, other Desktop Agents.", - "license": { - "name": "Apache 2.0", - "url": "https://www.apache.org/licenses/LICENSE-2.0" - } - }, - "servers": { - "local": { - "url": "ws://localhost:4475", - "description": "Desktop agent bridge server exposing websocket connection", - "protocol": "ws" - } - }, - "defaultContentType": "application/json", - "channels": { - "/": { - "publish": { - "message": { - "oneOf": [ - { - "$ref": "#/components/messages/handshake" - }, - { - "$ref": "#/components/messages/broadcastRequest-Agent" - }, - { - "$ref": "#/components/messages/findInstancesRequest-Agent" - }, - { - "$ref": "#/components/messages/findInstancesResponse-Agent" - }, - { - "$ref": "#/components/messages/findInstancesErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/findIntentRequest-Agent" - }, - { - "$ref": "#/components/messages/findIntentResponse-Agent" - }, - { - "$ref": "#/components/messages/findIntentErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/findIntentsByContextRequest-Agent" - }, - { - "$ref": "#/components/messages/findIntentsByContextResponse-Agent" - }, - { - "$ref": "#/components/messages/findIntentsByContextErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/getAppMetadataRequest-Agent" - }, - { - "$ref": "#/components/messages/getAppMetadataResponse-Agent" - }, - { - "$ref": "#/components/messages/getAppMetadataErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/openRequest-Agent" - }, - { - "$ref": "#/components/messages/openResponse-Agent" - }, - { - "$ref": "#/components/messages/openErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/raiseIntentRequest-Agent" - }, - { - "$ref": "#/components/messages/raiseIntentResponse-Agent" - }, - { - "$ref": "#/components/messages/raiseIntentErrorResponse-Agent" - }, - { - "$ref": "#/components/messages/privateChannelBroadcast-Agent" - }, - { - "$ref": "#/components/messages/privateChannelEventListenerAdded-Agent" - }, - { - "$ref": "#/components/messages/privateChannelEventListenerRemoved-Agent" - }, - { - "$ref": "#/components/messages/privateChannelOnAddContextListener-Agent" - }, - { - "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" - }, - { - "$ref": "#/components/messages/privateChannelOnUnsubscribe-Agent" - }, - { - "$ref": "#/components/messages/privateChannelOnDisconnect-Agent" - }, - { - "$ref": "#/components/messages/raiseIntentResultResponse-Agent" - }, - { - "$ref": "#/components/messages/raiseIntentResultErrorResponse-Agent" - } - ] - }, - "description": "Messages sent by A Desktop Agent to a Bridge", - "operationId": "Send" - }, - "subscribe": { - "message": { - "oneOf": [ - { - "$ref": "#/components/messages/hello" - }, - { - "$ref": "#/components/messages/authenticationFailed" - }, - { - "$ref": "#/components/messages/connectedAgentsUpdate" - }, - { - "$ref": "#/components/messages/findInstancesResponse-Bridge" - }, - { - "$ref": "#/components/messages/findInstancesErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/findIntentResponse-Bridge" - }, - { - "$ref": "#/components/messages/findIntentErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/findIntentsByContextResponse-Bridge" - }, - { - "$ref": "#/components/messages/findIntentsByContextErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/getAppMetadataResponse-Bridge" - }, - { - "$ref": "#/components/messages/getAppMetadataErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/openResponse-Bridge" - }, - { - "$ref": "#/components/messages/openErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/raiseIntentResponse-Bridge" - }, - { - "$ref": "#/components/messages/raiseIntentErrorResponse-Bridge" - }, - { - "$ref": "#/components/messages/raiseIntentResultResponse-Bridge" - }, - { - "$ref": "#/components/messages/raiseIntentResultErrorResponse-Bridge" - } - ] - }, - "description": "Messages sent by a Bridge to a Desktop Agent", - "operationId": "Receive" - } - } - }, - "components": { - "messages": { - "broadcastRequest-Agent": { - "payload": { - "$ref": "../bridging/broadcastAgentRequest.schema.json#" - } - }, - "hello": { - "payload": { - "$ref": "../bridging/connectionStep2Hello.schema.json#" - } - }, - "handshake": { - "payload": { - "$ref": "../bridging/connectionStep3Handshake.schema.json#" - } - }, - "authenticationFailed": { - "payload": { - "$ref": "../bridging/connectionStep4AuthenticationFailed.schema.json#" - } - }, - "connectedAgentsUpdate": { - "payload": { - "$ref": "../bridging/connectionStep6ConnectedAgentsUpdate.schema.json#" - } - }, - "findInstancesRequest-Agent": { - "payload": { - "$ref": "../bridging/findInstancesAgentRequest.schema.json#" - } - }, - "findInstancesResponse-Agent": { - "payload": { - "$ref": "../bridging/findInstancesAgentResponse.schema.json#" - } - }, - "findInstancesErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/findInstancesAgentErrorResponse.schema.json#" - } - }, - "findInstancesResponse-Bridge": { - "payload": { - "$ref": "../bridging/findInstancesBridgeResponse.schema.json#" - } - }, - "findInstancesErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/findInstancesBridgeErrorResponse.schema.json#" - } - }, - "findIntentRequest-Agent": { - "payload": { - "$ref": "../bridging/findIntentAgentRequest.schema.json#" - } - }, - "findIntentResponse-Agent": { - "payload": { - "$ref": "../bridging/findIntentAgentResponse.schema.json#" - } - }, - "findIntentErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/findIntentAgentErrorResponse.schema.json#" - } - }, - "findIntentResponse-Bridge": { - "payload": { - "$ref": "../bridging/findIntentBridgeResponse.schema.json#" - } - }, - "findIntentErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/findIntentBridgeErrorResponse.schema.json#" - } - }, - "findIntentsByContextRequest-Agent": { - "payload": { - "$ref": "../bridging/findIntentsByContextAgentRequest.schema.json#" - } - }, - "findIntentsByContextResponse-Agent": { - "payload": { - "$ref": "../bridging/findIntentsByContextAgentResponse.schema.json#" - } - }, - "findIntentsByContextErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/findIntentsByContextAgentErrorResponse.schema.json#" - } - }, - "findIntentsByContextResponse-Bridge": { - "payload": { - "$ref": "../bridging/findIntentsByContextBridgeResponse.schema.json#" - } - }, - "findIntentsByContextErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/findIntentsByContextBridgeErrorResponse.schema.json#" - } - }, - "getAppMetadataRequest-Agent": { - "payload": { - "$ref": "../bridging/getAppMetadataAgentRequest.schema.json#" - } - }, - "getAppMetadataResponse-Agent": { - "payload": { - "$ref": "../bridging/getAppMetadataAgentResponse.schema.json#" - } - }, - "getAppMetadataErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/getAppMetadataAgentErrorResponse.schema.json#" - } - }, - "getAppMetadataResponse-Bridge": { - "payload": { - "$ref": "../bridging/getAppMetadataBridgeResponse.schema.json#" - } - }, - "getAppMetadataErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/getAppMetadataBridgeErrorResponse.schema.json#" - } - }, - "openRequest-Agent": { - "payload": { - "$ref": "../bridging/openAgentRequest.schema.json#" - } - }, - "openResponse-Agent": { - "payload": { - "$ref": "../bridging/openAgentResponse.schema.json#" - } - }, - "openErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/openAgentErrorResponse.schema.json#" - } - }, - "openResponse-Bridge": { - "payload": { - "$ref": "../bridging/openBridgeResponse.schema.json#" - } - }, - "openErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/openBridgeErrorResponse.schema.json#" - } - }, - "privateChannelBroadcast-Agent": { - "payload": { - "$ref": "../bridging/privateChannelBroadcastAgentRequest.schema.json#" - } - }, - "privateChannelEventListenerAdded-Agent": { - "payload": { - "$ref": "../bridging/privateChannelEventListenerAddedAgentRequest.schema.json#" - } - }, - "privateChannelEventListenerRemoved-Agent": { - "payload": { - "$ref": "../bridging/privateChannelEventListenerRemovedAgentRequest.schema.json#" - } - }, - "privateChannelOnAddContextListener-Agent": { - "payload": { - "$ref": "../bridging/privateChannelOnAddContextListenerAgentRequest.schema.json#" - } - }, - "privateChannelOnDisconnect-Agent": { - "payload": { - "$ref": "../bridging/privateChannelOnDisconnectAgentRequest.schema.json#" - } - }, - "privateChannelOnUnsubscribe-Agent": { - "payload": { - "$ref": "../bridging/privateChannelOnUnsubscribeAgentRequest.schema.json#" - } - }, - "raiseIntentRequest-Agent": { - "payload": { - "$ref": "../bridging/raiseIntentAgentRequest.schema.json#" - } - }, - "raiseIntentResponse-Agent": { - "payload": { - "$ref": "../bridging/raiseIntentAgentResponse.schema.json#" - } - }, - "raiseIntentErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/raiseIntentAgentErrorResponse.schema.json#" - } - }, - "raiseIntentResponse-Bridge": { - "payload": { - "$ref": "../bridging/raiseIntentBridgeResponse.schema.json#" - } - }, - "raiseIntentErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/raiseIntentBridgeErrorResponse.schema.json#" - } - }, - "raiseIntentResultResponse-Agent": { - "payload": { - "$ref": "../bridging/raiseIntentResultAgentResponse.schema.json#" - } - }, - "raiseIntentResultErrorResponse-Agent": { - "payload": { - "$ref": "../bridging/raiseIntentResultAgentErrorResponse.schema.json#" - } - }, - "raiseIntentResultResponse-Bridge": { - "payload": { - "$ref": "../bridging/raiseIntentResultBridgeResponse.schema.json#" - } - }, - "raiseIntentResultErrorResponse-Bridge": { - "payload": { - "$ref": "../bridging/raiseIntentResultBridgeErrorResponse.schema.json#" - } - } - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/context/action.schema.json b/website/static/schemas/next/context/action.schema.json deleted file mode 100644 index 842e7e293..000000000 --- a/website/static/schemas/next/context/action.schema.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/action.schema.json", - "title": "Action", - "description": "A representation of an FDC3 Action (specified via a Context or Context & Intent) that can be inserted inside another object, for example a chat message.\n\nThe action may be completed by calling `fdc3.raiseIntent()` with the specified Intent and Context, or, if only a context is specified, by calling `fdc3.raiseIntentForContext()` (which the Desktop Agent will resolve by presenting the user with a list of available Intents for the Context).\n\nAccepts an optional `app` parameter in order to specify a specific app.", - "allOf": [{ - "type": "object", - "properties": { - "type": { "const": "fdc3.action" }, - "title": { - "title": "Action Title", - "description": "A human readable display name for the action", - "type": "string" - }, - "intent": { - "title": "Action Intent", - "description": "Optional Intent to raise to perform the actions. Should reference an intent type name, such as those defined in the FDC3 Standard. If intent is not set then `fdc3.raiseIntentForContext` should be used to perform the action as this will usually allow the user to choose the intent to raise.", - "type": "string" - }, - "context": { - "title": "Action Context", - "description": "A context object with which the action will be performed", - "$ref": "context.schema.json#" - }, - "app": { - "title": "Action Target App", - "description": "An optional target application identifier that should perform the action", - "$ref": "../api/api.schema.json#/definitions/AppIdentifier" - } - }, - "required": [ - "title", "context" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.action", - "title": "Click to view Chart", - "intent": "ViewChart", - "context": { - "type": "fdc3.chart", - "instruments": [ - { - "type": "fdc3.instrument", - "id": { - "ticker": "EURUSD" - } - } - ], - "range": { - "type": "fdc3.dateRange", - "starttime": "2020-09-01T08:00:00.000Z", - "endtime": "2020-10-31T08:00:00.000Z" - }, - "style": "candle" - }, - "app" :{ - "appId": "MyChartViewingApp", - "instanceId": "instance1" - } - } - ] -} diff --git a/website/static/schemas/next/context/chart.schema.json b/website/static/schemas/next/context/chart.schema.json deleted file mode 100644 index af37550cc..000000000 --- a/website/static/schemas/next/context/chart.schema.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/chart.schema.json", - "type": "object", - "title": "Chart", - "description": "A context type representing details of a Chart, which may be used to request plotting of a particular chart or to otherwise share details of its composition, such as:\n\n- A list of instruments for comparison\n- The time period to plot the chart over\n- The style of chart (line, bar, mountain, candle etc.)\n- Other settings such as indicators to calculate, or data representing drawings and annotations.\n\nIn addition to handling requests to plot charts, a charting application may use this type to output a representation of what it is currently displaying so that it can be recorded by another application.", - "allOf": [{ - "type": "object", - "properties": { - "type": { "const": "fdc3.chart" }, - "instruments": { - "title": "Instruments to plot", - "description": "An array of instrument contexts whose data should be plotted.", - "type": "array", - "items": { - "$ref": "instrument.schema.json#" - } - }, - "range": { - "title": "Time Range", - "description": "The time range that should be plotted", - "$ref": "timeRange.schema.json#" - }, - "style": { - "title": "Chart style", - "description": "The type of chart that should be plotted", - "type": "string", - "enum": [ "line", "bar", "stacked-bar", "mountain", "candle", "pie", "scatter", "histogram", "heatmap", "custom"] - }, - "otherConfig": { - "title": "Other configuration", - "description": "It is common for charts to support other configuration, such as indicators, annotations etc., which do not have standardized formats, but may be included in the `otherConfig` array as context objects.", - "type": "array", - "items": { - "$ref": "context.schema.json#" - } - } - }, - "required": ["instruments"] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.chart", - "instruments": [ - { - "type": "fdc3.instrument", - "id": { - "ticker": "AAPL" - } - }, - { - "type": "fdc3.instrument", - "id": { - "ticker": "GOOG" - } - } - ], - "range": { - "type": "fdc3.timeRange", - "startTime": "2020-09-01T08:00:00.000Z", - "endTime": "2020-10-31T08:00:00.000Z" - }, - "style": "line", - "otherConfig": [ - { - "type": "somevendor.someproduct.indicator", - "name": "stddev", - "parameters": { - "period": 10, - "matype": "exponential" - } - }, - { - "type": "someothervendor.someotherproduct.formula", - "formula": "standard-deviation", - "fields": { - "lookback": 10, - "type": "ema" - } - } - ] - } - ] -} diff --git a/website/static/schemas/next/context/chatInitSettings.schema.json b/website/static/schemas/next/context/chatInitSettings.schema.json deleted file mode 100644 index 90220988a..000000000 --- a/website/static/schemas/next/context/chatInitSettings.schema.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/chatInitSettings.schema.json", - "type": "object", - "title": "ChatInitSettings", - "description": "A collection of settings to start a new chat conversation", - "allOf": [{ - "type": "object", - "properties": { - "type": { "const": "fdc3.chat.initSettings" }, - "chatName": { - "title": "Chat name", - "description": "Name to apply to the chat created", - "type": "string" - }, - "members": { - "title": "Chat members", - "description": "Contacts to add to the chat", - "$ref": "contactList.schema.json#" - }, - "message": { - "title": "Initial chat message", - "description": "An initial message to post in the chat when created.", - "oneOf": [ - { - "type": "string" - }, - { - "$ref": "message.schema.json#" - } - ] - }, - "options": { - "title": "Chat options", - "description": "Option settings that affect the creation of the chat", - "type": "object", - "properties": { - "groupRecipients": { - "title": "Group recipients option", - "description": "if false a separate chat will be created for each member", - "type": "boolean" - }, - "isPublic": { - "title": "Public chat option", - "description": "if true the room will be visible to everyone in the chat application", - "type": "boolean" - }, - "allowHistoryBrowsing": { - "title": "Allow history browsing option", - "description": "if true members will be allowed to browse past messages", - "type": "boolean" - }, - "allowMessageCopy": { - "title": "Allow message copy option", - "description": "if true members will be allowed to copy/paste messages", - "type": "boolean" - }, - "allowAddUser": { - "title": "All adding users option", - "description": "if true members will be allowed to add other members to the chat", - "type": "boolean" - } - } - } - } - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.chat.initSettings", - "chatName": "Chat ABCD", - "members": { - "type": "fdc3.contactList", - "contacts": [ - { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane@mail.com" - } - }, - { - "type": "fdc3.contact", - "name": "John Doe", - "id": { - "email": "john@mail.com" - } - } - ] - }, - "options": { - "groupRecipients": true, - "isPublic": false, - "allowHistoryBrowsing": true, - "allowMessageCopy": true - }, - "message": { - "type": "fdc3.message", - "text": { - "text/plain": "Hey all, can we discuss the issue together? I attached a screenshot" - }, - "entities": { - "0": { - "type": "fdc3.fileAttachment", - "data": { - "name": "myImage.png", - "dataUri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII" - } - } - } - } - } - ] -} diff --git a/website/static/schemas/next/context/chatMessage.schema.json b/website/static/schemas/next/context/chatMessage.schema.json deleted file mode 100644 index a60e306a5..000000000 --- a/website/static/schemas/next/context/chatMessage.schema.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/chatMessage.schema.json", - "type": "object", - "title": "ChatMessage", - "description": "A context representing a chat message. Typically used to send the message or to pre-populate a message for sending.", - "allOf": [{ - "type": "object", - "properties": { - "type": { "const": "fdc3.chat.message" }, - "chatRoom": { "$ref": "chatRoom.schema.json#" }, - "message": { "$ref": "message.schema.json#" } - }, - "required": ["type", "chatRoom", "message"] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [{ - "type": "fdc3.chat.message", - "chatRoom": { - "type": "fdc3.chat.room", - "providerName": "Symphony", - "id": { - "streamId": "j75xqXy25NBOdacUI3FNBH" - } - }, - "message": { - "type": "fdc3.message", - "text": { - "text/plain": "Hey all, can we discuss the issue together? I attached a screenshot" - }, - "entities": { - "0": { - "type": "fdc3.fileAttachment", - "data": { - "name": "myImage.png", - "dataUri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII" - } - } - } - } - }] -} diff --git a/website/static/schemas/next/context/chatRoom.schema.json b/website/static/schemas/next/context/chatRoom.schema.json deleted file mode 100644 index 8033b976b..000000000 --- a/website/static/schemas/next/context/chatRoom.schema.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/chatRoom.schema.json", - "type": "object", - "title": "ChatRoom", - "description": "Reference to the chat room which could be used to send a message to the room", - "allOf": [{ - "type": "object", - "properties": { - "type": { "const": "fdc3.chat.room" }, - "providerName": { - "title": "Chat provider name", - "description": "The name of the service that hosts the chat", - "type": "string" - }, - "id": { - "title": "Chat room id", - "description": "Identifier(s) for the chat - currently unstandardized", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "url": { - "title": "Chat URL", - "description": "Universal url to access to the room. It could be opened from a browser, a mobile app, etc...", - "type": "string", - "format": "uri" - }, - "name": { - "title": "Chat name", - "description": "Display name for the chat room", - "type": "string" - } - }, - "required": ["providerName", "id"] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.chat.room", - "providerName": "Symphony", - "id": { - "streamId": "j75xqXy25NBOdacUI3FNBH" - }, - "url": "http://symphony.com/ref/room/j75xqXy25NBOdacUI3FNBH___pqSsuJRdA", - "name": "My new room" - } - ] -} diff --git a/website/static/schemas/next/context/chatSearchCriteria.schema.json b/website/static/schemas/next/context/chatSearchCriteria.schema.json deleted file mode 100644 index b301fd955..000000000 --- a/website/static/schemas/next/context/chatSearchCriteria.schema.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/chatSearchCriteria.schema.json", - "type": "object", - "title": "ChatSearchCriteria", - "description": "A context type that represents a simple search criterion, based on a list of other context objects, that can be used to search or filter messages in a chat application.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.chat.searchCriteria" - }, - "criteria": { - "title": "Search Criteria array", - "description": "An array of criteria that should match chats returned from by a search.\n\n⚠️ Operators (and/or/not) are not defined in `fdc3.chat.searchCriteria`. It is up to the application that processes the FDC3 Intent to choose and apply the operators between the criteria.\n\nEmpty search criteria can be supported to allow resetting of filters.", - "type": "array", - "items": { - "$ref": "#/$defs/SearchCriteria" - } - } - }, - "required": [ - "criteria" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "$defs": { - "SearchCriteria": { - "type": "object", - "title": "Search Criteria", - "description": "An individual criteria against which to match chat messages, based on an FDC3 context or free-text string.", - "oneOf": [ - { - "$ref": "instrument.schema.json#" - }, - { - "$ref": "organization.schema.json#" - }, - { - "$ref": "contact.schema.json#" - }, - { - "type": "string", - "title": "Free text", - "description": "Free text to be used for a keyword search" - } - ] - } - }, - "examples": [ - { - "type": "fdc3.chat.searchCriteria", - "criteria": [ - { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - }, - { - "type": "fdc3.instrument", - "id": { - "ticker": "TSLA" - }, - "name": "Tesla, inc." - }, - "annual return" - ] - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/contact.schema.json b/website/static/schemas/next/context/contact.schema.json deleted file mode 100644 index 41b007e0e..000000000 --- a/website/static/schemas/next/context/contact.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/contact.schema.json", - "type": "object", - "title": "Contact", - "description": "A person contact that can be engaged with through email, calling, messaging, CMS, etc.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.contact" - }, - "id": { - "type": "object", - "title": "Contact Identifiers", - "description": "Identifiers that relate to the Contact represented by this context", - "properties": { - "email": { - "type": "string", - "format": "email", - "title": "Email address", - "description": "The email address for the contact" - }, - "FDS_ID": { - "type": "string", - "title": "FDS ID", - "description": "FactSet Permanent Identifier representing the contact" - } - } - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the contact" - } - }, - "required": [ - "id" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - } - ] -} diff --git a/website/static/schemas/next/context/contactList.schema.json b/website/static/schemas/next/context/contactList.schema.json deleted file mode 100644 index 3c5017353..000000000 --- a/website/static/schemas/next/context/contactList.schema.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/contactList.schema.json", - "type": "object", - "title": "ContactList", - "description": "A collection of contacts, e.g. for chatting to or calling multiple contacts.\n\nThe contact list schema does not explicitly include identifiers in the `id` section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.contactList" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Contact List Identifiers", - "description": "One or more identifiers that refer to the contact list in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable summary of the contact list" - }, - "contacts": { - "type": "array", - "title": "List of Contacts", - "description": "An array of contact contexts that forms the list.", - "items": { - "$ref": "contact.schema.json#" - } - } - }, - "required": [ - "contacts" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.contactList", - "contacts": [ - { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - }, - { - "type": "fdc3.contact", - "name": "John Doe", - "id": { - "email": "john.doe@mail.com" - } - } - ] - } - ] -} diff --git a/website/static/schemas/next/context/context.schema.json b/website/static/schemas/next/context/context.schema.json deleted file mode 100644 index 6ded6f73e..000000000 --- a/website/static/schemas/next/context/context.schema.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/context.schema.json", - "type": "object", - "title": "Context", - "description": "The `fdc3.context` type defines the basic contract or \"shape\" for all data exchanged by FDC3 operations. As such, it is not really meant to be used on its own, but is imported by more specific type definitions (standardized or custom) to provide the structure and properties shared by all FDC3 context data types.\n\nThe key element of FDC3 context types is their mandatory `type` property, which is used to identify what type of data the object represents, and what shape it has.\n\nThe FDC3 context type, and all derived types, define the minimum set of fields a context data object of a particular type can be expected to have, but this can always be extended with custom fields as appropriate.", - "allOf": [ - { - "$ref": "#/definitions/DocumentedContext" - }, - { - "$ref": "#/definitions/BaseContext" - } - ], - "definitions": { - "BaseContext": { - "$comment": "Base definition for the Context object WITHOUT documentation (which will be imported into all derived types unless separated).", - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "name": { - "type": "string" - }, - "id": { - "type": "object", - "unevaluatedProperties": {"type": "string" } - } - }, - "additionalProperties": true, - "required": [ - "type" - ] - }, - "DocumentedContext": { - "$comment": "Base definition for the Context object WITH documentation (which will be imported into all derived types unless separated).", - "type": "object", - "properties": { - "type": { - "type": "string", - "title": "Type", - "description": "The type property is the only _required_ part of the FDC3 context data schema. The FDC3 [API](https://fdc3.finos.org/docs/api/spec) relies on the `type` property being present to route shared context data appropriately.\n\nFDC3 [Intents](https://fdc3.finos.org/docs/intents/spec) also register the context data types they support in an FDC3 [App Directory](https://fdc3.finos.org/docs/app-directory/overview), used for intent discovery and routing.\n\nStandardized FDC3 context types have well-known `type` properties prefixed with the `fdc3` namespace, e.g. `fdc3.instrument`. For non-standard types, e.g. those defined and used by a particular organization, the convention is to prefix them with an organization-specific namespace, e.g. `blackrock.fund`.\n\nSee the [Context Data Specification](https://fdc3.finos.org/docs/context/spec) for more information about context data types." - }, - "name": { - "type": "string", - "title": "Name", - "description": "Context data objects may include a name property that can be used for more information, or display purposes. Some derived types may require the name object as mandatory, depending on use case." - }, - "id": { - "type": "object", - "title": "Id", - "description": "Context data objects may include a set of equivalent key-value pairs that can be used to help applications identify and look up the context type they receive in their own domain. The idea behind this design is that applications can provide as many equivalent identifiers to a target application as possible, e.g. an instrument may be represented by an ISIN, CUSIP or Bloomberg identifier.\n\nIdentifiers do not make sense for all types of data, so the `id` property is therefore optional, but some derived types may choose to require at least one identifier. Identifier values SHOULD always be of type string.", - "unevaluatedProperties": {"type": "string" } - } - }, - "additionalProperties": true, - "required": [ - "type" - ] - } - } -} \ No newline at end of file diff --git a/website/static/schemas/next/context/country.schema.json b/website/static/schemas/next/context/country.schema.json deleted file mode 100644 index 8aaf6f240..000000000 --- a/website/static/schemas/next/context/country.schema.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/country.schema.json", - "type": "object", - "title": "Country", - "description": "A country entity.\n\nNotes:\n\n- It is valid to include extra properties and metadata as part of the country payload, but the minimum requirement is for at least one standardized identifier to be provided\n\n - `COUNTRY_ISOALPHA2` SHOULD be preferred.\n\n- Try to only use country identifiers as intended and specified in the [ISO standard](https://en.wikipedia.org/wiki/ISO_3166-1). E.g. the `COUNTRY_ISOALPHA2` property must be a recognized value and not a proprietary two-letter code. If the identifier you want to share is not a standardized and recognized one, rather define a property that makes it clear what value it is. This makes it easier for target applications.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.country" - }, - "id": { - "type": "object", - "properties": { - "COUNTRY_ISOALPHA2": { - "type": "string", - "title": "COUNTRY_ISOALPHA2", - "description": "Two-letter ISO country code" - }, - "COUNTRY_ISOALPHA3": { - "type": "string", - "title": "COUNTRY_ISOALPHA3", - "description": "Three-letter ISO country code" - }, - "ISOALPHA2": { - "type": "string", - "title": "ISOALPHA2", - "description": "Two-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed with `COUNTRY_`.", - "deprecated": true - }, - "ISOALPHA3": { - "type": "string", - "title": "ISOALPHA3", - "description": "Three-letter ISO country code. Deprecated in FDC3 2.0 in favour of the version prefixed with `COUNTRY_`.", - "deprecated": true - } - } - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the country" - } - }, - "required": [ - "id" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.country", - "name": "Sweden", - "id": { - "COUNTRY_ISOALPHA2": "SE" - } - } - ] -} diff --git a/website/static/schemas/next/context/currency.schema.json b/website/static/schemas/next/context/currency.schema.json deleted file mode 100644 index a58b5b75c..000000000 --- a/website/static/schemas/next/context/currency.schema.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/currency.schema.json", - "type": "object", - "title": "Currency", - "description": "A context representing an individual Currency.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.currency" - }, - "name": { - "type": "string", - "title": "Currency name", - "description": "The name of the currency for display purposes" - }, - "id": { - "type": "object", - "properties": { - "CURRENCY_ISOCODE": { - "type": "string", - "pattern": "^[A-Z]{3}$", - "title": "CURRENCY_ISOCODE", - "description": "The `CURRENCY_ISOCODE` should conform to 3 character alphabetic codes defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html)" - } - } - } - }, - "required": [ - "id" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.currency", - "name": "US Dollar", - "id": { - "CURRENCY_ISOCODE": "USD" - } - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/email.schema.json b/website/static/schemas/next/context/email.schema.json deleted file mode 100644 index a54e0b8d3..000000000 --- a/website/static/schemas/next/context/email.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/email.schema.json", - "type": "object", - "title": "Email", - "description": "A collection of information to be used to initiate an email with a Contact or ContactList.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.email" - }, - "recipients": { - "title": "Email Recipients", - "description": "One or more recipients for the email.", - "oneOf": [ - { - "$ref": "contact.schema.json#" - }, - { - "$ref": "contactList.schema.json#" - } - ] - }, - "subject": { - "title": "Email Subject", - "description": "Subject line for the email.", - "type": "string" - }, - "textBody": { - "title": "Email Body", - "description": "Body content for the email.", - "type": "string" - } - }, - "required": [ - "recipients" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.email", - "recipients": { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@example.com" - } - }, - "subject": "The information you requested", - "textBody": "Blah, blah, blah ..." - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/instrument.schema.json b/website/static/schemas/next/context/instrument.schema.json deleted file mode 100644 index cffd9c4b2..000000000 --- a/website/static/schemas/next/context/instrument.schema.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/instrument.schema.json", - "type": "object", - "title": "Instrument", - "description": "A financial instrument from any asset class.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.instrument" - }, - "id": { - "title": "Instrument identifiers", - "description": "Any combination of instrument identifiers can be used together to resolve ambiguity, or for a better match. Not all applications will use the same instrument identifiers, which is why FDC3 allows for multiple to be specified. In general, the more identifiers an application can provide, the easier it will be to achieve interoperability.\n\nIt is valid to include extra properties and metadata as part of the instrument payload, but the minimum requirement is for at least one instrument identifier to be provided.\n\nTry to only use instrument identifiers as intended. E.g. the `ticker` property is meant for tickers as used by an exchange.\nIf the identifier you want to share is not a ticker or one of the other standardized fields, define a property that makes it clear what the value represents. Doing so will make interpretation easier for the developers of target applications.", - "type": "object", - "properties": { - "BBG": { - "type": "string", - "title": "Bloomberg security", - "description": "https://www.bloomberg.com/" - }, - "CUSIP": { - "type": "string", - "title": "CUSIP", - "description": "https://www.cusip.com/" - }, - "FDS_ID": { - "type": "string", - "title": "FactSet Permanent Security Identifier", - "description": "https://www.factset.com/" - }, - "FIGI": { - "type": "string", - "title": "Open FIGI", - "description": "https://www.openfigi.com/" - }, - "ISIN": { - "type": "string", - "title": "ISIN", - "description": "https://www.isin.org/" - }, - "PERMID": { - "type": "string", - "title": "Refinitiv PERMID", - "description": "https://permid.org/" - }, - "RIC": { - "type": "string", - "title": "Refinitiv Identification Code", - "description": "https://www.refinitiv.com/" - }, - "SEDOL": { - "type": "string", - "title": "SEDOL", - "description": "https://www.lseg.com/sedol" - }, - "ticker": { - "type": "string", - "title": "Stock ticker", - "description": "Unstandardized stock tickers" - } - } - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the instrument" - }, - "market": { - "description": "The `market` map can be used to further specify the instrument and help achieve interoperability between disparate data sources. This is especially useful when using an `id` field that is not globally unique.", - "type": "object", - "properties": { - "MIC": { - "type": "string", - "title": "Market Identifier Code", - "description": "https://en.wikipedia.org/wiki/Market_Identifier_Code" - }, - "name": { - "type": "string", - "title": "Market Name", - "description": "Human readable market name" - }, - "COUNTRY_ISOALPHA2": { - "type": "string", - "title": "Country ISO Code", - "description": "https://www.iso.org/iso-3166-country-codes.html" - }, - "BBG": { - "type": "string", - "title": "Bloomberg Market Identifier", - "description": "https://www.bloomberg.com/" - } - }, - "unevaluatedProperties": { - "type": "string" - } - } - }, - "required": [ - "type","id" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.instrument", - "name": "Microsoft", - "id": { - "ticker": "MSFT", - "RIC": "MSFT.OQ", - "ISIN": "US5949181045" - }, - "market": { - "MIC": "XNAS" - } - } - ] -} diff --git a/website/static/schemas/next/context/instrumentList.schema.json b/website/static/schemas/next/context/instrumentList.schema.json deleted file mode 100644 index 6f15daa9a..000000000 --- a/website/static/schemas/next/context/instrumentList.schema.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/instrumentList.schema.json", - "type": "object", - "title": "InstrumentList", - "description": "A collection of instruments. Use this type for use cases that require not just a single instrument, but multiple (e.g. to populate a watchlist). However, when holding information for each instrument is required, it is recommended to use the [Portfolio](Portfolio) type.\n\nThe instrument list schema does not explicitly include identifiers in the `id` section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.instrumentList" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Instrument List Identifiers", - "description": "One or more identifiers that refer to the instrument list in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable summary of the instrument list" - }, - "instruments": { - "type": "array", - "title": "List of instruments", - "description": "An array of instrument contexts that forms the list.", - "items": { - "$ref": "instrument.schema.json#" - } - } - }, - "required": [ - "instruments" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.instrumentList", - "instruments": [ - { - "type": "fdc3.instrument", - "id": { - "ticker": "AAPL" - }, - "market": { - "MIC": "XNAS" - } - }, - { - "type": "fdc3.instrument", - "id": { - "ISIN": "US5949181045" - } - } - ] - } - ] -} diff --git a/website/static/schemas/next/context/interaction.schema.json b/website/static/schemas/next/context/interaction.schema.json deleted file mode 100644 index a00dd334e..000000000 --- a/website/static/schemas/next/context/interaction.schema.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/interaction.schema.json", - "type": "object", - "title": "Interaction", - "description": "An `Interaction` is a significant direct exchange of ideas or information between a number of participants, e.g. a Sell Side party and one or more Buy Side parties. An `Interaction` might be a call, a meeting (physical or virtual), an IM or the preparation of some specialist data, such as financial data for a given company or sector.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.interaction" - }, - "id": { - "type": "object", - "title": "Interaction Id", - "description": "Can be used by a target application to pass an identifier back to the originating application after an interaction record has been created, updated or deleted. An interaction ID does not need to be populated by the originating application, however the target application could store it for future reference and SHOULD return it in a `TransactionResult`.", - "properties": { - "URI": { - "type": "string", - "title": "Interaction URI", - "description": "Can be used by a target application to pass a record's link back to the originating application. This offers the originating application a way to open the record for a user to view." - }, - "SALESFORCE": { - "type": "string", - "title": "Salesforce ID", - "description": "Interactions ID in Salesforce" - }, - "SINGLETRACK": { - "type": "string", - "title": "SingleTrack ID", - "description": "Interaction ID in SingleTrack" - } - } - }, - "participants": { - "title": "Interaction Participants", - "description": "A list of contacts involved in the interaction", - "$ref": "contactList.schema.json#" - }, - "timeRange": { - "title": "Interaction Time range", - "description": "The time range over which the interaction occurred", - "$ref": "timeRange.schema.json#" - }, - "interactionType": { - "title": "Interaction Type", - "description": "`interactionType` SHOULD be one of `'Instant Message'`, `'Email'`, `'Call'`, or `'Meeting'` although other string values are permitted.", - "oneOf": [ - { - "type": "string", - "enum": [ - "Instant Message", - "Email", - "Call", - "Meeting" - ] - }, - { - "type": "string" - } - ] - }, - "description": { - "title": "Interaction Description", - "description": "A human-readable description of the interaction", - "type": "string" - }, - "initiator": { - "title": "Interaction Initiator", - "description": "The contact that initiated the interaction", - "$ref": "contact.schema.json#" - }, - "origin": { - "title": "Interaction Origin", - "description": "Used to represent the application or service that the interaction was created from to aid in tracing the source of an interaction.", - "type": "string" - } - }, - "required": [ - "participants", - "timeRange", - "interactionType", - "description" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.interaction", - "participants": { - "type": "fdc3.contactList", - "contacts": [ - { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - }, - { - "type": "fdc3.contact", - "name": "John Doe", - "id": { - "email": "john.doe@mail.com" - } - } - ] - }, - "interactionType": "Instant Message", - "timeRange": { - "type": "fdc3.timeRange", - "startTime": "2022-02-10T15:12:00Z" - }, - "description": "Laboris libero dapibus fames elit adipisicing eu, fermentum, dignissimos laboriosam, erat, risus qui deserunt. Praesentium! Reiciendis. Hic harum nostrud, harum potenti amet? Mauris. Pretium aliquid animi, eget eiusmod integer proident. Architecto ipsum blandit ducimus, possimus illum sunt illum necessitatibus ab litora sed, nonummy integer minus corrupti ducimus iste senectus accumsan, fugiat nostrud? Pede vero dictumst excepturi, iure earum consequuntur voluptatum", - "initiator": { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - }, - "origin": "Outlook" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/message.schema.json b/website/static/schemas/next/context/message.schema.json deleted file mode 100644 index b776eb11e..000000000 --- a/website/static/schemas/next/context/message.schema.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/message.schema.json", - "type": "object", - "title": "Message", - "description": "A chat message to be sent through an instant messaging application. Can contain one or several text bodies (organized by mime-type, plaintext or markdown), as well as attached entities (either arbitrary file attachments or FDC3 actions to be embedded in the message). To be put inside a ChatInitSettings object.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.message" - }, - "text": { - "type": "object", - "title": "Message text", - "description": "A map of string mime-type to string content", - "properties": { - "text/plain": { - "type": "string", - "title": "Plain text", - "description": "Plain text encoded content." - }, - "text/markdown": { - "title": "Markdown text", - "description": "Markdown encoded content", - "type": "string" - } - } - }, - "entities": { - "type": "object", - "title": "Message entities", - "description": "A map of string IDs to entities that should be attached to the message, such as an action to perform, a file attachment, or other FDC3 context object.", - "additionalProperties": { - "anyOf": [ - { - "$ref": "action.schema.json#" - }, - { - "type": "object", - "title": "File attachment", - "description": "A File attachment encoded in the form of a data URI", - "properties": { - "type": { - "const": "fdc3.entity.fileAttachment" - }, - "data": { - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "File name", - "description": "The name of the attached file" - }, - "dataUri": { - "type": "string", - "format": "uri", - "title": "", - "description": "A data URI encoding the content of the file to be attached" - } - }, - "required": [ - "name", - "dataUri" - ] - } - }, - "required": [ - "type", - "data" - ] - } - ] - } - } - } - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.message", - "text": { - "text/plain": "Hey all, can we discuss the issue together? I attached a screenshot and a link to the current exchange rate" - }, - "entities": { - "picture1": { - "type": "fdc3.fileAttachment", - "data": { - "name": "myImage.png", - "dataUri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII" - } - }, - "eurusd_action": { - "type": "fdc3.action", - "title": "Click to view Chart", - "intent": "ViewChart", - "context": { - "type": "fdc3.chart", - "instruments": [ - { - "type": "fdc3.instrument", - "id": { - "ticker": "EURUSD" - } - } - ], - "range": { - "type": "fdc3.dateRange", - "starttime": "2020-09-01T08:00:00.000Z", - "endtime": "2020-10-31T08:00:00.000Z" - }, - "style": "candle" - } - } - } - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/nothing.schema.json b/website/static/schemas/next/context/nothing.schema.json deleted file mode 100644 index 2b970c895..000000000 --- a/website/static/schemas/next/context/nothing.schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/nothing.schema.json", - "type": "object", - "title": "Nothing", - "description": "A type that explicitly represents a lack of context.\n\nNotes:\n\n- Intended to be used in situations where no context is desired.\n- For example:\n - Raising an intent without context (e.g. opening a blank order form, or chat interface without a contact selected).\n - Resetting context on a channel (e.g. when context is used to set a filter in other applications a null context might release the filter).\n- An explicit representation of a Null or empty context allows apps to declare support for a lack of context, for example in their intent metadata in an app directory.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.nothing" - } - } - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.nothing" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/order.schema.json b/website/static/schemas/next/context/order.schema.json deleted file mode 100644 index fcf975011..000000000 --- a/website/static/schemas/next/context/order.schema.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/order.schema.json", - "type": "object", - "title": "Order", - "description": "@experimental context type representing an order. To be used with OMS and EMS systems.\n\nThis type currently only defines a required `id` field, which should provide a reference to the order in one or more systems, an optional human readable `name` field to be used to summarize the order and an optional `details` field that may be used to provide additional detail about the order, including a context representing a `product`, which may be extended with arbitrary properties. The `details.product` field is currently typed as a unspecified Context type, but both `details` and `details.product` are expected to be standardized in future.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.order" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Order Identifiers", - "description": "One or more identifiers that refer to the order in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable summary of the order." - }, - "details": { - "type": "object", - "title": "Order Details", - "description": "Optional additional details about the order, which may include a product element that is an, as yet undefined but extensible, Context", - "properties": { - "product": { - "$ref": "product.schema.json" - } - }, - "additionalProperties": true - } - }, - "required": [ - "type", - "id" - ], - "additionalProperties": true - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.order", - "name": "...", - "id": { - "myOMS": "12345" - }, - "details": { - "product": { - "type": "fdc3.product", - "id": { - "productId": "ABC123" - }, - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "MSFT" - } - } - } - } - }, - { - "type": "fdc3.order", - "id": { - "myOMS": "ABC123" - } - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/orderList.schema.json b/website/static/schemas/next/context/orderList.schema.json deleted file mode 100644 index 10ee4f788..000000000 --- a/website/static/schemas/next/context/orderList.schema.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/orderList.schema.json", - "type": "object", - "title": "OrderList", - "description": "@experimental A list of orders. Use this type for use cases that require not just a single order, but multiple.\n\nThe OrderList schema does not explicitly include identifiers in the id section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.orderList" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Order List Identifiers", - "description": "One or more identifiers that refer to the order list in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable summary of the order list" - }, - "orders": { - "type": "array", - "items": { - "$ref": "order.schema.json#" - }, - "title": "List of Orders", - "description": "An array of order contexts that forms the list." - } - }, - "required": [ - "type", - "orders" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.orderList", - "orders": [ - { - "type": "fdc3.order", - "id": { - "myOMS": "ABC123" - } - }, - { - "type": "fdc3.order", - "id": { - "myOMS": "DEF456" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/organization.schema.json b/website/static/schemas/next/context/organization.schema.json deleted file mode 100644 index b3e47110c..000000000 --- a/website/static/schemas/next/context/organization.schema.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/organization.schema.json", - "type": "object", - "title": "Organization", - "description": "An entity that can be used when referencing private companies and other organizations where a specific instrument is not available or desired e.g. CRM and News workflows.\n\nIt is valid to include extra properties and metadata as part of the organization payload, but the minimum requirement is for at least one specified identifier to be provided.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.organization" - }, - "id": { - "type": "object", - "title": "Organization Identifiers", - "description": "Identifiers for the organization, at least one must be provided.", - "minProperties": 1, - "properties": { - "LEI": { - "type": "string", - "title": "Legal Entity Identifier", - "description": "The Legal Entity Identifier (LEI) is a 20-character, alpha-numeric code based on the ISO 17442 standard developed by the International Organization for Standardization (ISO). It connects to key reference information that enables clear and unique identification of legal entities participating in financial transactions." - }, - "PERMID": { - "type": "string", - "title": "Organization", - "description": "Refinitiv Permanent Identifiers, or PermID for the organization" - }, - "FDS_ID": { - "type": "string", - "title": "Organization", - "description": "FactSet Permanent Identifier representing the organization" - } - } - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name of the organization" - } - }, - "required": [ - "id" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.organization", - "name": "Cargill, Incorporated", - "id": { - "LEI": "QXZYQNMR4JZ5RIRN4T31", - "FDS_ID": "00161G-E" - } - } - ] -} diff --git a/website/static/schemas/next/context/portfolio.schema.json b/website/static/schemas/next/context/portfolio.schema.json deleted file mode 100644 index 99feec9b3..000000000 --- a/website/static/schemas/next/context/portfolio.schema.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/portfolio.schema.json", - "type": "object", - "title": "Portfolio", - "description": "A financial portfolio made up of multiple positions (holdings) in several instruments. Contrast this with e.g. the [InstrumentList](InstrumentList) type, which is just a list of instruments.\n\nThis is a good example of how types can be composed and extended with extra properties to define more complex types.\n\nThe Portfolio type consists of an array of [Position](Position) types, each of which refers to a single [Instrument](Instrument) and a holding amount for that instrument.\n\nThe portfolio schema does not explicitly include identifiers in the `id` section, as there bis not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.portfolio" - }, - "positions": { - "type": "array", - "items": { - "$ref": "position.schema.json#" - }, - "title": "Portfolio positions", - "description": "The List of Positions which make up the Portfolio" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Portfolio Identifiers", - "description": "One or more identifiers that refer to the portfolio in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the portfolio" - } - }, - "required": [ - "positions" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.portfolio", - "positions": [ - { - "type": "fdc3.position", - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "AAPL" - } - }, - "holding": 2000000 - }, - { - "type": "fdc3.position", - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "MSFT" - } - }, - "holding": 1500000 - }, - { - "type": "fdc3.position", - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "IBM" - } - }, - "holding": 3000000 - } - ] - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/position.schema.json b/website/static/schemas/next/context/position.schema.json deleted file mode 100644 index 5f2006397..000000000 --- a/website/static/schemas/next/context/position.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/position.schema.json", - "type": "object", - "title": "Position", - "description": "A financial position made up of an instrument and a holding in that instrument. This type is a good example of how new context types can be composed from existing types.\n\nIn this case, the instrument and the holding amount for that instrument are required values.\n\nThe [Position](Position) type goes hand-in-hand with the [Portfolio](Portfolio) type, which represents multiple holdings in a combination of instruments.\n\nThe position schema does not explicitly include identifiers in the `id` section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.position" - }, - "instrument": { - "$ref": "instrument.schema.json#", - "title": "The financial instrument that this position relates to", - "description": "" - }, - "holding": { - "type": "number", - "title": "The size of the holding represented by this position", - "description": "The amount of the holding, e.g. a number of shares" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Position Identifiers", - "description": "One or more identifiers that refer to the position in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the position" - } - }, - "required": [ - "instrument", - "holding" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.position", - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "AAPL" - } - }, - "holding": 2000000 - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/product.schema.json b/website/static/schemas/next/context/product.schema.json deleted file mode 100644 index df20ae614..000000000 --- a/website/static/schemas/next/context/product.schema.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/product.schema.json", - "type": "object", - "title": "Product", - "description": "@experimental context type representing a tradable product. To be used with OMS and EMS systems.\n\nThis type is currently only loosely defined as an extensible context object, with an optional instrument field.\n\nThe Product schema does not explicitly include identifiers in the id section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.product" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Product Identifiers", - "description": "One or more identifiers that refer to the product. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Product Name", - "description": "A human-readable summary of the product." - }, - "instrument": { - "$ref": "instrument.schema.json", - "title": "Product Instrument", - "description": " financial instrument that relates to the definition of this product" - } - }, - "required": [ - "type", - "id" - ], - "additionalProperties": true - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.product", - "id": { - "productId": "ABC123" - }, - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "MSFT" - } - } - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/timeRange.schema.json b/website/static/schemas/next/context/timeRange.schema.json deleted file mode 100644 index b960123e7..000000000 --- a/website/static/schemas/next/context/timeRange.schema.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/timeRange.schema.json", - "type": "object", - "title": "TimeRange", - "description": "A context representing a period of time. Any user interfaces that represent or visualize events or activity over time can be filtered or focused on a particular time period, e.g.:\n\n- A pricing chart\n- A trade blotter\n- A record of client contact/activity in a CRM\n\nExample use cases:\n\n- User may want to view pricing/trades/customer activity for a security over a particular time period, the time range might be specified as the context for the `ViewChart` intent OR it might be embedded in another context (e.g. a context representing a chart to plot).\n- User filters a visualization (e.g. a pricing chart) to show a particular period, the `TimeRange` is broadcast and other visualizations (e.g. a heatmap of activity by instrument, or industry sector etc.) receive it and filter themselves to show data over the same range.\n\nNotes:\n\n- A `TimeRange` may be closed (i.e. `startTime` and `endTime` are both known) or open (i.e. only one of `startTime` or `endTime` is known).\n- Ranges corresponding to dates (e.g. `2022-05-12` to `2022-05-19`) should be specified using times as this prevents issues with timezone conversions and inclusive/exclusive date ranges.\n- String fields representing times are encoded according to [ISO 8601-1:2019](https://www.iso.org/standard/70907.html).\n - A timezone indicator should be specified, e.g. `\"2022-05-12T15:18:03Z\"` or `\"2022-05-12T16:18:03+01:00\"`\n - Times MAY be specified with millisecond precision, e.g. `\"2022-05-12T15:18:03.349Z\"`", - "allOf": [ - { - "properties": { - "type": { - "const": "fdc3.timeRange" - }, - "startTime": { - "type": "string", - "format": "date-time", - "title": "Start Time", - "description": "The start time of the range, encoded according to [ISO 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator." - }, - "endTime": { - "type": "string", - "format": "date-time", - "title": "End Time", - "description": "The end time of the range, encoded according to [ISO 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator." - } - } - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "oneOf": [ - { - "required": [ - "startTime", - "endTime" - ] - }, - { - "required": [ - "startTime" - ] - }, - { - "required": [ - "endTime" - ] - } - ], - "examples": [ - { - "type": "fdc3.timeRange", - "startTime": "2022-03-30T15:44:44Z", - "endTime": "2022-04-30T23:59:59ZS" - }, - { - "type": "fdc3.timeRange", - "startTime": "2022-03-30T15:44:44+00:00" - }, - { - "type": "fdc3.timeRange", - "endTime": "2022-03-30T16:44:44.123Z" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/trade.schema.json b/website/static/schemas/next/context/trade.schema.json deleted file mode 100644 index 771eea9c0..000000000 --- a/website/static/schemas/next/context/trade.schema.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/trade.schema.json", - "type": "object", - "title": "Trade", - "description": "@experimental context type representing a trade. To be used with execution systems.\n\nThis type currently only defines a required `id` field, which should provide a reference to the trade in one or more systems, an optional human readable `name` field to be used to summarize the trade and a required `product` field that may be used to provide additional detail about the trade, which is currently typed as a unspecified Context type, but `product` is expected to be standardized in future.\n\n The Trade schema does not explicitly include identifiers in the id section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.trade" - }, - "id": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "Trade Identifiers", - "description": "One or more identifiers that refer to the trade in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future." - }, - "name": { - "type": "string", - "title": "Trade Name", - "description": "A human-readable summary of the trade." - }, - "product": { - "$ref": "product.schema.json", - "title": "Traded product", - "description": "A product that is the subject of the trade." - } - }, - "required": [ - "type", "id", "product" - ], - "additionalProperties": true - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.trade", - "name": "...", - "id": { - "myEMS": "12345" - }, - "product": { - "type": "fdc3.product", - "id": { - "productId": "ABC123" - }, - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "MSFT" - } - } - } - } - ] -} diff --git a/website/static/schemas/next/context/tradeList.schema.json b/website/static/schemas/next/context/tradeList.schema.json deleted file mode 100644 index 2cea41a85..000000000 --- a/website/static/schemas/next/context/tradeList.schema.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/tradeList.schema.json", - "type": "object", - "title": "TradeList", - "description": "@experimental A list of trades. Use this type for use cases that require not just a single trade, but multiple.\n\nThe TradeList schema does not explicitly include identifiers in the id section, as there is not a common standard for such identifiers. Applications can, however, populate this part of the contract with custom identifiers if so desired.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.tradeList" - }, - "trades": { - "title": "List of Trades", - "description": "An array of trade contexts that forms the list.", - "type": "array", - "items": { - "$ref": "trade.schema.json#" - } - }, - "id": { - "title": "Trade List Identifiers", - "description": "One or more identifiers that refer to the trade list in an OMS, EMS or related system. Specific key names for systems are expected to be standardized in future.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "name": { - "type": "string", - "title": "Name", - "description": "An optional human-readable name for the trade list" - } - }, - "required": [ - "type", - "trades" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.tradeList", - "trades": [ - { - "type": "fdc3.trade", - "name": "...", - "id": { - "myEMS": "12345" - }, - "product": { - "type": "fdc3.product", - "id": { - "productId": "ABC123" - }, - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "MSFT" - } - } - } - }, - { - "type": "fdc3.trade", - "id": { - "myEMS": "67890" - }, - "product": { - "type": "fdc3.product", - "id": { - "productId": "DEF456" - }, - "instrument": { - "type": "fdc3.instrument", - "id": { - "ticker": "TSLA" - } - } - } - } - ] - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/transactionresult.schema.json b/website/static/schemas/next/context/transactionresult.schema.json deleted file mode 100644 index 4bc0a6ff0..000000000 --- a/website/static/schemas/next/context/transactionresult.schema.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/transactionresult.schema.json", - "type": "object", - "title": "TransactionResult", - "description": "A context type representing the result of a transaction initiated via FDC3, which SHOULD be returned as an `IntentResult` by intents that create, retrieve, update or delete content or records in another application. Its purpose is to provide a status and message (where needed) for the transaction and MAY wrap a returned context object.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.transactionResult" - }, - "status": { - "type": "string", - "enum": [ - "Created", - "Deleted", - "Updated", - "Failed" - ], - "title": "Transaction Status", - "description": "The status of the transaction being reported." - }, - "context": { - "$ref": "context.schema.json#", - "title": "Transaction Result Context", - "description": "A context object returned by the transaction, possibly with updated data." - }, - "message": { - "type": "string", - "title": "Transaction Message", - "description": "A human readable message describing the outcome of the transaction." - } - }, - "required": [ - "type", - "status" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.transactionResult", - "status": "Updated", - "context": { - "type": "fdc3.contact", - "name": "Jane Doe", - "id": { - "email": "jane.doe@mail.com" - } - }, - "message": "record with id 'jane.doe@mail.com' was updated" - } - ] -} \ No newline at end of file diff --git a/website/static/schemas/next/context/valuation.schema.json b/website/static/schemas/next/context/valuation.schema.json deleted file mode 100644 index 712764483..000000000 --- a/website/static/schemas/next/context/valuation.schema.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://fdc3.finos.org/schemas/next/context/valuation.schema.json", - "type": "object", - "title": "Valuation", - "description": "A context type representing the price and value of a holding.", - "allOf": [ - { - "type": "object", - "properties": { - "type": { - "const": "fdc3.valuation" - }, - "value": { - "type": "number", - "title": "Value", - "description": "The value of the holding, expresses in the nominated currency." - }, - "price": { - "type": "number", - "title": "Price per unit", - "description": "The price per unit the the valuation is based on." - }, - "CURRENCY_ISOCODE": { - "type": "string", - "pattern": "^[A-Z]{3}$", - "title": "Valuation Currency", - "description": "The valuation currency, which should conform to 3 character alphabetic codes defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html)" - }, - "valuationTime": { - "type": "string", - "format": "date-time", - "title": "Valuation time", - "description": "The time at which the valuation was performed, encoded according to [ISO 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included." - }, - "expiryTime": { - "type": "string", - "format": "date-time", - "title": "Expiry Time", - "description": "The time at which this valuation expires, encoded according to [ISO 8601-1:2019](https://www.iso.org/standard/70907.html) with a timezone indicator included." - } - }, - "required": [ - "value", - "CURRENCY_ISOCODE" - ] - }, - { "$ref": "context.schema.json#/definitions/BaseContext" } - ], - "examples": [ - { - "type": "fdc3.valuation", - "value": 500.0, - "price": 5.0, - "CURRENCY_ISOCODE": "USD", - "expiryTime": "2022-05-13T16:16:24+01:00" - } - ] -} \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock deleted file mode 100644 index e59684a93..000000000 --- a/website/yarn.lock +++ /dev/null @@ -1,8740 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@algolia/autocomplete-core@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz" - integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-plugin-algolia-insights@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz" - integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-preset-algolia@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz" - integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-shared@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz" - integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== - -"@algolia/cache-browser-local-storage@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz" - integrity sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww== - dependencies: - "@algolia/cache-common" "4.24.0" - -"@algolia/cache-common@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz" - integrity sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g== - -"@algolia/cache-in-memory@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz" - integrity sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w== - dependencies: - "@algolia/cache-common" "4.24.0" - -"@algolia/client-account@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz" - integrity sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA== - dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/client-analytics@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz" - integrity sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg== - dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/client-common@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz" - integrity sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA== - dependencies: - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/client-personalization@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz" - integrity sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w== - dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/client-search@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz" - integrity sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA== - dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz" - integrity sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA== - -"@algolia/logger-console@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz" - integrity sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg== - dependencies: - "@algolia/logger-common" "4.24.0" - -"@algolia/recommend@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz" - integrity sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw== - dependencies: - "@algolia/cache-browser-local-storage" "4.24.0" - "@algolia/cache-common" "4.24.0" - "@algolia/cache-in-memory" "4.24.0" - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/logger-console" "4.24.0" - "@algolia/requester-browser-xhr" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/requester-node-http" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/requester-browser-xhr@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz" - integrity sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA== - dependencies: - "@algolia/requester-common" "4.24.0" - -"@algolia/requester-common@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz" - integrity sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA== - -"@algolia/requester-node-http@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz" - integrity sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw== - dependencies: - "@algolia/requester-common" "4.24.0" - -"@algolia/transporter@4.24.0": - version "4.24.0" - resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz" - integrity sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA== - dependencies: - "@algolia/cache-common" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/requester-common" "4.24.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.21.4", "@babel/generator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== - dependencies: - "@babel/types" "^7.24.7" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.21.4", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz" - integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz" - integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.21.4", "@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.21.2", "@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz" - integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== - -"@babel/helper-remap-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz" - integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" - -"@babel/helper-replace-supers@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz" - integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" - "@babel/helper-optimise-call-expression" "^7.24.7" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== - -"@babel/helper-wrap-function@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz" - integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== - dependencies: - "@babel/helper-function-name" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.21.4", "@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz" - integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz" - integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz" - integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz" - integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz" - integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-async-generator-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz" - integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== - dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" - -"@babel/plugin-transform-block-scoped-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-block-scoping@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz" - integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-class-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz" - integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-class-static-block@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz" - integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" - -"@babel/plugin-transform-destructuring@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz" - integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-dotall-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-duplicate-keys@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-dynamic-import@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-export-namespace-from@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - -"@babel/plugin-transform-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz" - integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== - dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-json-strings@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-logical-assignment-operators@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-modules-amd@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== - dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-modules-commonjs@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz" - integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== - dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - -"@babel/plugin-transform-modules-systemjs@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz" - integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== - dependencies: - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/plugin-transform-modules-umd@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== - dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-new-target@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== - dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" - -"@babel/plugin-transform-object-super@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - -"@babel/plugin-transform-optional-catch-binding@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz" - integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-private-methods@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz" - integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-private-property-in-object@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz" - integrity sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-display-name@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz" - integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-react-jsx-development@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz" - integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.24.7" - -"@babel/plugin-transform-react-jsx@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz" - integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/plugin-transform-react-pure-annotations@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz" - integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-regenerator@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-runtime@^7.18.6": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - -"@babel/plugin-transform-sticky-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-template-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-typeof-symbol@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz" - integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-typescript@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz" - integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-typescript" "^7.24.7" - -"@babel/plugin-transform-unicode-escapes@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-property-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-sets-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz" - integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz" - integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== - dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.7" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.24.7" - "@babel/plugin-transform-async-to-generator" "^7.24.7" - "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.24.7" - "@babel/plugin-transform-class-properties" "^7.24.7" - "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.7" - "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.7" - "@babel/plugin-transform-dotall-regex" "^7.24.7" - "@babel/plugin-transform-duplicate-keys" "^7.24.7" - "@babel/plugin-transform-dynamic-import" "^7.24.7" - "@babel/plugin-transform-exponentiation-operator" "^7.24.7" - "@babel/plugin-transform-export-namespace-from" "^7.24.7" - "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.24.7" - "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.24.7" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" - "@babel/plugin-transform-member-expression-literals" "^7.24.7" - "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-modules-systemjs" "^7.24.7" - "@babel/plugin-transform-modules-umd" "^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" - "@babel/plugin-transform-new-target" "^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" - "@babel/plugin-transform-numeric-separator" "^7.24.7" - "@babel/plugin-transform-object-rest-spread" "^7.24.7" - "@babel/plugin-transform-object-super" "^7.24.7" - "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" - "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.24.7" - "@babel/plugin-transform-private-property-in-object" "^7.24.7" - "@babel/plugin-transform-property-literals" "^7.24.7" - "@babel/plugin-transform-regenerator" "^7.24.7" - "@babel/plugin-transform-reserved-words" "^7.24.7" - "@babel/plugin-transform-shorthand-properties" "^7.24.7" - "@babel/plugin-transform-spread" "^7.24.7" - "@babel/plugin-transform-sticky-regex" "^7.24.7" - "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.7" - "@babel/plugin-transform-unicode-escapes" "^7.24.7" - "@babel/plugin-transform-unicode-property-regex" "^7.24.7" - "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz" - integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-transform-react-display-name" "^7.24.7" - "@babel/plugin-transform-react-jsx" "^7.24.7" - "@babel/plugin-transform-react-jsx-development" "^7.24.7" - "@babel/plugin-transform-react-pure-annotations" "^7.24.7" - -"@babel/preset-typescript@^7.18.6": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz" - integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - "@babel/plugin-syntax-jsx" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.7" - "@babel/plugin-transform-typescript" "^7.24.7" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.18.6": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz" - integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.12.7", "@babel/template@^7.20.7", "@babel/template@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.4", "@babel/traverse@^7.24.7": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.24.7", "@babel/types@^7.4.4": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== - dependencies: - "@babel/helper-string-parser" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - -"@braintree/sanitize-url@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz" - integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@docsearch/css@3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz" - integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ== - -"@docsearch/react@^3.1.1": - version "3.6.0" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz" - integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w== - dependencies: - "@algolia/autocomplete-core" "1.9.3" - "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.6.0" - algoliasearch "^4.19.1" - -"@docusaurus/core@2.4.3", "@docusaurus/core@~2.4.1": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.3.tgz" - integrity sha512-dWH5P7cgeNSIg9ufReX6gaCl/TmrGKD38Orbwuz05WPhAQtFXHd5B8Qym1TiXfvUNvwoYKkAJOJuGe8ou0Z7PA== - dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.4.3" - "@docusaurus/logger" "2.4.3" - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-common" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^2.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.3.tgz" - integrity sha512-ZvGSRCi7z9wLnZrXNPG6DmVPHdKGd8dIn9pYbEOFiYihfv4uDR3UtxogmKf+rT8ZlKFf5Lqne8E8nt08zNM8CA== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - -"@docusaurus/logger@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.3.tgz" - integrity sha512-Zxws7r3yLufk9xM1zq9ged0YHs65mlRmtsobnFkdZTxWXdTYlWWLWdKyNKAsVC+D7zg+pv2fGbyabdOnyZOM3w== - dependencies: - chalk "^4.1.2" - tslib "^2.4.0" - -"@docusaurus/mdx-loader@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.3.tgz" - integrity sha512-b1+fDnWtl3GiqkL0BRjYtc94FZrcDDBV1j8446+4tptB9BAOlePwG2p/pK6vGvfL53lkOsszXMghr2g67M0vCw== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@docusaurus/module-type-aliases@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.3.tgz" - integrity sha512-cwkBkt1UCiduuvEAo7XZY01dJfRn7UR/75mBgOdb1hKknhrabJZ8YH+7savd/y9kLExPyrhe0QwdS9GuzsRRIA== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.4.3" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-content-blog@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.3.tgz" - integrity sha512-PVhypqaA0t98zVDpOeTqWUTvRqCEjJubtfFUQ7zJNYdbYTbS/E/ytq6zbLVsN/dImvemtO/5JQgjLxsh8XLo8Q== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/logger" "2.4.3" - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-common" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-docs@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.3.tgz" - integrity sha512-N7Po2LSH6UejQhzTCsvuX5NOzlC+HiXOVvofnEPj0WhMu1etpLEXE6a4aTxrtg95lQ5kf0xUIdjX9sh3d3G76A== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/logger" "2.4.3" - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/module-type-aliases" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-pages@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.3.tgz" - integrity sha512-txtDVz7y3zGk67q0HjG0gRttVPodkHqE0bpJ+7dOaTH40CQFLSh7+aBeGnPOTl+oCPG+hxkim4SndqPqXjQ8Bg== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - -"@docusaurus/plugin-debug@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.3.tgz" - integrity sha512-LkUbuq3zCmINlFb+gAd4ZvYr+bPAzMC0hwND4F7V9bZ852dCX8YoWyovVUBKq4er1XsOwSQaHmNGtObtn8Av8Q== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-analytics@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.3.tgz" - integrity sha512-KzBV3k8lDkWOhg/oYGxlK5o9bOwX7KpPc/FTWoB+SfKhlHfhq7qcQdMi1elAaVEIop8tgK6gD1E58Q+XC6otSQ== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-gtag@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.3.tgz" - integrity sha512-5FMg0rT7sDy4i9AGsvJC71MQrqQZwgLNdDetLEGDHLfSHLvJhQbTCUGbGXknUgWXQJckcV/AILYeJy+HhxeIFA== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-tag-manager@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.3.tgz" - integrity sha512-1jTzp71yDGuQiX9Bi0pVp3alArV0LSnHXempvQTxwCGAEzUWWaBg4d8pocAlTpbP9aULQQqhgzrs8hgTRPOM0A== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - tslib "^2.4.0" - -"@docusaurus/plugin-sitemap@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.3.tgz" - integrity sha512-LRQYrK1oH1rNfr4YvWBmRzTL0LN9UAPxBbghgeFRBm5yloF6P+zv1tm2pe2hQTX/QP5bSKdnajCvfnScgKXMZQ== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/logger" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-common" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - fs-extra "^10.1.0" - sitemap "^7.1.1" - tslib "^2.4.0" - -"@docusaurus/preset-classic@~2.4.1": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.3.tgz" - integrity sha512-tRyMliepY11Ym6hB1rAFSNGwQDpmszvWYJvlK1E+md4SW8i6ylNHtpZjaYFff9Mdk3i/Pg8ItQq9P0daOJAvQw== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/plugin-content-blog" "2.4.3" - "@docusaurus/plugin-content-docs" "2.4.3" - "@docusaurus/plugin-content-pages" "2.4.3" - "@docusaurus/plugin-debug" "2.4.3" - "@docusaurus/plugin-google-analytics" "2.4.3" - "@docusaurus/plugin-google-gtag" "2.4.3" - "@docusaurus/plugin-google-tag-manager" "2.4.3" - "@docusaurus/plugin-sitemap" "2.4.3" - "@docusaurus/theme-classic" "2.4.3" - "@docusaurus/theme-common" "2.4.3" - "@docusaurus/theme-search-algolia" "2.4.3" - "@docusaurus/types" "2.4.3" - -"@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.3.tgz" - integrity sha512-QKRAJPSGPfDY2yCiPMIVyr+MqwZCIV2lxNzqbyUW0YkrlmdzzP3WuQJPMGLCjWgQp/5c9kpWMvMxjhpZx1R32Q== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/module-type-aliases" "2.4.3" - "@docusaurus/plugin-content-blog" "2.4.3" - "@docusaurus/plugin-content-docs" "2.4.3" - "@docusaurus/plugin-content-pages" "2.4.3" - "@docusaurus/theme-common" "2.4.3" - "@docusaurus/theme-translations" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-common" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.43" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.3.tgz" - integrity sha512-7KaDJBXKBVGXw5WOVt84FtN8czGWhM0lbyWEZXGp8AFfL6sZQfRTluFp4QriR97qwzSyOfQb+nzcDZZU4tezUw== - dependencies: - "@docusaurus/mdx-loader" "2.4.3" - "@docusaurus/module-type-aliases" "2.4.3" - "@docusaurus/plugin-content-blog" "2.4.3" - "@docusaurus/plugin-content-docs" "2.4.3" - "@docusaurus/plugin-content-pages" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-common" "2.4.3" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - use-sync-external-store "^1.2.0" - utility-types "^3.10.0" - -"@docusaurus/theme-mermaid@~2.4.1": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-2.4.3.tgz" - integrity sha512-S1tZ3xpowtFiTrpTKmvVbRHUYGOlEG5CnPzWlO4huJT1sAwLR+pD6f9DYUlPv2+9NezF3EfUrUyW9xLH0UP58w== - dependencies: - "@docusaurus/core" "2.4.3" - "@docusaurus/module-type-aliases" "2.4.3" - "@docusaurus/theme-common" "2.4.3" - "@docusaurus/types" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - "@mdx-js/react" "^1.6.22" - mermaid "^9.2.2" - tslib "^2.4.0" - -"@docusaurus/theme-search-algolia@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.3.tgz" - integrity sha512-jziq4f6YVUB5hZOB85ELATwnxBz/RmSLD3ksGQOLDPKVzat4pmI8tddNWtriPpxR04BNT+ZfpPUMFkNFetSW1Q== - dependencies: - "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.4.3" - "@docusaurus/logger" "2.4.3" - "@docusaurus/plugin-content-docs" "2.4.3" - "@docusaurus/theme-common" "2.4.3" - "@docusaurus/theme-translations" "2.4.3" - "@docusaurus/utils" "2.4.3" - "@docusaurus/utils-validation" "2.4.3" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^2.0.0" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-translations@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.3.tgz" - integrity sha512-H4D+lbZbjbKNS/Zw1Lel64PioUAIT3cLYYJLUf3KkuO/oc9e0QCVhIYVtUI2SfBCF2NNdlyhBDQEEMygsCedIg== - dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" - -"@docusaurus/types@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.3.tgz" - integrity sha512-W6zNLGQqfrp/EoPD0bhb9n7OobP+RHpmvVzpA+Z/IuU3Q63njJM24hmT0GYboovWcDtFmnIJC9wcyx4RVPQscw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - -"@docusaurus/utils-common@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.3.tgz" - integrity sha512-/jascp4GbLQCPVmcGkPzEQjNaAk3ADVfMtudk49Ggb+131B1WDD6HqlSmDf8MxGdy7Dja2gc+StHf01kiWoTDQ== - dependencies: - tslib "^2.4.0" - -"@docusaurus/utils-validation@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.3.tgz" - integrity sha512-G2+Vt3WR5E/9drAobP+hhZQMaswRwDlp6qOMi7o7ZypB+VO7N//DZWhZEwhcRGepMDJGQEwtPv7UxtYwPL9PBw== - dependencies: - "@docusaurus/logger" "2.4.3" - "@docusaurus/utils" "2.4.3" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" - -"@docusaurus/utils@2.4.3": - version "2.4.3" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.3.tgz" - integrity sha512-fKcXsjrD86Smxv8Pt0TBFqYieZZCPh4cbf9oszUq/AMhZn3ujwpKaVYZACPX8mmjtYx0JOgNx52CREBfiGQB4A== - dependencies: - "@docusaurus/logger" "2.4.3" - "@svgr/webpack" "^6.2.1" - escape-string-regexp "^4.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sindresorhus/is@^4.0.0": - version "4.6.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== - -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== - -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" - -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== - dependencies: - "@babel/types" "^7.20.0" - entities "^4.4.0" - -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== - dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/estree@^1.0.5": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/hast@^2.0.0": - version "2.3.10" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" - integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== - dependencies: - "@types/unist" "^2" - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/http-proxy@^1.17.8": - version "1.17.10" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz" - integrity sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/minimist@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@*": - version "18.15.13" - resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.11" - resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz" - integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "^5.1.0" - -"@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*", "@types/react-router@^5.1.0": - version "5.1.20" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - -"@types/react@*": - version "18.0.37" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz" - integrity sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/sax@^1.2.1": - version "1.2.7" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz" - integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.10" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== - -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-attributes@^1.9.5: - version "1.9.5" - resolved "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" - integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.10.0: - version "3.22.2" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.2.tgz" - integrity sha512-3YQ6eo7uYOCHeQ2ZpD+OoT3aJJwMNKEnwtu8WMzm81XmBOSCwRjQditH9CeSOQ38qhHkuGw23pbq+kULkIJLcw== - dependencies: - "@algolia/events" "^4.0.1" - -algoliasearch@^4.13.1, algoliasearch@^4.19.1: - version "4.24.0" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz" - integrity sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g== - dependencies: - "@algolia/cache-browser-local-storage" "4.24.0" - "@algolia/cache-common" "4.24.0" - "@algolia/cache-in-memory" "4.24.0" - "@algolia/client-account" "4.24.0" - "@algolia/client-analytics" "4.24.0" - "@algolia/client-common" "4.24.0" - "@algolia/client-personalization" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/logger-console" "4.24.0" - "@algolia/recommend" "4.24.0" - "@algolia/requester-browser-xhr" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/requester-node-http" "4.24.0" - "@algolia/transporter" "4.24.0" - -ansi-align@^3.0.0, ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-union@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" - integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -arrify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz" - integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.19" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@0.28.1, axios@^0.25.0: - version "0.28.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz" - integrity sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== - dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -call-bind@^1.0.2, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase-keys@^7.0.0: - version "7.0.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz" - integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== - dependencies: - camelcase "^6.3.0" - map-obj "^4.1.0" - quick-lru "^5.1.1" - type-fest "^1.2.1" - -camelcase@^6.2.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629: - version "1.0.30001640" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz" - integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cliui@^7.0.4: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@7, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^2.19.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -copy-text-to-clipboard@^3.0.1: - version "3.2.0" - resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz" - integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -core-js-compat@^3.25.1, core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz" - integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== - dependencies: - browserslist "^4.23.0" - -core-js-pure@^3.25.1: - version "3.30.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.1.tgz" - integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== - -core-js@^3.23.3: - version "3.30.1" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.1.tgz" - integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cose-base@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz" - integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== - dependencies: - layout-base "^1.0.0" - -cose-base@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz" - integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== - dependencies: - layout-base "^2.0.0" - -cosmiconfig-typescript-loader@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cp-file@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz" - integrity sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA== - dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" - -cpy-cli@4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/cpy-cli/-/cpy-cli-4.2.0.tgz" - integrity sha512-b04b+cbdr29CdpREPKw/itrfjO43Ty0Aj7wRM6M6LoE4GJxZJCk9Xp+Eu1IqztkKh3LxIBt1tDplENsa6KYprg== - dependencies: - cpy "^9.0.0" - meow "^10.1.2" - -cpy@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz" - integrity sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg== - dependencies: - arrify "^3.0.0" - cp-file "^9.1.0" - globby "^13.1.1" - junk "^4.0.0" - micromatch "^4.0.4" - nested-error-stacks "^2.1.0" - p-filter "^3.0.0" - p-map "^5.3.0" - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-loader@^6.7.1: - version "6.7.3" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -cytoscape-cose-bilkent@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz" - integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== - dependencies: - cose-base "^1.0.0" - -cytoscape-fcose@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz" - integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== - dependencies: - cose-base "^2.2.0" - -cytoscape@^3.23.0: - version "3.25.0" - resolved "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz" - integrity sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q== - dependencies: - heap "^0.2.6" - lodash "^4.17.21" - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" - integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== - dependencies: - internmap "1 - 2" - -d3-axis@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-contour@4: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz" - integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.4" - resolved "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz" - integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -"d3-ease@1 - 3", d3-ease@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@3: - version "3.2.0" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.1.0" - resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^7.4.0, d3@^7.8.2: - version "7.8.5" - resolved "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz" - integrity sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -dagre-d3-es@7.0.9: - version "7.0.9" - resolved "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz" - integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== - dependencies: - d3 "^7.8.2" - lodash-es "^4.17.21" - -dayjs@^1.11.7: - version "1.11.9" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz" - integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz" - integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del-cli@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/del-cli/-/del-cli-5.0.0.tgz" - integrity sha512-rENFhUaYcjoMODwFhhlON+ogN7DoG+4+GFN+bsA1XeDt4w2OKQnQadFP1thHSAlK9FAtl88qgP66wOV+eFZZiQ== - dependencies: - del "^7.0.0" - meow "^10.1.3" - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -del@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/del/-/del-7.0.0.tgz" - integrity sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q== - dependencies: - globby "^13.1.2" - graceful-fs "^4.2.10" - is-glob "^4.0.3" - is-path-cwd "^3.0.0" - is-path-inside "^4.0.0" - p-map "^5.5.0" - rimraf "^3.0.2" - slash "^4.0.0" - -delaunator@5: - version "5.0.0" - resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@2.4.3: - version "2.4.3" - resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz" - integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.796: - version "1.4.816" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz" - integrity sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== - -elkjs@^0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz" - integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.17.1: - version "5.17.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== - -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eta@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz" - integrity sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== - dependencies: - "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.3: - version "4.21.0" - resolved "https://registry.npmjs.org/express/-/express-4.21.0.tgz" - integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.10" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.5" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flux@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.15.0: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.2.0: - version "11.2.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1, function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -github-slugger@^1.4.0: - version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^10.0.0: - version "10.2.1" - resolved "https://registry.npmjs.org/glob/-/glob-10.2.1.tgz" - integrity sha512-ngom3wq2UhjdbmRE/krgkD8BQyi1KZ5l+D2dVm4+Yj+jJIBp74/ZGunL6gNGc/CYuQmvUBiavWEXIotRiv5R6A== - dependencies: - foreground-child "^3.1.0" - fs.realpath "^1.0.0" - jackspeak "^2.0.3" - minimatch "^9.0.0" - minipass "^5.0.0" - path-scurry "^1.7.0" - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^12.0.2: - version "12.2.0" - resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" - integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== - dependencies: - array-union "^3.0.1" - dir-glob "^3.0.1" - fast-glob "^3.2.7" - ignore "^5.1.9" - merge2 "^1.4.1" - slash "^4.0.0" - -globby@^13.1.1, globby@^13.1.2: - version "13.1.4" - resolved "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^11.8.5, got@^9.6.0: - version "11.8.6" - resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -heap@^0.2.6: - version "0.2.7" - resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.1.0: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^5.5.0: - version "5.5.1" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.7" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" - integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.1.9, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@^1.0.1: - version "1.1.1" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz" - integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - -infima@0.2.0-alpha.43: - version "0.2.0-alpha.43" - resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz" - integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.11.0, is-core-module@^2.5.0: - version "2.12.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz" - integrity sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-path-inside@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz" - integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jackspeak@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.0.3.tgz" - integrity sha512-0Jud3OMUdMbrlr3PyUMKESq51LXVAB+a239Ywdvd+Kgxj3MaBRml/nVRxf8tQFyfthMjuRkxkv7Vg58pmIMfuQ== - dependencies: - cliui "^7.0.4" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.5.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -joi@^17.6.0: - version "17.9.1" - resolved "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz" - integrity sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz" - integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w== - dependencies: - universalify "^0.1.2" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -junk@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz" - integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ== - -keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== - dependencies: - json-buffer "3.0.1" - -khroma@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz" - integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -layout-base@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz" - integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== - -layout-base@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz" - integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.0.tgz" - integrity sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ== - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.5.1" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz" - integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== - dependencies: - fs-monkey "^1.0.3" - -meow@^10.1.1, meow@^10.1.2, meow@^10.1.3: - version "10.1.5" - resolved "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz" - integrity sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw== - dependencies: - "@types/minimist" "^1.2.2" - camelcase-keys "^7.0.0" - decamelize "^5.0.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.2" - read-pkg-up "^8.0.0" - redent "^4.0.0" - trim-newlines "^4.0.2" - type-fest "^1.2.2" - yargs-parser "^20.2.9" - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -mermaid@^9.2.2: - version "9.4.3" - resolved "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz" - integrity sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw== - dependencies: - "@braintree/sanitize-url" "^6.0.0" - cytoscape "^3.23.0" - cytoscape-cose-bilkent "^4.1.0" - cytoscape-fcose "^2.1.0" - d3 "^7.4.0" - dagre-d3-es "7.0.9" - dayjs "^1.11.7" - dompurify "2.4.3" - elkjs "^0.8.2" - khroma "^2.0.0" - lodash-es "^4.17.21" - non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.2" - ts-dedent "^2.2.0" - uuid "^9.0.0" - web-worker "^1.2.0" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18, mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@^2.6.1: - version "2.7.5" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz" - integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.7: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz" - integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -non-layered-tidy-tree-layout@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz" - integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== - -normalize-package-data@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz" - integrity sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg== - dependencies: - p-map "^5.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^5.1.0, p-map@^5.3.0, p-map@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz" - integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== - dependencies: - lru-cache "^9.0.0" - minipass "^5.0.0" - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz" - integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.0.0: - version "7.2.4" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.2.4.tgz" - integrity sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w== - dependencies: - cosmiconfig "^8.1.3" - cosmiconfig-typescript-loader "^4.3.0" - klona "^2.0.6" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sort-media-queries@^4.2.1: - version "4.4.1" - resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz" - integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== - dependencies: - sort-css-media-queries "2.1.0" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== - -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.39" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz" - integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== - -prismjs@^1.28.0: - version "1.29.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-helmet-async@*, react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== - dependencies: - "@babel/runtime" "^7.10.3" - -"react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== - dependencies: - "@babel/runtime" "^7.1.2" - -react-router-dom@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-textarea-autosize@^8.3.2: - version "8.5.3" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz" - integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -read-pkg-up@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz" - integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== - dependencies: - find-up "^5.0.0" - read-pkg "^6.0.0" - type-fest "^1.0.1" - -read-pkg@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz" - integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^3.0.2" - parse-json "^5.2.0" - type-fest "^1.0.1" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redent@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz" - integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== - dependencies: - indent-string "^5.0.0" - strip-indent "^4.0.0" - -regenerate-unicode-properties@^10.1.0: - version "10.1.1" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" - integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -replace-in-files-cli@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/replace-in-files-cli/-/replace-in-files-cli-2.0.0.tgz" - integrity sha512-N2JsH7OenOxwv5Ww/tT3Fo6HAwYObAIOFNCu9W9oZJpxE+l7xxN8Aigx2z3JDxM2bIGmznYGJpI9HFEliIdZfQ== - dependencies: - escape-string-regexp "^5.0.0" - globby "^12.0.2" - meow "^10.1.1" - normalize-path "^3.0.0" - write-file-atomic "^3.0.3" - -replace-json-property@1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/replace-json-property/-/replace-json-property-1.8.0.tgz" - integrity sha512-x0TN9mR0Q6b9THtl9tKJj+MGokgC4OMSacgZx2BrX6nce2FufNiu+j8QG05eN0GXDBqlrFs+0OnxOGzWEnSrSA== - dependencies: - chalk "^4.1.0" - commander "^2.19.0" - jsonfile "^5.0.0" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -"require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz" - integrity sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g== - dependencies: - glob "^10.0.0" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -robust-predicates@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz" - integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== - -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== - -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== - dependencies: - find-up "^5.0.0" - picocolors "^1.0.0" - postcss "^8.3.11" - strip-json-comments "^3.1.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@1: - version "1.3.3" - resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -rxjs@^7.5.4: - version "7.8.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.4.1" - resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@0.19.0: - version "0.19.0" - resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz" - integrity sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw== - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -sitemap@^7.1.1: - version "7.1.2" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz" - integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.3.2" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz" - integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz" - integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== - dependencies: - min-indent "^1.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -stylis@^4.1.2: - version "4.3.0" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.3: - version "5.3.10" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.10.0, terser@^5.26.0: - version "5.33.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz" - integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^4.0.2: - version "4.1.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz" - integrity sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/trim/-/trim-1.0.1.tgz" - integrity sha512-3JVP2YVqITUisXblCDq/Bi4P9457G/sdEamInkyvCsjbTcXLXIiG7XCb4kGMFWh6JGXesS3TKxOPtrncN/xe8w== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -ts-dedent@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: - version "1.4.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - -type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -ua-parser-js@^1.0.35: - version "1.0.38" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz" - integrity sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.16: - version "1.1.0" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== - dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" - integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.11.0" - resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz" - integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -web-worker@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz" - integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-bundle-analyzer@^4.5.0: - version "4.8.0" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.4" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.9.3: - version "4.13.3" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz" - integrity sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.8.0: - version "5.10.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.94.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1: - version "7.5.10" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.13.0: - version "8.18.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==