diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 8b6339a..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index ba2b3cb..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - tsconfigRootDir: __dirname, // this is the reason this is a .js file - project: ['./tsconfig.eslint.json'], - }, - extends: [ - '@rubensworks' - ], - rules: { - '@typescript-eslint/naming-convention': [ - 'error', - { - 'selector': 'interface', - 'format': ['PascalCase'], - 'custom': { - 'regex': '^[A-Z]', - 'match': true - } - } - ], - } -}; diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..55df9c3 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,37 @@ +This page contains several pointers for people that want to contribute to this project. + +## Setup development environment + +Start by cloning this repository. + +```bash +$ git clone git@github.com:LinkedSoftwareDependencies/Components-Generator.js.git +``` + +This project requires [Node.js](https://nodejs.org/en/) `>=18.12` and [Yarn](https://yarnpkg.com/) `>=4` to be installed. Preferable, use the Yarn version provided and managed by Node.js' integrated [CorePack](https://yarnpkg.com/corepack) by running `corepack enable`. + +After that, you can install the project by running `yarn install`. This will automatically also run `yarn build`, which you can run again at any time to compile any changed code. + +## Continuous integration + +Given the critical nature of this project, we require a full (100%) test coverage. +Additionally, we have configured strict linting rules. + +These checks are run automatically upon each commit, and via continuous integration. + +You can run them manually as follows: +```bash +$ yarn test +$ yarn lint +``` + +## Code architecture + +The architecture is decomposed into 5 main packages: + +1. [`config`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/config): Loading a generator from configuration files. +2. [`generate`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/generate): Generating component files by parsing type information from TypeScript and serializing it into JSON-LD. +3. [`parse`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/parse): Parsing components from TypeScript. +4. [`resolution`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/resolution): Resolution of dependencies. +5. [`serialize`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/serialize): Serializing components to JSON-LD. +6. [`util`](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/tree/master/lib/util): Various utilities. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 270a72b..2742427 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,62 +1,86 @@ name: CI on: [push, pull_request] -jobs: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + DEFAULT_NODE_VERSION: 22.x + +jobs: lint: + name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} + uses: actions/setup-node@v6 with: - path: '**/node_modules' - key: ${{ runner.os }}-lint-modules-${{ hashFiles('**/yarn.lock') }} - - uses: actions/setup-node@v2 + node-version: ${{ env.DEFAULT_NODE_VERSION }} + - name: Enable corepack + run: corepack enable + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input + - name: Checkout repository + uses: actions/checkout@v5 + - name: Load dependency cache + uses: actions/cache@v4 with: - node-version: 14.x - - run: yarn install - - run: yarn run lint - + path: '**/node_modules' + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --immutable + - name: Run ESLint + run: yarn run lint test: + name: Test + needs: lint runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: + - ubuntu-latest + - windows-latest + - macos-latest node-version: - - 10.x - - 12.x - - 14.x + - 18.x + - 20.x + - 22.x steps: - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} + - name: Enable corepack + run: corepack enable - name: Ensure line endings are consistent run: git config --global core.autocrlf input - - name: Check out repository - uses: actions/checkout@v2 - - uses: actions/cache@v2 + - name: Checkout repository + uses: actions/checkout@v5 + - name: Load dependency cache + uses: actions/cache@v4 with: path: '**/node_modules' - key: ${{ runner.os }}-test-modules-${{ hashFiles('**/yarn.lock') }} + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - name: Install dependencies - run: yarn install + run: yarn install --immutable - name: Build project run: yarn run build - name: Run tests run: yarn run test - name: Submit coverage results - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.github_token }} - flag-name: run-${{ matrix.node-version }} + flag-name: ${{ matrix.node-version }}-${{ matrix.os }} parallel: true - coveralls: + name: Coverage needs: test runs-on: ubuntu-latest steps: - name: Consolidate test coverage from different jobs - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.github_token }} parallel-finished: true diff --git a/.gitignore b/.gitignore index 5bdc52f..54d337c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,12 @@ -**/.idea/ -**/node_modules/ -**/coverage/ -**/comunica_temp/ -**/local_temp/ -test_files/ -output/ .eslintcache +.yarn/ + +node_modules/ +coverage/ **/lib/**/*.js **/lib/**/*.js.map **/lib/**/*.d.ts -**/test/**/*.js -**/test/**/*.js.map -**/test/**/*.d.ts -!/test/data/**/*.d.ts **/bin/**/*.js **/bin/**/*.js.map **/bin/**/*.d.ts -**/index.js -**/index.js.map -**/index.d.ts diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/pre-commit b/.husky/pre-commit index af44751..f4e15be 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,3 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npm run build && npm run lint && npm run test +yarn run build +yarn run lint +yarn run test diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..e8c211e --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,3 @@ +compressionLevel: mixed +enableGlobalCache: false +nodeLinker: node-modules diff --git a/CHANGELOG.md b/CHANGELOG.md index bbac654..05eb77b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,230 @@ # Changelog All notable changes to this project will be documented in this file. + +## [v4.3.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v4.2.0...v4.3.0) - 2024-10-23 + +### Added +* [Support @json ranges in arrays](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/10d7e48c489f3d5fcaa59015a4f409ee31047ba1) + + +## [v4.2.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v4.1.0...v4.2.0) - 2024-09-27 + +### Changed +* [Update to jsonld-context-parser v3](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/26fbe7e60df4cbaa4a41845b34ee14d73d72e4b6) + + +## [v4.1.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v4.0.1...v4.1.0) - 2024-09-17 + +### Added +* [Output the default values of generic types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/7b85bcd0f59fd1b3a284a286dad7e6c9307cf4e2) + + +## [v4.0.1](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v4.0.0...v4.0.1) - 2024-03-05 + +### Fixed +* [Fix invalid postinstall script](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/de5b89666a661a21b13c54e256551e2f720bf61f) + + +## [v4.0.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.1.2...v4.0.0) - 2024-03-05 + +### Changed +* [Bump @typescript-eslint/typescript-estree to v7](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/e96ef49eba3c3c682348888f01cdf5a317274b08) +* [Update to Components.js v6](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/dc60e5ce3a0097276971393312ba34b58da19d8d) + + +## [v3.1.2](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.1.1...v3.1.2) - 2023-06-15 + +### Fixed +* [Fix failing ESM imports with file extension](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/7301c3e40b11f811fc377cefe8a984ef262eaff4) + + +## [v3.1.1](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.1.0...v3.1.1) - 2023-06-01 + +### Fixed +* [Ensure paths are treated correctly on Windows (#116)](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/2a2a766bbc474954235cbea85558411ae03ecaf4) + + +## [v3.1.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.4...v3.1.0) - 2022-08-12 + +### Changed +* [Prevent ClassLoader from throwing error on invalid packages, Closes #95](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/5f8e23c98f6bd4a9b436461ef8832bbb4e336705) +* [Prevent ExternalModulesLoader from throwing error on invalid packages, Closes #95](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/016a371b4bddef005319cf151de9e07ed15c1307) + + +## [v3.0.5](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.4...v3.0.5) - 2022-06-27 + +### Fixed +* [Fix incorrect handling of recursive types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/5f7e8d48783e59a1dcec416175f8ef657d3b7470) + + +## [v3.0.4](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.3...v3.0.4) - 2022-06-01 + +### Fixed +* [Fix process halting on recursive types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/9375d1478b361ade2a61958f7310ff29efd525d2) + + +## [v3.0.3](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.1...v3.0.3) - 2022-04-27 + +### Fixed +* [Fix resolution of an index.d.ts inside a directory, Closes #99](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/8b8229090a73dcc1b7762d358952c2a1e2a5209b) + + +## [v3.0.2](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.1...v3.0.2) - 2022-03-15 + +### Fixed +* [Add path expansion for Windows users, Closes #96](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3a0d109d6b9d46f976c4212826c02d0e3d448489) + + +## [v3.0.1](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0...v3.0.1) - 2022-03-02 + +### Fixed +* [Fix Components.js version range being too strict](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/7c64fc71d80ead5fcc7fc84e5f51a4df0c1e6551) + + +## [v3.0.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.7...v3.0.0) - 2022-03-01 + +### Changed +* [Update to CJS 5](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/f2be05ba2065116c9b2bf405fd84e8d1ce0155c1) +* [Update dependency @types/node to v16](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/66dfae6b27d923c795f6bc455272fb8c95e0a048) + + +## [v3.0.0-beta.7](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.6...v3.0.0-beta.7) - 2022-02-08 + +### Added +* [Add support for never param types as wildcard, Closes #85](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/67b4972e66db8710469b0f678852f5c9fa52e5f5) + + +## [v3.0.0-beta.6](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.5...v3.0.0-beta.6) - 2022-01-29 + +### Added +* [Add lenient generation mode to ignore unsupported lang features](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/6654e77c8d9ff98cdbbd9639b64e79d9817087d1) +* [Support indexed access type param ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/823deb987b50efadaa0e22fb2ea7e637a7ea37ae) +* [Support keyof typeof enum as union of enum keys](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/bc15b19c7789d70e3639be9194dd81054cdde561) + +### Changed +* [Emit typed memberFields instead of memberKeys](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/d58bfa24097617ca75e066f027b91589b91f5e4b) +* [Ignore TSMappedType during generation](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/82082ffa9af45bde8e8bbbde720990664f886a44) +* [Ignore unsupported function types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/e40fef9f936cc0d39e25703f092aad61717fac6e) + +### Fixed +* [Fix empty context shortcuts being generated in some cases](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/458d2dea522c6898984baa0dd1b05e3835aad394) + + +## [v3.0.0-beta.5](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.4...v3.0.0-beta.5) - 2022-01-17 + +### Added +* [Generate wildcard parameter ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/193ea080f4bfbc4e4591b2609eb5a4bf554f605e) +* Improve generics support: + * [Output generic type instances on class/iface extensions](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3c7528ea4b774a808d053a8e55bc1f513ca9f022) + * [Generate wrapped comp extensions as GenericComponentExtension](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/110e3832e45958e4a974fd7a057b292b2be18f6b) +* [Handle references to external packages that do no expose components](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/22c43c03ed5fa3da7b4c4b6e06cd71e9eb0c048e) +* [Cache interface range resolution](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/c184e4722c5cda54aafce7ca92bf070551d6baee) + +### Fixed +* [Inherit qualified path on class/iface chains](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/75d962c52423890ffb4ec9d27f88bf29a712149b) +* [Fix resolution not working on type-only packages, Closes #83](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/e1c0126a7a396cd7792385bb1bdda9984cfd1626) +* [Don't resolve as nested fields when handling extension data](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/a7401ef79e84d3ddef88ee7bf2008cdb91506b5e) +* [Emit @type of ExtensionDefinitions](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/5545a4ebb116ea06f13a374dd65c658bf85dd15c) +* [Fix qualified path incorrectly propagating to extension defs](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/2b12135a83d7132545b426cf8c2ecb75fd0a0d22) +* [Don't throw on hash range when getNestedFields is false](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/f87ea4c03aca4bc7b2741aebbac669b2d84c6ca6) +* [Fix generics not being generated for interfaces](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/facf5fc164321d9a2ec1be92c75d2f493f722120) + + +## [v3.0.0-beta.4](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.3...v3.0.0-beta.4) - 2021-12-09 + +### Added +* [Handle keyof param ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/4e0df62cf6d2189a0c338f7b33f7d61b47209ab1) +* [Export component member keys, for keyof checking](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/391aa833632b5bc3aac4eaeb020ed60b7695c845) +* [Handle generics in type aliases](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/1983f478d52e7ebbb1c5e9bab99f6fe5172d53ba) +* [Allow fieldNameToId to refer to other packages](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3a25ad74a91cb8a149d80f02f8cdc186d5e8db57) +* Support qualified paths: + * [Support qualified paths in ignored components](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/d4703c82c017fc43974b59e5be62015df4e55b1b) + * [Support parameters referring to components with qualified paths](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/8a4e112ccf776b6aa025925947e6c42aeecffa7d) +* [Support enum and enum value parameter ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/96e86972b3f20fdfa387a4891ee832ffdddb6da9) + +### Changed +* [Return undefined for nested parameter ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/de7cde1f2cef6a339eb427bce0536ce31fbaba97) +* * [Improve error message for unsupported nested fields](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/05b9e150cd5312c2cc424b0be30317e06ff3bb5b) + +### Fixed +* [Fix stackoverflow on generic remapping with self-references](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/326f31fb5ceab75bf238448693893b4ceba212b5) + + + +## [v3.0.0-beta.3](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.2...v3.0.0-beta.3) - 2021-12-07 + +### Added +* [Generate all relevant generic type data of classes and params](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/4245abd23b6b16363fa5cce47f72a61d351f9884) + + +## [v3.0.0-beta.2](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.1...v3.0.0-beta.2) - 2021-12-02 + +### Fixed +* [Fix class types not being overridable, Closs #82](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/1be3a39ca317d6e64648566c716769da1c8c8826) + + +## [v3.0.0-beta.1](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v3.0.0-beta.0...v3.0.0-beta.1) - 2021-12-02 + +### Added +* [Allow type aliases for interfaces and classes](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/c480f717ad35ec0e8c1cc67dbacf9e7eac69fd25) + + +## [v3.0.0-beta.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v2.6.0...v3.0.0-beta.0) - 2021-11-30 + +_Requires Components.js >= 5.0.0_ + +### BREAKING CHANGES +* [Enable type scoped context functionality by default](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/40bcc44c99674e467b7c3b0c9b9d6b0c563f283b): This means that the `--typeScopedContexts` CLI option should not be passed anymore. +* [Make component URLs dereferenceable](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/783670cc6ff91b5d33bb5431b7f817e73acd9548): This improves the URL strategy for components, and results in different component URLs. +* Align with Components.js range changes: + * [Remove 'unique' field option in favor of array param type](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/8d60dcd0479b960857f87758bf02ddf6fdf44b47) + * [Remove 'required' field option in favor of union with undefined](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/e65f0e8bc8f1ea0b05472e630cebb784fe2ea525) + * [Explicitly serialize undefined parameter ranges](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/cb37fb5e82292e46eab76e96d364db25e2d21f67) +* [Set minimum Node version to 12](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/23bf2634dba4ec95955293f4e91545e340cea1eb) + +### Added +* [Allow configuration using config file](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/bbdd36b0dd38a49151c467f46d3bd2014933b820) + * [Allow package paths to be ignored](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/a6d47ce00ab8c3c5b0e70bcdc8cdf8f07e6c34d4) +* Improve TypeScript language support: + * [Support components defined within namespaces via export assignment](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/d5582d2126138643f88cf0398218e1eb9883a227) + * [Support imports for packages that have external @types packages](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/12996b70c2b2a3b82dbfe99dbceb943ea1294cf4) + * [Support type literals and type aliases](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/ff2fdc103cb6a658ac1741322686832e8cc88d96) + * [Generate param ranges with tuples and rest types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/348b80dcbb47d5888cd1ac8a724bc848209e16c1) + * [Generate param ranges with union and intersection types](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/7796c816295886a4702e8037f441fac9559891a6) +* Improve tag support: + * [Allow multiple @default values to be defined](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/6b0177210f7608b0d284da87cf40d432c5c4132b) + * [Fix @ symbols not being allowed in comment data](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/26e2f405db6d0cf6de5d3fd1e7d46681205e9e07) + * [Allow setting default JSON values](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/61e0b13bfaced9e9c8b2c36f3c89d588cf76f9b2) + * [Allow default IRI values to be relative](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/d400e1fc56aca4c52f194213a1090651604e8941) + * [Allow defaultNested tags to be added with typed values](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/0ec8fa9d6cf470965c0ce6ce148f65cbf751916c) + * [Keep structural param type information on overrides](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/b05cb60473ec839718c9a1fa3ac42ee670a21224) + * [Allow default values to be IRIs when wrapped in <>](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/7275824082cb180c9abe5f4f8084b48c4ee5e98f) +* [Add shorter param entries in type-scoped context when possible.](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3b21fb75448cac9288045ca12f330040cefa2a08) +* [Enable generation of multiple packages in bulk](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/86467d2b43dd1006aff937644afa51f7cdcb522d): This allows this generator to be used in monorepos +* [Add option to dump debug state](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/ae0b5278bb9d93f513f70fb5731d727817b46d97) +* [Allow constructor comment data inheritance from supers](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3527ceb4d8f8e0d259dffba0dacc393b011cd4c1) +* [Allow interface args to extend from other interfaces, Closes #73](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/b5724be7b30fb3d6a57f25bbe4e3fc534c9db4f5) +* [Also consider recursive deps when loading external modules](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/a6596e0b87600359be7b6daa04adda25066fc062) +* [Allow components from other packages to be re-exported](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/1ddb44afbf594973971829efcdcae7d1855950c8) + +### Fixed +* [Fix default values not being in an RDF list when needed](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/e9761232748ea7bb1d2a6e58664011a6092ec092) +* [Fix @list not being applied on optional arrays](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/078f78c9ed2bc33e27344d28307df4fd776eca57) +* [Fix crash when loading fields from super interface chains](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/3de032af5adef3a2a2c1bfcf1a350d4306be38b7) + +### Changed +* [Reduce unneeded logging](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/75ff04cb1f040e7e25bc1d3486bb946e0c37d364) +* [Ignore imports that fail](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/f73798f6b9bcd8d9d2ba35d9963d2869a783e8b0) +* [Allow components to be part of multiple modules](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/32350fa72830892adf27304619fad1b64e8b2eae) +* [Fix param range resources using @type instead of @id](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/1fbad2f8f91c91ce0528b85df690a1356fbd6ed0) + + +## [v2.6.1](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v2.6.0...v2.6.1) - 2021-09-29 + +### Fixed +* [Fix optional types not always being parsed correctly, Closes #74](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/commit/c95294a929452faed872838d5e8bbd2bcde13e3d) + ## [v2.6.0](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/compare/v2.5.0...v2.6.0) - 2021-07-20 diff --git a/README.md b/README.md index b38d0c8..448b4b5 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build status](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/workflows/CI/badge.svg)](https://github.com/LinkedSoftwareDependencies/Components-Generator.js/actions?query=workflow%3ACI) [![Coverage Status](https://coveralls.io/repos/github/LinkedSoftwareDependencies/Components-Generator.js/badge.svg?branch=master)](https://coveralls.io/github/LinkedSoftwareDependencies/Components-Generator.js?branch=master) [![npm version](https://badge.fury.io/js/componentsjs-generator.svg)](https://www.npmjs.com/package/componentsjs-generator) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5644902.svg)](https://doi.org/10.5281/zenodo.5644902) This is a tool to automatically generate `.jsonld` component files from TypeScript classes for the [Components.js](https://github.com/LinkedSoftwareDependencies/Components.js) dependency injection framework. @@ -90,10 +91,14 @@ When invoking `componentsjs-generator`, this tool will automatically generate `.jsonld` components files for all TypeScript files that are exported by the current package. +For monorepos, multiple package paths may be provided. + ```bash Generates component file for a package Usage: componentsjs-generator + Arguments: + path/to/package The directories of the packages to look in, defaults to working directory Options: -p path/to/package The directory of the package to look in, defaults to working directory -s lib Relative path to directory containing source files, defaults to 'lib' @@ -101,19 +106,42 @@ Usage: -e jsonld Extension for components files (without .), defaults to 'jsonld' -i ignore-classes.json Relative path to an optional file with class names to ignore -r prefix Optional custom JSON-LD module prefix + --lenient If unsupported language features must produce a warning instead of an error + --debugState If a 'componentsjs-generator-debug-state.json' file should be created with debug information --help Show information about this command - - Experimental options: - --typeScopedContexts If a type-scoped context for each component is to be generated with parameter name aliases ``` **Note:** This generator will read `.d.ts` files, so it is important that you invoke the TypeScript compiler (`tsc`) _before_ using this tool. +### Configuration files + +While options passed to the CLI tool will always take precedence, +it is possible to add a `.componentsjs-generator-config.json` file to your project to define your configuration. + +The following shows an example of the possible options: +```json +{ + "source": "lib", + "destination": "components", + "extension": "jsonld", + "ignorePackagePaths": ["path/to/package-ignored1", "path/to/package-ignored2"], + "ignoreComponents": ["Class1", "Class2"], + "logLevel": "info", + "modulePrefix": "myprefix", + "debugState": "true", + "hardErrorUnsupported": false +} +``` + +When invoking `componentsjs-generator`, the tool will look for `.componentsjs-generator-config.json` in the current working directory. +If it can not find one, it will recursively go look into the parent directories until it either finds one or is at the root. + ### Ignoring classes If you don't want components to be generated for certain classes, -then you can pass a JSON file to the `-i` option containing an array of class names to skip. +then you can either add it to the `ignoreComponents` array of the `.componentsjs-generator-config.json` file (as explained above), +or you can pass a JSON file to the `-i` option containing an array of class names to skip. For example, invoking `componentsjs-generator -i ignore-classes.json` will skip `BadClass` if the contents of `ignore-classes.json` are: ```json @@ -141,8 +169,8 @@ export class MyClass extends OtherClass { /** * @param paramA - My parameter */ - constructor(paramA: boolean, paramB: number) { - + constructor(paramA: boolean, paramB: number, paramC: string[]) { + } } ``` @@ -165,20 +193,24 @@ Component file: { "@id": "ex:MyFile#MyClass_paramA", "range": "xsd:boolean", - "comment": "My parameter", - "unique": true, - "required": true + "comment": "My parameter" }, { "@id": "ex:MyFile#MyClass_paramB", - "range": "xsd:integer", - "unique": true, - "required": true + "range": "xsd:integer" + }, + { + "@id": "ex:MyFile#MyClass_paramC", + "range": { + "@type": "ParameterRangeArray", + "parameterRangeValue": "xsd:integer" + } } ], "constructorArguments": [ { "@id": "ex:MyFile#MyClass_paramA" }, - { "@id": "ex:MyFile#MyClass_paramB" } + { "@id": "ex:MyFile#MyClass_paramB" }, + { "@id": "ex:MyFile#MyClass_paramC" } ] } ] @@ -189,29 +221,38 @@ Component file: Each argument in the constructor of the class must be one of the following: -* A primitive type such as `boolean, number, string`, which will be mapped to an [XSD type](https://componentsjs.readthedocs.io/en/latest/configuration/components/parameters/) +* A primitive type such as `boolean, number, string`, which will be mapped to an [XSD type](https://componentsjs.readthedocs.io/en/latest/configuration/components/parameters/) * Another class, which will be mapped to the component `@id`. -* A hash or interface containing key-value pairs where each value matches one of the possible options. Nesting is allowed. -* An array of any of the allowed types. - -Here is an example that showcases all of these options: +* A record or interface containing key-value pairs where each value matches one of the possible options. Nesting is allowed. +* Reference to a generic type that is defined on the class. +* An array, `keyof`, tuple, union, or intersection over any of the allowed types. + +Here is an example that showcases all of these options: ```typescript import {Logger} from "@comunica/core"; export class SampleActor { - constructor(args:HashArg, testArray:HashArg[], numberSample: number, componentExample: Logger) {} + constructor( + args: HashArg, + number: number, + component: Logger, + array: HashArg[], + complexComposition: (SomeClass & OtherClass) | string, + complexTuple: [ number, SomeClass, ...string[] ], + optional?: number, + ) {} } export interface HashArg { args: NestedHashArg; - arraySample: NestedHashArg[]; + array: NestedHashArg[]; } export interface NestedHashArg extends ExtendsTest { test: boolean; - componentTest: Logger; + component: Logger; } export interface ExtendsTest { - stringTest: String; + string: string; } -``` +``` ### Argument tags @@ -222,8 +263,18 @@ Using comment tags, arguments can be customized. | Tag | Action |---|--- | `@ignored` | This field will be ignored. -| `@default {}` | The `default` attribute of the parameter will be set to `` -| `@range {}` | The `range` attribute of the parameter will be set to ``. You can only use values that fit the type of field. Options: `json, boolean, int, integer, number, byte, long, float, decimal, double, string`. For example, if your field has the type `number`, you could explicitly mark it as a `float` by using `@range {float}`. See [the documentation](https://componentsjs.readthedocs.io/en/latest/configuration/components/parameters/). +| `@default {value}` | The `default` attribute of the parameter will be set to `value`. See section below for acceptable values. +| `@defaultNested {value} path_to_args` | When the given parameter accepts a nested object (child links delimited by `_`), the `default` attribute of this nested field will be set to `value`. See section below for acceptable values. +| `@range {type}` | The `range` attribute of the parameter will be set to `type`. You can only use values that fit the type of field. Options: `json, boolean, int, integer, number, byte, long, float, decimal, double, string`. For example, if your field has the type `number`, you could explicitly mark it as a `float` by using `@range {float}`. See [the documentation](https://componentsjs.readthedocs.io/en/latest/configuration/components/parameters/). + +##### Default values + +Default values accept a microsyntax, in which several types of values may be provided: + +* Literal values: `@default {abc}` +* IRI values: `@default {}` +* Blank-node-based instantiation: `@default {a }` +* IRI-based instantiation: `@default { a }` #### Examples @@ -235,7 +286,7 @@ export class MyActor { /** * @param myByte - This is an array of bytes @range {byte} * @param ignoredArg - @ignored - */ + */ constructor(myByte: number[], ignoredArg: string) { } @@ -250,9 +301,10 @@ Component file: "parameters": [ { "@id": "my-actor#TestClass#myByte", - "range": "xsd:byte", - "required": false, - "unique": false, + "range": { + "@type": "ParameterRangeArray", + "parameterRangeValue": "xsd:byte" + }, "comment": "This is an array of bytes" } ], @@ -274,7 +326,7 @@ export class MyActor { /** * @param myValue - Values will be passed as parsed JSON @range {json} * @param ignoredArg - @ignored - */ + */ constructor(myValue: any, ignoredArg: string) { } @@ -290,8 +342,6 @@ Component file: { "@id": "my-actor#TestClass#myValue", "range": "rdf:JSON", - "required": false, - "unique": false, "comment": "Values will be passed as parsed JSON" } ], @@ -314,7 +364,7 @@ When instantiating TestClass as follows, its JSON value will be passed directly "someKey": { "someOtherKey1": 1, "someOtherKey2": "abc" - } + } } } ``` @@ -335,7 +385,7 @@ export interface IActorBindingArgs { * @range {float} * @default {5.0} */ - floatField?: number; + floatField: number; } ``` @@ -348,8 +398,6 @@ Component file: { "@id": "my-actor#floatField", "range": "xsd:float", - "required": false, - "unique": true, "default": "5.0", "comment": "This field is very important" } diff --git a/bin/componentsjs-generator.ts b/bin/componentsjs-generator.ts index e2d6258..aa9f702 100755 --- a/bin/componentsjs-generator.ts +++ b/bin/componentsjs-generator.ts @@ -1,59 +1,58 @@ #!/usr/bin/env node -import * as fs from 'fs'; -import * as Path from 'path'; +import * as fs from 'node:fs'; import * as minimist from 'minimist'; -import { Generator } from '../lib/generate/Generator'; +import { GeneratorFactory } from '../lib/config/GeneratorFactory'; import { ResolutionContext } from '../lib/resolution/ResolutionContext'; +import { joinFilePath, normalizeFilePath } from '../lib/util/PathUtil'; function showHelp(): void { process.stderr.write(`Generates components files for TypeScript files in a package Usage: componentsjs-generator + Arguments: + path/to/package The directories of the packages to look in, defaults to working directory Options: - -p path/to/package The directory of the package to look in, defaults to working directory -s lib Relative path to directory containing source files, defaults to 'lib' -c components Relative path to directory that will contain components files, defaults to 'components' -e jsonld Extension for components files (without .), defaults to 'jsonld' -i ignore-classes.json Relative path to an optional file with class names to ignore -l info The logger level -r prefix Optional custom JSON-LD module prefix + --lenient If unsupported language features must produce a warning instead of an error + --debugState If a 'componentsjs-generator-debug-state.json' file should be created with debug information --help Show information about this command - - Experimental options: - --typeScopedContexts If a type-scoped context for each component is to be generated with parameter name aliases `); process.exit(1); } const args = minimist(process.argv.slice(2)); + +// TODO: remove in next major version +if (args.typeScopedContexts) { + process.stderr.write(`The flag '--typeScopedContexts' must not be used anymore, as this is default behaviour as of version 3.x\n`); + process.exit(1); +} + if (args.help) { showHelp(); } else { - const packageRootDirectory = Path.posix.join(process.cwd(), args.p || ''); - const generator = new Generator({ - resolutionContext: new ResolutionContext(), - pathDestination: { - packageRootDirectory, - originalPath: Path.posix.join(packageRootDirectory, args.s || 'lib'), - replacementPath: Path.posix.join(packageRootDirectory, args.c || 'components'), - }, - fileExtension: args.e || 'jsonld', - typeScopedContexts: args.typeScopedContexts, - logLevel: args.l || 'info', - prefix: args.r, - ignoreClasses: args.i ? - // eslint-disable-next-line no-sync - JSON.parse(fs.readFileSync(args.i, 'utf8')).reduce((acc: Record, entry: string) => { - acc[entry] = true; - return acc; - }, {}) : - [], - }); - generator - .generateComponents() + const packageRootDirectories = (args._.length > 0 ? args._ : [ '' ]) + .map(path => joinFilePath(normalizeFilePath(process.cwd()), path)) + .flatMap((path) => { + // Since path expansion does not work on Windows, we may receive wildcard paths, so let's expand those here + if (path.endsWith('*')) { + path = path.slice(0, -1); + // eslint-disable-next-line no-sync + return fs.readdirSync(path) + .map(subFile => joinFilePath(path, subFile)); + } + return path; + }); + new GeneratorFactory({ resolutionContext: new ResolutionContext() }) + .createGenerator(normalizeFilePath(process.cwd()), args, packageRootDirectories) + .then(generator => generator.generateComponents()) .catch((error: Error) => { process.stderr.write(`${error.message}\n`); process.exit(1); }); } - diff --git a/debug b/debug deleted file mode 100644 index a0eb262..0000000 --- a/debug +++ /dev/null @@ -1,136 +0,0 @@ -{ - "@context": [ - "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-init-sparql/^1.0.0/components/context.jsonld", - "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/core/^1.0.0/components/context.jsonld", - "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/bus-init/^1.0.0/components/context.jsonld" - ], - "@id": "npmd:@comunica/actor-init-sparql", - "components": [ - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql", - "requireElement": "ActorInitSparql", - "@type": "Class", - "comment": "A comunica SPARQL Init Actor.", - "parameters": [ - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorOptimizeQueryOperation", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorQueryOperation", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlParse", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlSerialize", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlSerializeMediaTypeCombiner", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorContextPreprocess", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorHttpInvalidate", - "required": true, - "unique": true, - "range": "cc:Mediator" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#logger", - "required": true, - "unique": true, - "range": "cc:Logger" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#queryString", - "required": false, - "unique": true, - "range": "xsd:string" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#defaultQueryInputFormat", - "required": false, - "unique": true, - "range": "xsd:string" - }, - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#context", - "required": false, - "unique": true, - "range": "xsd:string" - } - ], - "constructorArguments": [ - { - "@id": "npmd:@comunica/actor-init-sparql/ActorInitSparql#constructorArgumentsObject", - "extends": "cbi:Actor/Init/constructorArgumentsObject", - "fields": [ - { - "keyRaw": "mediatorOptimizeQueryOperation", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorOptimizeQueryOperation" - }, - { - "keyRaw": "mediatorQueryOperation", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorQueryOperation" - }, - { - "keyRaw": "mediatorSparqlParse", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlParse" - }, - { - "keyRaw": "mediatorSparqlSerialize", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlSerialize" - }, - { - "keyRaw": "mediatorSparqlSerializeMediaTypeCombiner", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorSparqlSerializeMediaTypeCombiner" - }, - { - "keyRaw": "mediatorContextPreprocess", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorContextPreprocess" - }, - { - "keyRaw": "mediatorHttpInvalidate", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#mediatorHttpInvalidate" - }, - { - "keyRaw": "logger", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#logger" - }, - { - "keyRaw": "queryString", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#queryString" - }, - { - "keyRaw": "defaultQueryInputFormat", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#defaultQueryInputFormat" - }, - { - "keyRaw": "context", - "value": "npmd:@comunica/actor-init-sparql/ActorInitSparql#context" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..40b572b --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,56 @@ +const config = require('@rubensworks/eslint-config'); + +module.exports = config([ + { + files: [ '**/*.ts' ], + languageOptions: { + parserOptions: { + tsconfigRootDir: __dirname, + project: [ './tsconfig.eslint.json' ], + }, + }, + }, + { + files: [ '**/*.ts' ], + rules: { + 'import/no-nodejs-modules': 'off', + 'ts/naming-convention': [ + 'error', + { + selector: 'interface', + format: [ 'PascalCase' ], + custom: { + regex: '^[A-Z]', + match: true, + }, + }, + ], + // TODO: check if we can enable the following + 'ts/no-require-imports': 'off', + 'ts/no-unsafe-assignment': 'off', + 'ts/no-unsafe-argument': 'off', + 'ts/no-unsafe-return': 'off', + }, + }, + { + // Specific rules for NodeJS-specific files + files: [ + '**/test/**/*.ts', + ], + rules: { + 'import/no-nodejs-modules': 'off', + 'unused-imports/no-unused-vars': 'off', + 'ts/no-require-imports': 'off', + 'ts/no-var-requires': 'off', + 'ts/no-extraneous-class': 'off', + // TODO: check if we can enable the following + 'node/no-path-concat': 'off', + }, + }, + { + // Files that do not require linting + ignores: [ + '**/file-invalid.d.ts', + ], + }, +]); diff --git a/index.ts b/index.ts deleted file mode 100644 index e7d6fcc..0000000 --- a/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './lib/generate/Generator'; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..3744bf3 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,31 @@ +import type { Config } from '@jest/types'; + +const config: Config.InitialOptions = { + collectCoverage: true, + coveragePathIgnorePatterns: [ + '/test/', + ], + coverageProvider: 'babel', + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + moduleFileExtensions: [ + 'ts', + 'js', + ], + testEnvironment: 'node', + testMatch: [ + '/test/**/*.test.ts', + '/packages/*/test/**/*-test.ts', + ], + transform: { + '\\.ts$': 'ts-jest', + }, +}; + +export default config; diff --git a/lib/config/FileConfigLoader.ts b/lib/config/FileConfigLoader.ts new file mode 100644 index 0000000..7f13539 --- /dev/null +++ b/lib/config/FileConfigLoader.ts @@ -0,0 +1,52 @@ +import type { ResolutionContext } from '../resolution/ResolutionContext'; +import { joinFilePath } from '../util/PathUtil'; +import type { GeneratorConfig } from './GeneratorConfig'; + +/** + * Loads the `.componentsjs-generator-config.json` config file from the file system. + */ +export class FileConfigLoader { + public static readonly DEFAULT_CONFIG_NAME = '.componentsjs-generator-config.json'; + + private readonly resolutionContext: ResolutionContext; + + public constructor(args: FileConfigLoaderArgs) { + this.resolutionContext = args.resolutionContext; + } + + /** + * Get the closest config file, starting from the current working directory and following parent directory links. + * @param cwd The current working directory + */ + public async getClosestConfigFile(cwd: string): Promise | undefined> { + for (const directory of this.getConsideredDirectories(cwd)) { + const configPath = joinFilePath(directory, FileConfigLoader.DEFAULT_CONFIG_NAME); + try { + const textContents = await this.resolutionContext.getFileContent(configPath); + return JSON.parse(textContents); + } catch { + // Ignore error + } + } + } + + /** + * All directories that need to be considered when looking for the config file. + * @param cwd The current working directory + */ + public getConsideredDirectories(cwd: string): string[] { + // Since Windows paths can have `/` or `\` depending on the operations done so far + // it is safest to split on both possible separators. + const sections: string[] = cwd.split(/[/\\]/u); + const paths: string[] = []; + for (let i = sections.length; i > 1; i--) { + // Slash is valid on both platforms and keeps results consistent + paths.push(sections.slice(0, i).join('/')); + } + return paths; + } +} + +export interface FileConfigLoaderArgs { + resolutionContext: ResolutionContext; +} diff --git a/lib/config/GeneratorConfig.ts b/lib/config/GeneratorConfig.ts new file mode 100644 index 0000000..001e164 --- /dev/null +++ b/lib/config/GeneratorConfig.ts @@ -0,0 +1,44 @@ +/** + * Represents a generator config + */ +export interface GeneratorConfig { + /** + * Relative path to directory containing source files, defaults to 'lib'. + */ + source: string; + /** + * Relative path to directory that will contain components files, defaults to 'components'. + */ + destination: string; + /** + * Extension for components files (without .), defaults to 'jsonld'. + */ + extension: string; + /** + * Paths to packages that should be excluded from generation. + * This can be used in monorepos where not all packages require component generation. + */ + ignorePackagePaths: string[]; + /** + * Relative path to an optional file with class names to ignore. + */ + ignoreComponents: string[]; + /** + * The logger level, defaults to 'info'. + */ + logLevel: string; + /** + * Optional custom JSON-LD module prefix, defaults to an auto-generated value. + * May also be a mapping from package name to prefix. + */ + modulePrefix: string | undefined | Record; + /** + * If a 'componentsjs-generator-debug-state.json' file should be created with debug information. + */ + debugState: boolean; + /** + * If unsupported language features should cause a hard crash. + * Otherwise they are emitted as warning instead of error. + */ + hardErrorUnsupported: boolean; +} diff --git a/lib/config/GeneratorFactory.ts b/lib/config/GeneratorFactory.ts new file mode 100644 index 0000000..51122a8 --- /dev/null +++ b/lib/config/GeneratorFactory.ts @@ -0,0 +1,109 @@ +import type { LogLevel } from 'componentsjs'; +import { Generator } from '../generate/Generator'; +import type { ResolutionContext } from '../resolution/ResolutionContext'; +import { joinFilePath } from '../util/PathUtil'; +import { FileConfigLoader } from './FileConfigLoader'; +import type { GeneratorConfig } from './GeneratorConfig'; + +/** + * Constructs a {@link Generator} with the proper configs. + * + * It will consider the following configs in order of priority: + * * CLI arguments + * * .componentsjs-generator-config.json + * * Default values + */ +export class GeneratorFactory { + private readonly resolutionContext: ResolutionContext; + + public constructor(args: GeneratorFactoryArgs) { + this.resolutionContext = args.resolutionContext; + } + + public async createGenerator( + cwd: string, + cliArgs: Record, + packageRootDirectories: string[], + ): Promise { + const config = await this.getConfig(cwd, cliArgs); + return new Generator({ + resolutionContext: this.resolutionContext, + pathDestinations: packageRootDirectories + .filter(packageRootDirectory => !config.ignorePackagePaths + .some(ignorePackagePath => packageRootDirectory.startsWith(joinFilePath(cwd, ignorePackagePath)))) + .map(packageRootDirectory => ({ + packageRootDirectory, + originalPath: joinFilePath(packageRootDirectory, config.source), + replacementPath: joinFilePath(packageRootDirectory, config.destination), + })), + fileExtension: config.extension, + logLevel: config.logLevel, + debugState: config.debugState, + prefixes: config.modulePrefix, + ignoreClasses: config.ignoreComponents.reduce((acc: Record, entry: string) => { + acc[entry] = true; + return acc; + }, {}), + hardErrorUnsupported: config.hardErrorUnsupported, + }); + } + + public async getConfig(cwd: string, cliArgs: Record): Promise { + const defaultConfig = this.getDefaultConfig(); + const fileConfig = await new FileConfigLoader({ resolutionContext: this.resolutionContext }) + .getClosestConfigFile(cwd); + const cliConfig = await this.getCliConfig(cliArgs); + return { + ...defaultConfig, + ...fileConfig, + ...cliConfig, + }; + } + + public getDefaultConfig(): GeneratorConfig { + return { + source: 'lib', + destination: 'components', + extension: 'jsonld', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: undefined, + debugState: false, + hardErrorUnsupported: true, + }; + } + + public async getCliConfig(cliArgs: Record): Promise> { + const config: Partial = {}; + if (cliArgs.s) { + config.source = cliArgs.s; + } + if (cliArgs.c) { + config.destination = cliArgs.c; + } + if (cliArgs.e) { + config.extension = cliArgs.e; + } + if (cliArgs.i) { + config.ignoreComponents = JSON.parse(await this.resolutionContext.getFileContent(cliArgs.i)); + } + if (cliArgs.l) { + config.logLevel = cliArgs.l; + } + if (cliArgs.r) { + config.modulePrefix = cliArgs.r; + } + if (cliArgs.debugState) { + config.debugState = cliArgs.debugState; + } + if (cliArgs.lenient) { + config.hardErrorUnsupported = false; + } + return config; + } +} + +export interface GeneratorFactoryArgs { + resolutionContext: ResolutionContext; +} diff --git a/lib/generate/Generator.ts b/lib/generate/Generator.ts index cdfbff8..3a8ebcb 100644 --- a/lib/generate/Generator.ts +++ b/lib/generate/Generator.ts @@ -2,11 +2,17 @@ import { ComponentsManagerBuilder } from 'componentsjs/lib/loading/ComponentsMan import { PrefetchedDocumentLoader } from 'componentsjs/lib/rdf/PrefetchedDocumentLoader'; import type { LogLevel } from 'componentsjs/lib/util/LogLevel'; import { ContextParser } from 'jsonld-context-parser'; +import { BulkPackageMetadataLoader } from '../parse/BulkPackageMetadataLoader'; import { ClassFinder } from '../parse/ClassFinder'; import { ClassIndexer } from '../parse/ClassIndexer'; import { ClassLoader } from '../parse/ClassLoader'; +import { CommentLoader } from '../parse/CommentLoader'; import { ConstructorLoader } from '../parse/ConstructorLoader'; +import { GenericsLoader } from '../parse/GenericsLoader'; +import { MemberLoader } from '../parse/MemberLoader'; +import type { PackageMetadata } from '../parse/PackageMetadataLoader'; import { PackageMetadataLoader } from '../parse/PackageMetadataLoader'; +import { ParameterLoader } from '../parse/ParameterLoader'; import { ParameterResolver } from '../parse/ParameterResolver'; import { ExternalModulesLoader } from '../resolution/ExternalModulesLoader'; import type { ResolutionContext } from '../resolution/ResolutionContext'; @@ -20,98 +26,142 @@ import { ContextConstructor } from '../serialize/ContextConstructor'; */ export class Generator { private readonly resolutionContext: ResolutionContext; - private readonly pathDestination: PathDestinationDefinition; + private readonly pathDestinations: PathDestinationDefinition[]; private readonly fileExtension: string; private readonly ignoreClasses: Record; - private readonly typeScopedContexts: boolean; private readonly logLevel: LogLevel; - private readonly prefix?: string; + private readonly debugState: boolean; + private readonly prefixes?: string | Record; + private readonly hardErrorUnsupported: boolean; public constructor(args: GeneratorArgs) { this.resolutionContext = args.resolutionContext; - this.pathDestination = args.pathDestination; + this.pathDestinations = args.pathDestinations; this.fileExtension = args.fileExtension; this.ignoreClasses = args.ignoreClasses; - this.typeScopedContexts = args.typeScopedContexts; this.logLevel = args.logLevel; - this.prefix = args.prefix; + this.debugState = args.debugState; + this.prefixes = args.prefixes; + this.hardErrorUnsupported = args.hardErrorUnsupported; } public async generateComponents(): Promise { const logger = ComponentsManagerBuilder.createLogger(this.logLevel); - // Load package metadata - const packageMetadata = await new PackageMetadataLoader({ resolutionContext: this.resolutionContext, - prefix: this.prefix }) - .load(this.pathDestination.packageRootDirectory); - - const classLoader = new ClassLoader({ resolutionContext: this.resolutionContext, logger }); + const commentLoader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext: this.resolutionContext, logger, commentLoader }); const classFinder = new ClassFinder({ classLoader }); const classIndexer = new ClassIndexer({ classLoader, classFinder, ignoreClasses: this.ignoreClasses, logger }); + const parameterLoader = new ParameterLoader({ + commentLoader, + hardErrorUnsupported: this.hardErrorUnsupported, + logger, + }); + const parameterResolver = new ParameterResolver({ + classLoader, + parameterLoader, + ignoreClasses: this.ignoreClasses, + }); + + // Preload package metadata for all provided paths + const { packageMetadatas, pathMetadatas } = await new BulkPackageMetadataLoader({ + packageMetadataLoader: new PackageMetadataLoader({ + resolutionContext: this.resolutionContext, + prefixes: this.prefixes, + }), + logger, + }).load(this.pathDestinations); - // Find all relevant classes - const packageExports = await classFinder.getPackageExports(packageMetadata.name, packageMetadata.typesPath); - const classAndInterfaceIndex = await classIndexer.createIndex(packageExports); + logger.info(`Generating components for ${Object.keys(packageMetadatas).length} package${Object.keys(packageMetadatas).length > 1 ? 's' : ''}`); - // Load constructor data - const constructorsUnresolved = new ConstructorLoader().getConstructors(classAndInterfaceIndex); - const constructors = await new ParameterResolver({ classLoader, ignoreClasses: this.ignoreClasses }) - .resolveAllConstructorParameters(constructorsUnresolved, classAndInterfaceIndex); + // Generate components for all provided paths + for (const pathDestination of this.pathDestinations) { + // Load package metadata + const packageMetadata: PackageMetadata = pathMetadatas[pathDestination.packageRootDirectory]; + if (!packageMetadata) { + continue; + } - // Load external components - const externalModulesLoader = new ExternalModulesLoader({ - pathDestination: this.pathDestination, - packageMetadata, - logger, - }); - const externalPackages = externalModulesLoader.findExternalPackages(classAndInterfaceIndex, constructors); - const externalComponents = await externalModulesLoader.loadExternalComponents(require, externalPackages); + // Find all relevant classes + const packageExports = await classFinder.getPackageExports(packageMetadata.name, packageMetadata.typesPath); + const classAndInterfaceIndex = await classIndexer.createIndex(packageExports); - // Create components - const contextConstructor = new ContextConstructor({ - packageMetadata, - typeScopedContexts: this.typeScopedContexts, - }); - const componentConstructor = new ComponentConstructor({ - packageMetadata, - contextConstructor, - pathDestination: this.pathDestination, - classAndInterfaceIndex, - classConstructors: constructors, - externalComponents, - contextParser: new ContextParser({ - documentLoader: new PrefetchedDocumentLoader({ - contexts: externalComponents.moduleState.contexts, - logger, + // Load constructor data + const constructorsUnresolved = new ConstructorLoader({ parameterLoader }).getConstructors(classAndInterfaceIndex); + const constructors = await parameterResolver.resolveAllConstructorParameters(constructorsUnresolved); + + // Load generics data + const genericsUnresolved = new GenericsLoader({ parameterLoader }).getGenerics(classAndInterfaceIndex); + const generics = await parameterResolver.resolveAllGenericTypeParameterData(genericsUnresolved); + + // Load extensions data + const extensionsUnresolved = parameterLoader.loadAllExtensionData(classAndInterfaceIndex); + const extensions = await parameterResolver.resolveAllExtensionData(extensionsUnresolved, classAndInterfaceIndex); + + // Load members data + const membersUnresolved = new MemberLoader({ parameterLoader }).getMembers(classAndInterfaceIndex); + const members = await parameterResolver.resolveAllMemberParameterData(membersUnresolved); + + // Load external components + const externalModulesLoader = new ExternalModulesLoader({ + pathDestination, + packageMetadata, + packagesBeingGenerated: packageMetadatas, + resolutionContext: this.resolutionContext, + debugState: this.debugState, + logger, + }); + const externalPackages = externalModulesLoader.findExternalPackages(classAndInterfaceIndex, constructors); + const externalComponents = await externalModulesLoader.loadExternalComponents(require, externalPackages); + + // Create components + const contextConstructor = new ContextConstructor({ packageMetadata }); + const componentConstructor = new ComponentConstructor({ + packageMetadata, + fileExtension: this.fileExtension, + contextConstructor, + pathDestination, + classAndInterfaceIndex, + classConstructors: constructors, + classGenerics: generics, + classExtensions: extensions, + classMembers: members, + externalComponents, + contextParser: new ContextParser({ + documentLoader: new PrefetchedDocumentLoader({ + contexts: externalComponents.moduleState.contexts, + logger, + }), + skipValidation: true, }), - skipValidation: true, - }), - }); - const components = await componentConstructor.constructComponents(); - const componentsIndex = await componentConstructor.constructComponentsIndex(components, this.fileExtension); - - // Serialize components - const componentSerializer = new ComponentSerializer({ - resolutionContext: this.resolutionContext, - pathDestination: this.pathDestination, - fileExtension: this.fileExtension, - indentation: ' ', - }); - await componentSerializer.serializeComponents(components); - await componentSerializer.serializeComponentsIndex(componentsIndex); + }); + const components = await componentConstructor.constructComponents(); + const componentsIndex = await componentConstructor.constructComponentsIndex(components); + + // Serialize components + const componentSerializer = new ComponentSerializer({ + resolutionContext: this.resolutionContext, + pathDestination, + fileExtension: this.fileExtension, + indentation: ' ', + }); + await componentSerializer.serializeComponents(components); + await componentSerializer.serializeComponentsIndex(componentsIndex); - // Serialize context - const context = contextConstructor.constructContext(components); - await componentSerializer.serializeContext(context); + // Serialize context + const context = contextConstructor.constructContext(components); + await componentSerializer.serializeContext(context); + } } } export interface GeneratorArgs { resolutionContext: ResolutionContext; - pathDestination: PathDestinationDefinition; + pathDestinations: PathDestinationDefinition[]; fileExtension: string; ignoreClasses: Record; - typeScopedContexts: boolean; logLevel: LogLevel; - prefix?: string; + debugState: boolean; + prefixes?: string | Record; + hardErrorUnsupported: boolean; } diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 0000000..f9ec371 --- /dev/null +++ b/lib/index.ts @@ -0,0 +1 @@ +export * from './generate/Generator'; diff --git a/lib/parse/BulkPackageMetadataLoader.ts b/lib/parse/BulkPackageMetadataLoader.ts new file mode 100644 index 0000000..244464d --- /dev/null +++ b/lib/parse/BulkPackageMetadataLoader.ts @@ -0,0 +1,74 @@ +import { PrefetchedDocumentLoader } from 'componentsjs'; +import { ContextParser } from 'jsonld-context-parser'; +import type { Logger } from 'winston'; +import type { PackageMetadataScope } from '../resolution/ExternalModulesLoader'; +import type { PathDestinationDefinition } from '../serialize/ComponentConstructor'; +import { ContextConstructor } from '../serialize/ContextConstructor'; +import type { PackageMetadata, PackageMetadataLoader } from './PackageMetadataLoader'; + +/** + * Load metadata from multiple packages in bulk. + */ +export class BulkPackageMetadataLoader { + private readonly packageMetadataLoader: PackageMetadataLoader; + private readonly logger: Logger; + + public constructor(args: BulkPackageMetadataLoaderArgs) { + this.packageMetadataLoader = args.packageMetadataLoader; + this.logger = args.logger; + } + + /** + * Load the metadata from the given packages. + * @param pathDestinations Package paths. + */ + public async load(pathDestinations: PathDestinationDefinition[]): Promise { + const packageMetadatas: Record = {}; + const pathMetadatas: Record = {}; + const minimalContextParser = new ContextParser({ + documentLoader: new PrefetchedDocumentLoader({ + contexts: {}, + logger: this.logger, + }), + skipValidation: true, + }); + + for (const pathDestination of pathDestinations) { + let packageMetadata: PackageMetadata; + try { + // Load package metadata + packageMetadata = await this.packageMetadataLoader.load(pathDestination.packageRootDirectory); + const contextConstructor = new ContextConstructor({ packageMetadata }); + + // Save the metadata for later use + packageMetadatas[packageMetadata.name] = { + packageMetadata, + pathDestination, + minimalContext: await minimalContextParser.parse(contextConstructor.constructContext()), + }; + pathMetadatas[pathDestination.packageRootDirectory] = packageMetadata; + } catch (error: unknown) { + // Skip invalid packages + this.logger.warn(`Skipped generating invalid package at "${pathDestination.packageRootDirectory}": ${( error).message}`); + } + } + + return { packageMetadatas, pathMetadatas }; + } +} + +export interface BulkPackageMetadataLoaderArgs { + packageMetadataLoader: PackageMetadataLoader; + logger: Logger; +} + +export interface BulkPackageMetadataOutput { + /** + * Maps package name to scoped package metadata. + */ + packageMetadatas: Record; + /** + * Maps package root path to package metadata. + */ + pathMetadatas: Record; +} diff --git a/lib/parse/ClassFinder.ts b/lib/parse/ClassFinder.ts index b94308e..1a04877 100644 --- a/lib/parse/ClassFinder.ts +++ b/lib/parse/ClassFinder.ts @@ -42,6 +42,7 @@ export class ClassFinder { Promise<{ named: ClassIndex; unnamed: { packageName: string; fileName: string }[] }> { // Load the elements of the class const { + resolvedPath, exportedClasses, exportedInterfaces, exportedImportedElements, @@ -52,22 +53,28 @@ export class ClassFinder { importedElements, } = await this.classLoader.loadClassElements(packageName, fileName); const exportDefinitions: - { named: ClassIndex; unnamed: { packageName: string; fileName: string }[] } = - { named: {}, unnamed: []}; + { + named: ClassIndex; + unnamed: { packageName: string; fileName: string; fileNameReferenced: string }[]; + } = { named: {}, unnamed: []}; // Get all named exports for (const localName in exportedClasses) { exportDefinitions.named[localName] = { packageName, localName, - fileName, + qualifiedPath: undefined, + fileName: resolvedPath, + fileNameReferenced: resolvedPath, }; } for (const localName in exportedInterfaces) { exportDefinitions.named[localName] = { packageName, localName, - fileName, + qualifiedPath: undefined, + fileName: resolvedPath, + fileNameReferenced: resolvedPath, }; } @@ -76,7 +83,9 @@ export class ClassFinder { exportDefinitions.named[exportedName] = { packageName, localName, + qualifiedPath: undefined, fileName: importedFileName, + fileNameReferenced: resolvedPath, }; } @@ -89,7 +98,9 @@ export class ClassFinder { exportDefinitions.named[exportedName] = { packageName, localName, - fileName, + qualifiedPath: undefined, + fileName: resolvedPath, + fileNameReferenced: resolvedPath, }; break; } @@ -99,7 +110,9 @@ export class ClassFinder { exportDefinitions.named[exportedName] = { packageName, localName, - fileName, + qualifiedPath: undefined, + fileName: resolvedPath, + fileNameReferenced: resolvedPath, }; break; } diff --git a/lib/parse/ClassIndex.ts b/lib/parse/ClassIndex.ts index 3860b16..7a83b7b 100644 --- a/lib/parse/ClassIndex.ts +++ b/lib/parse/ClassIndex.ts @@ -1,5 +1,4 @@ -import type { ClassDeclaration, TSInterfaceDeclaration, TypeNode } from '@typescript-eslint/types/dist/ts-estree'; -import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; +import type { AST, TSESTreeOptions, TSESTree } from '@typescript-eslint/typescript-estree'; /** * A collection of classes, with exported name as key. @@ -14,14 +13,23 @@ export interface ClassReference { packageName: string; // The name of the class within the file. localName: string; + // Qualified path to the class. + qualifiedPath?: string[]; // The name of the file the class is defined in. fileName: string; + // The first name of the file this class was referenced from, in a chain of imports/exports (in top-down order) + fileNameReferenced: string; } /** * A loaded reference. */ -export type ClassReferenceLoaded = ClassLoaded | InterfaceLoaded; +export type ClassReferenceLoaded = ClassLoaded | InterfaceLoaded | TypeLoaded | EnumLoaded; + +/** + * A loaded reference without type aliases and enums. + */ +export type ClassReferenceLoadedClassOrInterface = ClassLoaded | InterfaceLoaded; /** * A loaded class with a full class declaration. @@ -33,13 +41,13 @@ export interface ClassLoaded extends ClassReference { // The name of the file the class is defined in. fileName: string; // The loaded class declaration. - declaration: ClassDeclaration; + declaration: TSESTree.ClassDeclaration; // The full AST the class was present in. ast: AST; // A super class reference if the class has one - superClass?: ClassLoaded; + superClass?: GenericallyTyped; // Interface or (abstract) class references if the class implements them - implementsInterfaces?: ClassReferenceLoaded[]; + implementsInterfaces?: GenericallyTyped[]; // If this class is an abstract class that can not be instantiated directly abstract?: boolean; // The tsdoc comment of this class @@ -51,7 +59,17 @@ export interface ClassLoaded extends ClassReference { /** * A hash of generic type name to its properties. */ -export type GenericTypes = Record; +export type GenericTypes = Record; + +/** + * Something (like a class or interface) that may have generic types assigned to it as instantiation. + */ +export interface GenericallyTyped { + // The typed value + value: T; + // The generic types of this value + genericTypeInstantiations?: TSESTree.TSTypeParameterInstantiation; +} /** * A loaded interface with a full interface declaration. @@ -63,13 +81,57 @@ export interface InterfaceLoaded extends ClassReference { // The name of the file the interface is defined in. fileName: string; // The loaded interface declaration. - declaration: TSInterfaceDeclaration; + declaration: TSESTree.TSInterfaceDeclaration; // The full AST the interface was present in. ast: AST; // Super interface references if the interface has them - superInterfaces?: InterfaceLoaded[]; + superInterfaces?: GenericallyTyped[]; // The tsdoc comment of this class comment?: string; // The generic types of this class generics: GenericTypes; } + +/** + * A member field of a class or interface. + */ +export interface MemberField { + name: string; + range: TSESTree.TypeNode | undefined; +} + +/** + * A loaded type alias with a full type declaration. + */ +export interface TypeLoaded extends ClassReference { + type: 'type'; + // The name of the interface within the file. + localName: string; + // The name of the file the interface is defined in. + fileName: string; + // The loaded type declaration. + declaration: TSESTree.TSTypeAliasDeclaration; + // The full AST the interface was present in. + ast: AST; + // The tsdoc comment of this class + comment?: string; + // The generic types of this class + generics: GenericTypes; +} + +/** + * A loaded enum with a full type declaration. + */ +export interface EnumLoaded extends ClassReference { + type: 'enum'; + // The name of the interface within the file. + localName: string; + // The name of the file the interface is defined in. + fileName: string; + // The loaded enum declaration. + declaration: TSESTree.TSEnumDeclaration; + // The full AST the interface was present in. + ast: AST; + // The tsdoc comment of this class + comment?: string; +} diff --git a/lib/parse/ClassIndexer.ts b/lib/parse/ClassIndexer.ts index a14b0c8..11ae549 100644 --- a/lib/parse/ClassIndexer.ts +++ b/lib/parse/ClassIndexer.ts @@ -3,7 +3,15 @@ */ import type { Logger } from 'winston'; import type { ClassFinder } from './ClassFinder'; -import type { ClassIndex, ClassReference, ClassReferenceLoaded, InterfaceLoaded } from './ClassIndex'; +import type { + ClassIndex, + ClassReference, + ClassReferenceLoaded, + ClassReferenceLoadedClassOrInterface, + InterfaceLoaded, + GenericallyTyped, +} from './ClassIndex'; + import type { ClassLoader } from './ClassLoader'; export class ClassIndexer { @@ -23,8 +31,10 @@ export class ClassIndexer { * Load all class references in the given class index. * @param classReferences An index of class references. */ - public async createIndex(classReferences: ClassIndex): Promise> { - const classIndex: ClassIndex = {}; + public async createIndex( + classReferences: ClassIndex, + ): Promise> { + const classIndex: ClassIndex = {}; for (const [ className, classReference ] of Object.entries(classReferences)) { if (!(className in this.ignoreClasses)) { @@ -40,77 +50,95 @@ export class ClassIndexer { * such as its declaration and loaded super class referenced. * @param classReference The reference to a class or interface. */ - public async loadClassChain(classReference: ClassReference): Promise { + public async loadClassChain(classReference: ClassReference): Promise { // Load the class declaration const classReferenceLoaded: ClassReferenceLoaded = await this.classLoader - .loadClassDeclaration(classReference, true); + .loadClassDeclaration(classReference, true, false); if (classReferenceLoaded.type === 'class') { // If the class has a super class, load it recursively - const superClassName = this.classLoader.getSuperClassName(classReferenceLoaded.declaration, - classReferenceLoaded.fileName); - if (superClassName && !(superClassName in this.ignoreClasses)) { + const superClassName = this.classLoader + .getSuperClassName(classReferenceLoaded.declaration, classReferenceLoaded.fileName); + if (superClassName && !(superClassName.value in this.ignoreClasses)) { let superClassLoaded; try { superClassLoaded = await this.loadClassChain({ packageName: classReferenceLoaded.packageName, - localName: superClassName, + localName: superClassName.value, + qualifiedPath: classReferenceLoaded.qualifiedPath, fileName: classReferenceLoaded.fileName, + fileNameReferenced: classReferenceLoaded.fileNameReferenced, }); } catch (error: unknown) { - throw new Error(`Failed to load super class ${superClassName} of ${classReference.localName} in ${classReference.fileName}:\n${(error).message}`); + throw new Error(`Failed to load super class ${superClassName.value} of ${classReference.localName} in ${classReference.fileName}:\n${(error).message}`); } if (superClassLoaded.type !== 'class') { - throw new Error(`Detected non-class ${superClassName} extending from a class ${classReference.localName} in ${classReference.fileName}`); + throw new Error(`Detected non-class ${superClassName.value} extending from a class ${classReference.localName} in ${classReference.fileName}`); } - classReferenceLoaded.superClass = superClassLoaded; + classReferenceLoaded.superClass = { + value: superClassLoaded, + genericTypeInstantiations: superClassName.genericTypeInstantiations, + }; } // If the class implements interfaces, load them - const interfaceNames = this.classLoader.getClassInterfaceNames(classReferenceLoaded.declaration, - classReferenceLoaded.fileName); - classReferenceLoaded.implementsInterfaces = (await Promise.all(interfaceNames - .filter(interfaceName => !(interfaceName in this.ignoreClasses)) - .map(async interfaceName => { - let interfaceOrClassLoaded; - try { - interfaceOrClassLoaded = await this.classLoader.loadClassDeclaration({ - packageName: classReferenceLoaded.packageName, - localName: interfaceName, - fileName: classReferenceLoaded.fileName, - }, true); - } catch (error: unknown) { - // Ignore interfaces that we don't understand - this.logger.debug(`Ignored interface ${interfaceName} implemented by ${classReference.localName} in ${classReference.fileName}:\n${( error).message}`); - return; - } - return interfaceOrClassLoaded; - }))) - .filter(iface => Boolean(iface)); + const interfaceNames = this.classLoader + .getClassInterfaceNames(classReferenceLoaded.declaration, classReferenceLoaded.fileName); + classReferenceLoaded.implementsInterfaces = []> ( + await Promise + .all(interfaceNames + .filter(interfaceName => !(interfaceName.value in this.ignoreClasses)) + .map(async(interfaceName) => { + let interfaceOrClassLoaded; + try { + interfaceOrClassLoaded = await this.classLoader.loadClassDeclaration({ + packageName: classReferenceLoaded.packageName, + localName: interfaceName.value, + qualifiedPath: classReferenceLoaded.qualifiedPath, + fileName: classReferenceLoaded.fileName, + fileNameReferenced: classReferenceLoaded.fileNameReferenced, + }, true, false); + } catch (error: unknown) { + // Ignore interfaces that we don't understand + this.logger.debug(`Ignored interface ${interfaceName.value} implemented by ${classReference.localName} in ${classReference.fileName}:\n${( error).message}`); + return; + } + return { + value: interfaceOrClassLoaded, + genericTypeInstantiations: interfaceName.genericTypeInstantiations, + }; + }))) + .filter(Boolean); } else { const superInterfaceNames = this.classLoader .getSuperInterfaceNames(classReferenceLoaded.declaration, classReferenceLoaded.fileName); - classReferenceLoaded.superInterfaces = (await Promise.all(superInterfaceNames - .filter(interfaceName => !(interfaceName in this.ignoreClasses)) - .map(async interfaceName => { - let superInterface; - try { - superInterface = await this.loadClassChain({ - packageName: classReferenceLoaded.packageName, - localName: interfaceName, - fileName: classReferenceLoaded.fileName, - }); - } catch (error: unknown) { + classReferenceLoaded.superInterfaces = []> (await Promise + .all(superInterfaceNames + .filter(interfaceName => !(interfaceName.value in this.ignoreClasses)) + .map(async(interfaceName) => { + let superInterface; + try { + superInterface = await this.loadClassChain({ + packageName: classReferenceLoaded.packageName, + localName: interfaceName.value, + qualifiedPath: classReferenceLoaded.qualifiedPath, + fileName: classReferenceLoaded.fileName, + fileNameReferenced: classReferenceLoaded.fileNameReferenced, + }); + } catch (error: unknown) { // Ignore interfaces that we don't understand - this.logger.debug(`Ignored interface ${interfaceName} extended by ${classReference.localName} in ${classReference.fileName}:\n${( error).message}`); - return; - } - if (superInterface.type !== 'interface') { - throw new Error(`Detected non-interface ${classReferenceLoaded.localName} extending from a class ${interfaceName} in ${classReference.fileName}`); - } - return superInterface; - }))) - .filter(iface => Boolean(iface)); + this.logger.debug(`Ignored interface ${interfaceName.value} extended by ${classReference.localName} in ${classReference.fileName}:\n${( error).message}`); + return; + } + if (superInterface.type !== 'interface') { + throw new Error(`Detected non-interface ${classReferenceLoaded.localName} extending from a class ${interfaceName.value} in ${classReference.fileName}`); + } + return { + value: superInterface, + genericTypeInstantiations: interfaceName.genericTypeInstantiations, + }; + }))) + .filter(Boolean); } return classReferenceLoaded; diff --git a/lib/parse/ClassLoader.ts b/lib/parse/ClassLoader.ts index 5b6513d..92958e7 100644 --- a/lib/parse/ClassLoader.ts +++ b/lib/parse/ClassLoader.ts @@ -1,11 +1,19 @@ -import * as Path from 'path'; -import type { ClassDeclaration, TSInterfaceDeclaration } from '@typescript-eslint/types/dist/ts-estree'; -import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; +import type { AST, TSESTreeOptions, TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; import type { Logger } from 'winston'; import type { ResolutionContext } from '../resolution/ResolutionContext'; -import type { ClassLoaded, ClassReference, ClassReferenceLoaded, GenericTypes, InterfaceLoaded } from './ClassIndex'; -import { CommentLoader } from './CommentLoader'; +import { filePathDirName, joinFilePath } from '../util/PathUtil'; +import type { + ClassLoaded, + ClassReference, + ClassReferenceLoaded, + EnumLoaded, + GenericTypes, + InterfaceLoaded, + TypeLoaded, + GenericallyTyped, +} from './ClassIndex'; +import type { CommentLoader } from './CommentLoader'; /** * Loads typescript classes from class references. @@ -13,10 +21,12 @@ import { CommentLoader } from './CommentLoader'; export class ClassLoader { private readonly resolutionContext: ResolutionContext; private readonly logger: Logger; + private readonly commentLoader: CommentLoader; public constructor(args: ClassLoaderArgs) { this.resolutionContext = args.resolutionContext; this.logger = args.logger; + this.commentLoader = args.commentLoader; } /** @@ -25,13 +35,19 @@ export class ClassLoader { * @param declaration A class declaration. * @param fileName The file name of the current class. */ - public getSuperClassName(declaration: ClassDeclaration, fileName: string): string | undefined { + public getSuperClassName( + declaration: TSESTree.ClassDeclaration, + fileName: string, + ): GenericallyTyped | undefined { if (!declaration.superClass) { return; } if (declaration.superClass.type === AST_NODE_TYPES.Identifier) { // Extensions in the form of `class A extends B` - return declaration.superClass.name; + return { + value: declaration.superClass.name, + genericTypeInstantiations: declaration.superTypeArguments, + }; } if (declaration.superClass.type === AST_NODE_TYPES.MemberExpression && declaration.superClass.property.type === AST_NODE_TYPES.Identifier && @@ -46,21 +62,27 @@ export class ClassLoader { * Find the super interfaces of the given interface. * Throws an error for interface definitions that could not be interpreted. * @param declaration An interface declaration. - * @param fileName The file name of the current class. + * @param _fileName The file name of the current class. */ - public getSuperInterfaceNames(declaration: TSInterfaceDeclaration, fileName: string): string[] { - return (declaration.extends || []) + public getSuperInterfaceNames( + declaration: TSESTree.TSInterfaceDeclaration, + _fileName: string, + ): GenericallyTyped[] { + return []> declaration.extends // eslint-disable-next-line array-callback-return - .map(extendsExpression => { + .map((extendsExpression) => { if (extendsExpression.type === AST_NODE_TYPES.TSInterfaceHeritage && extendsExpression.expression.type === AST_NODE_TYPES.Identifier) { // Extensions in the form of `interface A extends B` - return extendsExpression.expression.name; + return { + value: extendsExpression.expression.name, + genericTypeInstantiations: extendsExpression.typeArguments, + }; } // Ignore interfaces that we don't understand this.logger.debug(`Ignored an interface expression of unknown type ${extendsExpression.expression.type} on ${declaration.id.name}`); }) - .filter(iface => Boolean(iface)); + .filter(Boolean); } /** @@ -68,14 +90,20 @@ export class ClassLoader { * @param declaration A class declaration. * @param fileName The file name of the current class. */ - public getClassInterfaceNames(declaration: ClassDeclaration, fileName: string): string[] { - const interfaceNames = []; + public getClassInterfaceNames( + declaration: TSESTree.ClassDeclaration, + fileName: string, + ): GenericallyTyped[] { + const interfaceNames: GenericallyTyped[] = []; if (declaration.implements) { for (const implement of declaration.implements) { if (implement.expression.type !== AST_NODE_TYPES.Identifier) { throw new Error(`Could not interpret the implements type on a class in ${fileName} on line ${implement.expression.loc.start.line} column ${implement.expression.loc.start.column}`); } - interfaceNames.push(implement.expression.name); + interfaceNames.push({ + value: implement.expression.name, + genericTypeInstantiations: implement.typeArguments, + }); } } return interfaceNames; @@ -86,112 +114,337 @@ export class ClassLoader { * Classes can either be defined in this file (exported or not), or imported from another file. * @param classReference The reference to a class. * @param considerInterfaces If the class reference is allows to refer to an interface, as well as a class. + * @param considerOthers If the class reference is allows to refer to refer to other things, + * such as a type alias or enum. */ - public async loadClassDeclaration(classReference: ClassReference, considerInterfaces: CI): - Promise { + public async loadClassDeclaration( + classReference: ClassReference, + considerInterfaces: CI, + considerOthers: CT, + ): Promise { + let targetString = 'class'; + if (considerInterfaces) { + targetString += ' or interface'; + } + if (considerOthers) { + targetString += ' or other type'; + } + // Load the class as an AST let ast; try { ast = await this.resolutionContext.parseTypescriptFile(classReference.fileName); } catch (error: unknown) { - throw new Error(`Could not load ${considerInterfaces ? 'class or interface' : 'class'} ${classReference.localName} from ${classReference.fileName}:\n${( error).message}`); + const name = `${classReference.qualifiedPath && classReference.qualifiedPath.length > 0 ? `${classReference.qualifiedPath.join('.')}.` : ''}${classReference.localName}`; + throw new Error(`Could not load ${targetString} ${name} from ${classReference.fileName}:\n${( error).message}`); } + return this.loadClassDeclarationFromAst(ast, targetString, classReference, considerInterfaces, considerOthers); + } + + /** + * Load the referenced class, and obtain its full class declaration. + * Classes can either be defined in this file (exported or not), or imported from another file. + * @param ast An abstract syntax tree. + * @param targetString A string for error reporting on the considered scope. + * @param classReference The reference to a class. + * @param considerInterfaces If the class reference is allows to refer to an interface, as well as a class. + * @param considerOthers If the class reference is allows to refer to refer to other things, + * such as a type alias or enum. + */ + public async loadClassDeclarationFromAst( + ast: AST | TSESTree.TSModuleBlock, + targetString: string, + classReference: ClassReference, + considerInterfaces: CI, + considerOthers: CT, + ): Promise { const { exportedClasses, exportedInterfaces, + exportedTypes, + exportedEnums, + exportedImportedAllNamed, declaredClasses, declaredInterfaces, + declaredTypes, + declaredEnums, + declaredNamespaces, importedElements, + importedElementsAllNamed, exportedImportedAll, exportedImportedElements, + exportAssignment, } = this.getClassElements(classReference.packageName, classReference.fileName, ast); - // If the class has been exported in this file, return directly - if (classReference.localName in exportedClasses) { - const declaration = exportedClasses[classReference.localName]; - return this.enhanceLoadedWithComment( { - type: 'class', - ...classReference, - declaration, - ast, - abstract: declaration.abstract, - generics: this.collectGenericTypes(declaration), - }); - } + let componentName: string; + let qualifiedPathInner: string[] | undefined; + if (classReference.qualifiedPath && classReference.qualifiedPath.length > 0) { + // In all following code, look for the qualified path head + componentName = classReference.qualifiedPath[0]; - // If the class has been declared in this file, return directly - if (classReference.localName in declaredClasses) { - const declaration = declaredClasses[classReference.localName]; - return this.enhanceLoadedWithComment( { - type: 'class', - ...classReference, - declaration, - ast, - abstract: declaration.abstract, - generics: this.collectGenericTypes(declaration), - }); - } + // For recursive calls to getClassElements, we'll have to slice off the head + qualifiedPathInner = classReference.qualifiedPath.slice(1); + } else { + // Otherwise if we don't have a qualified path, look for the class name + componentName = classReference.localName; - // Only consider interfaces if explicitly enabled - if (considerInterfaces) { - // If the interface has been exported in this file, return directly - if (classReference.localName in exportedInterfaces) { - const declaration = exportedInterfaces[classReference.localName]; - return this.enhanceLoadedWithComment( { - type: 'interface', + // If the class has been exported in this file, return directly + if (componentName in exportedClasses) { + const declaration = exportedClasses[componentName]; + return this.enhanceLoadedWithComment({ + type: 'class', ...classReference, declaration, ast, + abstract: declaration.abstract, generics: this.collectGenericTypes(declaration), }); } - // If the interface has been declared in this file, return directly - if (classReference.localName in declaredInterfaces) { - const declaration = declaredInterfaces[classReference.localName]; - return this.enhanceLoadedWithComment( { - type: 'interface', + // If the class has been declared in this file, return directly + if (componentName in declaredClasses) { + const declaration = declaredClasses[componentName]; + return this.enhanceLoadedWithComment({ + type: 'class', ...classReference, declaration, ast, + abstract: declaration.abstract, generics: this.collectGenericTypes(declaration), }); } + + // Only consider interfaces if explicitly enabled + if (considerInterfaces) { + // If the interface has been exported in this file, return directly + if (componentName in exportedInterfaces) { + const declaration = exportedInterfaces[componentName]; + return this.enhanceLoadedWithComment({ + type: 'interface', + ...classReference, + declaration, + ast, + generics: this.collectGenericTypes(declaration), + }); + } + + // If the interface has been declared in this file, return directly + if (componentName in declaredInterfaces) { + const declaration = declaredInterfaces[componentName]; + return this.enhanceLoadedWithComment({ + type: 'interface', + ...classReference, + declaration, + ast, + generics: this.collectGenericTypes(declaration), + }); + } + } + + // Only consider other types if explicitly enabled + if (considerOthers) { + // Check types + if (componentName in exportedTypes) { + const declaration = exportedTypes[componentName]; + return this.enhanceLoadedWithComment({ + type: 'type', + ...classReference, + declaration, + ast, + generics: this.collectGenericTypes(declaration), + }); + } + if (componentName in declaredTypes) { + const declaration = declaredTypes[componentName]; + return this.enhanceLoadedWithComment({ + type: 'type', + ...classReference, + declaration, + ast, + generics: this.collectGenericTypes(declaration), + }); + } + + // Check enums + if (componentName in exportedEnums) { + const declaration = exportedEnums[componentName]; + return this.enhanceLoadedWithComment({ + type: 'enum', + ...classReference, + declaration, + ast, + }); + } + if (componentName in declaredEnums) { + const declaration = declaredEnums[componentName]; + return this.enhanceLoadedWithComment({ + type: 'enum', + ...classReference, + declaration, + ast, + }); + } + } } + // If we haven't found anything so far, we will follow import/export links. + // If the class is available via an import, follow that import link - if (classReference.localName in importedElements) { - return this.loadClassDeclaration(importedElements[classReference.localName], considerInterfaces); + if (componentName in importedElements) { + const entry = importedElements[componentName]; + let localNameInner: string; + if (qualifiedPathInner) { + localNameInner = classReference.localName; + qualifiedPathInner = [ entry.localName, ...qualifiedPathInner ]; + } else { + localNameInner = entry.localName; + } + return this.loadClassDeclaration( + { + ...entry, + localName: localNameInner, + qualifiedPath: qualifiedPathInner, + fileNameReferenced: classReference.fileNameReferenced, + }, + considerInterfaces, + considerOthers, + ); } // If the class is available via an exported import, follow that import link - if (classReference.localName in exportedImportedElements) { - return this.loadClassDeclaration(exportedImportedElements[classReference.localName], considerInterfaces); + if (componentName in exportedImportedElements) { + const entry = exportedImportedElements[componentName]; + let localNameInner: string; + if (qualifiedPathInner) { + localNameInner = classReference.localName; + qualifiedPathInner = [ entry.localName, ...qualifiedPathInner ]; + } else { + localNameInner = entry.localName; + } + return this.loadClassDeclaration( + { + ...entry, + localName: localNameInner, + qualifiedPath: qualifiedPathInner, + fileNameReferenced: classReference.fileNameReferenced, + }, + considerInterfaces, + considerOthers, + ); + } + + // Check for named exported elements + if (componentName in exportedImportedAllNamed) { + return await this.loadClassDeclaration({ + localName: classReference.localName, + qualifiedPath: qualifiedPathInner, + ...exportedImportedAllNamed[componentName], + fileNameReferenced: classReference.fileNameReferenced, + }, considerInterfaces, considerOthers); + } + + // Follow named import links + if (componentName in importedElementsAllNamed) { + return await this.loadClassDeclaration({ + localName: classReference.localName, + qualifiedPath: qualifiedPathInner, + ...importedElementsAllNamed[componentName], + fileNameReferenced: classReference.fileNameReferenced, + }, considerInterfaces, considerOthers); + } + + // Check enum values + if (classReference.qualifiedPath && classReference.qualifiedPath.length === 1) { + const enumName = classReference.qualifiedPath[0]; + const enumKey = classReference.localName; + const enumDeclaration = exportedEnums[enumName] || declaredEnums[enumName]; + if (enumDeclaration) { + for (const enumMember of enumDeclaration.members) { + if (enumMember.id.type === AST_NODE_TYPES.Identifier && enumMember.id.name === enumKey && + enumMember.initializer && enumMember.initializer.type === AST_NODE_TYPES.Literal) { + // Expose the enum entry as type alias + const typeNode: TSESTree.TSTypeAliasDeclaration = { + type: AST_NODE_TYPES.TSTypeAliasDeclaration, + id: { + type: AST_NODE_TYPES.Identifier, + name: enumKey, + loc: undefined, + range: undefined, + parent: undefined, + typeAnnotation: undefined, + optional: undefined, + decorators: undefined, + }, + typeAnnotation: { + type: AST_NODE_TYPES.TSLiteralType, + literal: enumMember.initializer, + loc: undefined, + range: undefined, + parent: undefined, + }, + loc: undefined, + range: undefined, + parent: undefined, + declare: undefined, + typeParameters: undefined, + }; + return { + type: 'type', + ...classReference, + declaration: typeNode, + ast, + }; + } + } + } } // If we still haven't found the class, iterate over all export all's for (const subFile of exportedImportedAll) { try { - return await this.loadClassDeclaration({ localName: classReference.localName, ...subFile }, - considerInterfaces); + return await this.loadClassDeclaration({ + localName: classReference.localName, + qualifiedPath: qualifiedPathInner, + ...subFile, + fileNameReferenced: classReference.fileNameReferenced, + }, considerInterfaces, considerOthers); } catch { // Ignore class not found errors } } - throw new Error(`Could not load ${considerInterfaces ? 'class or interface' : 'class'} ${classReference.localName} from ${classReference.fileName}`); + // Check if the export assignment refers to a namespace + if (exportAssignment && typeof exportAssignment === 'string' && exportAssignment in declaredNamespaces) { + const namespace: TSESTree.TSModuleDeclaration = declaredNamespaces[exportAssignment]; + return this.loadClassDeclarationFromAst( + namespace.body, + targetString, + classReference, + considerInterfaces, + considerOthers, + ); + } + + const name = `${classReference.qualifiedPath && classReference.qualifiedPath.length > 0 ? `${classReference.qualifiedPath.join('.')}.` : ''}${classReference.localName}`; + throw new Error(`Could not load ${targetString} ${name} from ${classReference.fileName}`); } /** * Create a hash of generic types in the given class declaration. * @param classDeclaration A class or interface declaration. */ - public collectGenericTypes(classDeclaration: ClassDeclaration | TSInterfaceDeclaration): GenericTypes { + public collectGenericTypes( + classDeclaration: TSESTree.ClassDeclaration | TSESTree.TSInterfaceDeclaration | TSESTree.TSTypeAliasDeclaration, + ): GenericTypes { const genericTypes: GenericTypes = {}; if (classDeclaration.typeParameters) { for (const param of classDeclaration.typeParameters.params) { - genericTypes[param.name.name] = { type: param.constraint }; + genericTypes[param.name.name] = { type: param.constraint, default: param.default }; } } return genericTypes; @@ -202,8 +455,7 @@ export class ClassLoader { * @param classLoaded A loaded class or interface. */ public enhanceLoadedWithComment(classLoaded: ClassReferenceLoaded): ClassReferenceLoaded { - const commentData = new CommentLoader({ classLoaded }) - .getCommentDataFromClassOrInterface(classLoaded.declaration); + const commentData = this.commentLoader.getCommentDataFromClassOrInterface(classLoaded); if (commentData.description) { classLoaded.comment = commentData.description; } @@ -213,15 +465,22 @@ export class ClassLoader { /** * Load a class, and get all class elements from it. * @param packageName Package name we are importing from. - * @param fileName A file path. + * @param filePath A file path. + * @returns {Promise} Promise of the class elements along with + * the resolved file path that was used to load these class elements. */ - public async loadClassElements(packageName: string, fileName: string): Promise { - const ast = await this.resolutionContext.parseTypescriptFile(fileName); - return this.getClassElements(packageName, fileName, ast); + public async loadClassElements(packageName: string, filePath: string): Promise< + ClassElements & { resolvedPath: string } + > { + const resolvedPath = await this.resolutionContext.resolveTypesPath(filePath); + const ast = await this.resolutionContext.parseTypescriptFile(resolvedPath); + const classElements = this.getClassElements(packageName, resolvedPath, ast); + return { ...classElements, resolvedPath }; } /** * Convert the given import path to an absolute file path, coupled with the module it is part of. + * Result is `undefined` if there was an error resolving the package. * @param currentPackageName Package name we are importing from. * @param currentFilePath Absolute path to a file in which the import path occurs. * @param importPath Possibly relative path that is being imported. @@ -230,12 +489,18 @@ export class ClassLoader { currentPackageName: string, currentFilePath: string, importPath: string, - ): { packageName: string; fileName: string } { + ): { packageName: string; fileName: string; fileNameReferenced: string } | undefined { // Handle import paths within the current package if (importPath.startsWith('.')) { + const fileName = joinFilePath(filePathDirName(currentFilePath), importPath); + const indexOfExtension = fileName.indexOf('.', fileName.lastIndexOf('/')); + const fileNameWithoutExtension = indexOfExtension === -1 ? + fileName : + fileName.slice(0, indexOfExtension); return { packageName: currentPackageName, - fileName: Path.join(Path.dirname(currentFilePath), importPath), + fileName: fileNameWithoutExtension, + fileNameReferenced: currentFilePath, }; } @@ -269,13 +534,20 @@ export class ClassLoader { } // Resolve paths - const packageRoot = this.resolutionContext.resolvePackageIndex(packageName, currentFilePath); + let packageRoot: string; + try { + packageRoot = this.resolutionContext.resolvePackageIndex(packageName, currentFilePath); + } catch (error: unknown) { + this.logger.warn(`Ignoring invalid package "${packageName}": ${( error).message}`); + return; + } const remoteFilePath = packagePath ? - Path.join(Path.dirname(packageRoot), packagePath) : - packageRoot.slice(0, packageRoot.lastIndexOf('.')); + joinFilePath(filePathDirName(packageRoot), packagePath) : + packageRoot.slice(0, packageRoot.indexOf('.', packageRoot.lastIndexOf('/'))); return { packageName, fileName: remoteFilePath, + fileNameReferenced: currentFilePath, }; } @@ -285,15 +557,30 @@ export class ClassLoader { * @param fileName A file path. * @param ast The parsed file. */ - public getClassElements(packageName: string, fileName: string, ast: AST): ClassElements { - const exportedClasses: Record = {}; - const exportedInterfaces: Record = {}; + public getClassElements( + packageName: string, + fileName: string, + ast: AST | TSESTree.TSModuleBlock, + ): ClassElements { + const exportedClasses: Record = {}; + const exportedInterfaces: Record = {}; + const exportedTypes: Record = {}; + const exportedEnums: Record = {}; + const exportedNamespaces: Record = {}; const exportedImportedElements: Record = {}; - const exportedImportedAll: { packageName: string; fileName: string }[] = []; + const exportedImportedAll: { packageName: string; fileName: string; fileNameReferenced: string }[] = []; + const exportedImportedAllNamed: + Record = {}; const exportedUnknowns: Record = {}; - const declaredClasses: Record = {}; - const declaredInterfaces: Record = {}; + const declaredClasses: Record = {}; + const declaredInterfaces: Record = {}; + const declaredTypes: Record = {}; + const declaredEnums: Record = {}; + const declaredNamespaces: Record = {}; const importedElements: Record = {}; + const importedElementsAllNamed: + Record = {}; + let exportAssignment: string | TSESTree.ClassDeclaration | undefined; for (const statement of ast.body) { if (statement.type === AST_NODE_TYPES.ExportNamedDeclaration) { @@ -308,15 +595,29 @@ export class ClassLoader { statement.declaration.type === AST_NODE_TYPES.TSInterfaceDeclaration) { // Form: `export interface A{}` exportedInterfaces[statement.declaration.id.name] = statement.declaration; + } else if (statement.declaration && statement.declaration.type === AST_NODE_TYPES.TSTypeAliasDeclaration) { + // Form: `export type A = ...` + exportedTypes[statement.declaration.id.name] = statement.declaration; + } else if (statement.declaration && statement.declaration.type === AST_NODE_TYPES.TSEnumDeclaration) { + // Form: `export enum A {...}` + exportedEnums[statement.declaration.id.name] = statement.declaration; + } else if (statement.declaration && statement.declaration.type === AST_NODE_TYPES.TSModuleDeclaration && + 'name' in statement.declaration.id) { + // Form: `export namespace A { ... }` + exportedNamespaces[statement.declaration.id.name] = statement.declaration; } else if (statement.source && statement.source.type === AST_NODE_TYPES.Literal && typeof statement.source.value === 'string') { // Form: `export { A as B } from "b"` for (const specifier of statement.specifiers) { - exportedImportedElements[specifier.exported.name] = { - localName: specifier.local.name, - ...this.importTargetToAbsolutePath(packageName, fileName, statement.source.value), - }; + const entry = this.importTargetToAbsolutePath(packageName, fileName, statement.source.value); + if (entry) { + exportedImportedElements[specifier.exported.name] = { + localName: specifier.local.name, + qualifiedPath: undefined, + ...entry, + }; + } } } else { // Form: `export { A as B }` @@ -325,11 +626,28 @@ export class ClassLoader { } } } else if (statement.type === AST_NODE_TYPES.ExportAllDeclaration) { - // Form: `export * from "b"` + // Form: `export * from "b"` or `export * as B from "b"` if (statement.source && statement.source.type === AST_NODE_TYPES.Literal && typeof statement.source.value === 'string') { - exportedImportedAll.push(this.importTargetToAbsolutePath(packageName, fileName, statement.source.value)); + const entry = this.importTargetToAbsolutePath(packageName, fileName, statement.source.value); + if (entry) { + if (statement.exported) { + exportedImportedAllNamed[statement.exported.name] = entry; + } else { + exportedImportedAll.push(entry); + } + } + } + } else if (statement.type === AST_NODE_TYPES.TSExportAssignment) { + // Form: `export = ...` + if (statement.expression.type === AST_NODE_TYPES.Identifier) { + exportAssignment = statement.expression.name; + } else if (statement.expression.type === AST_NODE_TYPES.ClassExpression) { + exportAssignment = { + ...statement.expression, + type: AST_NODE_TYPES.ClassDeclaration, + }; } } else if (statement.type === AST_NODE_TYPES.ClassDeclaration && statement.id) { // Form: `declare class A {}` @@ -337,16 +655,32 @@ export class ClassLoader { } else if (statement.type === AST_NODE_TYPES.TSInterfaceDeclaration && statement.id) { // Form: `declare interface A {}` declaredInterfaces[statement.id.name] = statement; + } else if (statement.type === AST_NODE_TYPES.TSTypeAliasDeclaration && statement.id) { + // Form: `declare type A = ...` + declaredTypes[statement.id.name] = statement; + } else if (statement.type === AST_NODE_TYPES.TSEnumDeclaration && statement.id) { + // Form: `declare enum A {...}` + declaredEnums[statement.id.name] = statement; + } else if (statement.type === AST_NODE_TYPES.TSModuleDeclaration && statement.id && 'name' in statement.id) { + // Form `declare namespace A { ... } + declaredNamespaces[statement.id.name] = statement; } else if (statement.type === AST_NODE_TYPES.ImportDeclaration && statement.source.type === AST_NODE_TYPES.Literal && typeof statement.source.value === 'string') { - // Form: `import {A} from './lib/A'` - for (const specifier of statement.specifiers) { - if (specifier.type === AST_NODE_TYPES.ImportSpecifier) { - importedElements[specifier.local.name] = { - localName: specifier.imported.name, - ...this.importTargetToAbsolutePath(packageName, fileName, statement.source.value), - }; + const entry = this.importTargetToAbsolutePath(packageName, fileName, statement.source.value); + if (entry) { + for (const specifier of statement.specifiers) { + if (specifier.type === AST_NODE_TYPES.ImportSpecifier) { + // Form: `import {A} from './lib/A'` + importedElements[specifier.local.name] = { + localName: specifier.imported.name, + qualifiedPath: undefined, + ...entry, + }; + } else if (specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier) { + // Form: `import * as A from './lib/A'` + importedElementsAllNamed[specifier.local.name] = entry; + } } } } @@ -355,12 +689,21 @@ export class ClassLoader { return { exportedClasses, exportedInterfaces, + exportedTypes, + exportedEnums, + exportedNamespaces, exportedImportedElements, exportedImportedAll, + exportedImportedAllNamed, exportedUnknowns, declaredClasses, declaredInterfaces, + declaredTypes, + declaredEnums, + declaredNamespaces, importedElements, + importedElementsAllNamed, + exportAssignment, }; } } @@ -368,6 +711,7 @@ export class ClassLoader { export interface ClassLoaderArgs { resolutionContext: ResolutionContext; logger: Logger; + commentLoader: CommentLoader; } /** @@ -375,19 +719,37 @@ export interface ClassLoaderArgs { */ export interface ClassElements { // Classes that have been declared in a file via `export class A` - exportedClasses: Record; + exportedClasses: Record; // Interfaces that have been declared in a file via `export interface A` - exportedInterfaces: Record; + exportedInterfaces: Record; + // Types that have been declared in a file via `export type A = ...` + exportedTypes: Record; + // Enums that have been declared in a file via `export enum A {...}` + exportedEnums: Record; + // Namespaces that have been declared in a file via `export namespace A { ... }` + exportedNamespaces: Record; // Elements that have been exported via `export { A as B } from "b"` exportedImportedElements: Record; // Exports via `export * from "b"` - exportedImportedAll: { packageName: string; fileName: string }[]; + exportedImportedAll: { packageName: string; fileName: string; fileNameReferenced: string }[]; + // Exports via `export * as A from "b"` + exportedImportedAllNamed: Record; // Things that have been exported via `export {A as B}`, where the target is not known exportedUnknowns: Record; // Classes that have been declared in a file via `declare class A` - declaredClasses: Record; + declaredClasses: Record; // Interfaces that have been declared in a file via `declare interface A` - declaredInterfaces: Record; + declaredInterfaces: Record; + // Types that have been declared in a file via `declare type A = ...` + declaredTypes: Record; + // Enums that have been declared in a file via `declare enum A {...}` + declaredEnums: Record; + // Namespaces that have been declared in a file via `declare namespace A { ... }` + declaredNamespaces: Record; // Elements that are imported from elsewhere via `import {A} from ''` importedElements: Record; + // Elements that are imported from elsewhere via `import * as A from ''` + importedElementsAllNamed: Record; + // Element exported via `export = ...` + exportAssignment: string | TSESTree.ClassDeclaration | undefined; } diff --git a/lib/parse/CommentLoader.ts b/lib/parse/CommentLoader.ts index b73c271..d498815 100644 --- a/lib/parse/CommentLoader.ts +++ b/lib/parse/CommentLoader.ts @@ -1,28 +1,62 @@ -import type { ClassDeclaration, TSInterfaceDeclaration, - MethodDefinition, TSPropertySignature, TSIndexSignature, BaseNode } from '@typescript-eslint/types/dist/ts-estree'; -import * as commentParse from 'comment-parser'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; +import { parse } from 'comment-parser'; import type { ClassReference, ClassReferenceLoaded } from './ClassIndex'; -import type { ParameterRangeUnresolved } from './ParameterLoader'; +import type { ConstructorHolder } from './ConstructorLoader'; +import type { DefaultNested, DefaultValue, ParameterRangeUnresolved } from './ParameterLoader'; /** * Loads comments from fields in a given class. */ export class CommentLoader { - private readonly classLoaded: ClassReferenceLoaded; - - public constructor(args: CommentLoaderArgs) { - this.classLoaded = args.classLoaded; + /** + * Extract comment data from the given constructor inheritance chain. + * @param constructorChain An array of constructors within the class inheritance chain. + */ + public getCommentDataFromConstructor(constructorChain: ConstructorHolder[]): ConstructorCommentData { + // Merge comment data about each field so that the closest classes in the inheritance chain have + // the highest priority in setting comment data. + return constructorChain + .map(constructorHolder => this.getCommentDataFromConstructorSingle( + constructorHolder.classLoaded.value, + constructorHolder.constructor, + )) + .reduce((acc, commentData) => { + for (const [ key, value ] of Object.entries(commentData)) { + if (key in acc) { + acc[key] = { + // eslint-disable-next-line ts/prefer-nullish-coalescing + range: acc[key].range || value.range, + // eslint-disable-next-line ts/prefer-nullish-coalescing + defaults: [ ...acc[key].defaults || [], ...value.defaults || [] ], + // eslint-disable-next-line ts/prefer-nullish-coalescing + ignored: acc[key].ignored || value.ignored, + // eslint-disable-next-line ts/prefer-nullish-coalescing + description: acc[key].description || value.description, + params: { ...acc[key].params, ...value.params }, + // eslint-disable-next-line ts/prefer-nullish-coalescing + defaultNested: [ ...acc[key].defaultNested || [], ...value.defaultNested || [] ], + }; + } else { + acc[key] = value; + } + } + return acc; + }, {}); } /** * Extract comment data from the given constructor. + * @param classLoaded The loaded class in which the constructor is defined. * @param constructor A constructor. */ - public getCommentDataFromConstructor(constructor: MethodDefinition): ConstructorCommentData { + public getCommentDataFromConstructorSingle( + classLoaded: ClassReferenceLoaded, + constructor: TSESTree.MethodDefinition, + ): ConstructorCommentData { // Get the constructor comment - const comment = this.getCommentRaw(constructor); + const comment = this.getCommentRaw(classLoaded, constructor); if (comment) { - return CommentLoader.getCommentDataFromConstructorComment(comment, this.classLoaded); + return CommentLoader.getCommentDataFromConstructorComment(comment, classLoaded); } return {}; @@ -40,7 +74,16 @@ export class CommentLoader { const commentData = CommentLoader.getCommentDataFromComment(comment, clazz); if (commentData.params) { for (const [ key, value ] of Object.entries(commentData.params)) { - data[key] = CommentLoader.getCommentDataFromComment(`/**${value.replace(/@/gu, '\n * @')}*/`, clazz); + const subCommentData = CommentLoader.getCommentDataFromComment(`/**${value.replaceAll(' @', '\n * @')}*/`, clazz); + + // Since we're in the scope of a param (key), prepend the defaultNested paramPath array with the current param. + if (subCommentData.defaultNested) { + for (const defaultNested of subCommentData.defaultNested) { + defaultNested.paramPath.unshift(key); + } + } + + data[key] = subCommentData; } } @@ -49,24 +92,28 @@ export class CommentLoader { /** * Extract comment data from the given field. + * @param classLoaded The loaded class in which the field is defined. * @param field A field. */ - public getCommentDataFromField(field: TSPropertySignature | TSIndexSignature): CommentData { - const comment = this.getCommentRaw(field); + public getCommentDataFromField( + classLoaded: ClassReferenceLoaded, + field: TSESTree.TSPropertySignature | TSESTree.TSIndexSignature, + ): CommentData { + const comment = this.getCommentRaw(classLoaded, field); if (comment) { - return CommentLoader.getCommentDataFromComment(comment, this.classLoaded); + return CommentLoader.getCommentDataFromComment(comment, classLoaded); } return {}; } /** * Extract comment data from the given class. - * @param clazz A class or interface. + * @param classLoaded The loaded class or interface. */ - public getCommentDataFromClassOrInterface(clazz: ClassDeclaration | TSInterfaceDeclaration): CommentData { - const comment = this.getCommentRaw(clazz); + public getCommentDataFromClassOrInterface(classLoaded: ClassReferenceLoaded): CommentData { + const comment = this.getCommentRaw(classLoaded, classLoaded.declaration); if (comment) { - return CommentLoader.getCommentDataFromComment(comment, this.classLoaded); + return CommentLoader.getCommentDataFromComment(comment, classLoaded); } return {}; } @@ -79,11 +126,11 @@ export class CommentLoader { public static getCommentDataFromComment(comment: string, clazz: ClassReference): CommentData { const data: CommentData = {}; - const commentParsed = commentParse(comment)[0]; + const commentParsed = parse(comment)[0]; if (commentParsed) { // Extract description if (commentParsed.description.length > 0) { - data.description = commentParsed.description.replace(/\n/gu, ' '); + data.description = commentParsed.description.replaceAll('\n', ' '); } // Extract tags @@ -102,7 +149,10 @@ export class CommentLoader { if (tag.type.length === 0) { throw new Error(`Missing @default value {something} on a field in class ${clazz.localName} at ${clazz.fileName}`); } - data.default = tag.type; + if (!data.defaults) { + data.defaults = []; + } + data.defaults.push(CommentLoader.getDefaultValue(tag.type, clazz)); break; case 'ignored': data.ignored = true; @@ -116,6 +166,18 @@ export class CommentLoader { data.params[tag.name] = data.params[tag.name].slice(2); } break; + case 'defaultnested': + if (tag.type.length === 0 || tag.name.length === 0) { + throw new Error(`Invalid @defaultNested syntax on a field in class ${clazz.localName} at ${clazz.fileName}: expected @defaultNested { a } path_to_param`); + } + if (!data.defaultNested) { + data.defaultNested = []; + } + data.defaultNested.push({ + paramPath: tag.name.split('_'), + value: CommentLoader.getDefaultValue(tag.type, clazz), + }); + break; } } } @@ -123,13 +185,54 @@ export class CommentLoader { return data; } + /** + * Parse the microsyntax of a default value. + * + * Can be one of: + * * raw value: "abc" + * * iri value: "" + * * type value: "a " + * * iri and type value: " a " + * + * @param value A default value string. + * @param clazz The class reference this value is loaded in. + */ + public static getDefaultValue(value: string, clazz: ClassReference): DefaultValue { + if (!value.startsWith('<') && !value.startsWith('a ')) { + return { + type: 'raw', + value, + }; + } + + const [ idRaw, typeRaw ] = value.startsWith('a ') ? + [ undefined, value.slice(2) ] : + value.split(' a '); + return { + type: 'iri', + value: idRaw ? CommentLoader.getIriValue(idRaw) : undefined, + typeIri: typeRaw ? CommentLoader.getIriValue(typeRaw) : undefined, + baseComponent: clazz, + }; + } + + /** + * Unbox an IRI wrapped in <> + * @param iriBoxed An iri string within <> + */ + public static getIriValue(iriBoxed: string): string | undefined { + const match = /^<([^>]*)>$/u.exec(iriBoxed); + return match ? match[1] : undefined; + } + /** * Get the comment string from the given node. + * @param classLoaded The loaded class in which the field is defined. * @param node A node, such as a field or constructor. */ - public getCommentRaw(node: BaseNode): string | undefined { + public getCommentRaw(classLoaded: ClassReferenceLoaded, node: TSESTree.BaseNode): string | undefined { const line = node.loc.start.line; - for (const comment of this.classLoaded.ast.comments || []) { + for (const comment of classLoaded.ast.comments ?? []) { if (comment.loc.end.line === line - 1) { return `/*${comment.value}*/`; } @@ -137,10 +240,9 @@ export class CommentLoader { } } -export interface CommentLoaderArgs { - classLoaded: ClassReferenceLoaded; -} - +/** + * Maps field keys to comments. + */ export type ConstructorCommentData = Record; export interface CommentData { @@ -149,9 +251,9 @@ export interface CommentData { */ range?: ParameterRangeUnresolved; /** - * The default value. + * The default values. */ - default?: string; + defaults?: DefaultValue[]; /** * If the field referenced by this comment should be ignored. */ @@ -164,4 +266,8 @@ export interface CommentData { * Parameters that were defined in this comment. */ params?: Record; + /** + * The nested default values on parameters. + */ + defaultNested?: DefaultNested[]; } diff --git a/lib/parse/ConstructorLoader.ts b/lib/parse/ConstructorLoader.ts index 9b32a31..87bc4ea 100644 --- a/lib/parse/ConstructorLoader.ts +++ b/lib/parse/ConstructorLoader.ts @@ -1,14 +1,18 @@ -import type { ClassDeclaration, MethodDefinition } from '@typescript-eslint/types/dist/ts-estree'; -import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; +import type { AST, TSESTreeOptions, TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; -import type { ClassIndex, ClassLoaded, ClassReferenceLoaded } from './ClassIndex'; -import type { ParameterDataField, ParameterRangeUnresolved } from './ParameterLoader'; -import { ParameterLoader } from './ParameterLoader'; +import type { ClassIndex, ClassLoaded, ClassReferenceLoaded, GenericallyTyped } from './ClassIndex'; +import type { ParameterDataField, ParameterRangeUnresolved, ParameterLoader } from './ParameterLoader'; /** * Loads the constructor data of classes. */ export class ConstructorLoader { + private readonly parameterLoader: ParameterLoader; + + public constructor(args: ConstructorLoaderArgs) { + this.parameterLoader = args.parameterLoader; + } + /** * Create a class index containing all constructor data from the classes in the given index. * @param classIndex An index of loaded classes. @@ -17,42 +21,66 @@ export class ConstructorLoader { classIndex: ClassIndex, ): ClassIndex> { const constructorDataIndex: ClassIndex> = {}; - for (const [ className, classLoaded ] of Object.entries(classIndex)) { - const constructor = classLoaded.type === 'class' ? this.getConstructor(classLoaded) : undefined; - if (constructor) { - const parameterLoader = new ParameterLoader({ classLoaded }); - constructorDataIndex[className] = parameterLoader.loadConstructorFields(constructor); - } else { - constructorDataIndex[className] = { parameters: []}; + for (const [ className, classLoadedRoot ] of Object.entries(classIndex)) { + // Initialize default value + constructorDataIndex[className] = { + parameters: [], + classLoaded: classLoadedRoot, + }; + + // Fill in constructor data if we're loading a class, and we find a constructor in the inheritance chain. + if (classLoadedRoot.type === 'class') { + const constructorChain = this.getConstructorChain({ value: classLoadedRoot }); + if (constructorChain.length > 0) { + constructorDataIndex[className] = this.parameterLoader.loadConstructorFields(constructorChain); + } } } return constructorDataIndex; } + /** + * Load the superclass chain of constructor holders starting from the given class. + * @param classLoaded The class to start from. + */ + public getConstructorChain(classLoaded: GenericallyTyped): ConstructorHolder[] { + const constructorData = this.getConstructor(classLoaded); + const chain: ConstructorHolder[] = []; + if (constructorData) { + chain.push(constructorData); + if (constructorData.classLoaded.value.superClass) { + chain.push(...this.getConstructorChain(constructorData.classLoaded.value.superClass)); + } + } + return chain; + } + /** * Retrieve the constructor in the given class, or its super class. * Can be undefined if no explicit constructor exists in this class or any of its super classes. * @param classLoaded A loaded class reference. */ - public getConstructor(classLoaded: ClassLoaded): MethodDefinition | undefined { + public getConstructor(classLoaded: GenericallyTyped): ConstructorHolder | undefined { // First look for the constructor in this class - let constructor = this.getConstructorInClass(classLoaded.declaration); + let constructor: TSESTree.MethodDefinition | undefined = this.getConstructorInClass(classLoaded.value.declaration); // If no constructor was found, look in the super class - if (!constructor) { - if (classLoaded.superClass) { - constructor = this.getConstructor(classLoaded.superClass); + if (!constructor && classLoaded.value.superClass) { + const constructorDataSuper = this.getConstructor(classLoaded.value.superClass); + if (constructorDataSuper) { + constructor = constructorDataSuper.constructor; + classLoaded = constructorDataSuper.classLoaded; } } - return constructor; + return constructor ? { constructor, classLoaded } : undefined; } /** * Retrieve the constructor in the given class, or undefined if it could not be found. * @param declaration A class declaration */ - public getConstructorInClass(declaration: ClassDeclaration): MethodDefinition | undefined { + public getConstructorInClass(declaration: TSESTree.ClassDeclaration): TSESTree.MethodDefinition | undefined { for (const element of declaration.body.body) { if (element.type === AST_NODE_TYPES.MethodDefinition && element.kind === 'constructor') { @@ -68,7 +96,7 @@ export class ConstructorLoader { * @param ast A parsed typescript file * @param fileName The file name, for error reporting. */ - public getClass(className: string, ast: AST, fileName: string): ClassDeclaration { + public getClass(className: string, ast: AST, fileName: string): TSESTree.ClassDeclaration { for (const statement of ast.body) { // Classes in the form of `declare class A {}` if (statement.type === AST_NODE_TYPES.ClassDeclaration && @@ -89,9 +117,22 @@ export class ConstructorLoader { } } +export interface ConstructorLoaderArgs { + parameterLoader: ParameterLoader; +} + /** * Constructor parameter information */ export interface ConstructorData { parameters: ParameterDataField[]; + classLoaded: ClassReferenceLoaded; +} + +/** + * Datastructure for holding a constructor and the class it is part of. + */ +export interface ConstructorHolder { + constructor: TSESTree.MethodDefinition; + classLoaded: GenericallyTyped; } diff --git a/lib/parse/GenericsLoader.ts b/lib/parse/GenericsLoader.ts new file mode 100644 index 0000000..a16fbeb --- /dev/null +++ b/lib/parse/GenericsLoader.ts @@ -0,0 +1,45 @@ +import type { ClassIndex, ClassReferenceLoaded } from './ClassIndex'; +import type { + GenericTypeParameterData, + ParameterLoader, + ParameterRangeUnresolved, +} from './ParameterLoader'; + +/** + * Loads the generics data of classes. + */ +export class GenericsLoader { + private readonly parameterLoader: ParameterLoader; + + public constructor(args: GenericsLoaderArgs) { + this.parameterLoader = args.parameterLoader; + } + + /** + * Create a class index containing all generics data from the classes in the given index. + * @param classIndex An index of loaded classes. + */ + public getGenerics( + classIndex: ClassIndex, + ): ClassIndex> { + const genericsDataIndex: ClassIndex> = {}; + for (const [ className, classLoadedRoot ] of Object.entries(classIndex)) { + if (classLoadedRoot.type === 'class' || classLoadedRoot.type === 'interface') { + genericsDataIndex[className] = this.parameterLoader.loadClassGenerics(classLoadedRoot); + } + } + return genericsDataIndex; + } +} + +export interface GenericsLoaderArgs { + parameterLoader: ParameterLoader; +} + +/** + * Generics parameter information + */ +export interface GenericsData { + genericTypeParameters: GenericTypeParameterData[]; + classLoaded: ClassReferenceLoaded; +} diff --git a/lib/parse/MemberLoader.ts b/lib/parse/MemberLoader.ts new file mode 100644 index 0000000..753db6e --- /dev/null +++ b/lib/parse/MemberLoader.ts @@ -0,0 +1,83 @@ +import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; +import type { ClassReferenceLoaded, ClassReferenceLoadedClassOrInterface, ClassIndex } from './ClassIndex'; + +import type { MemberParameterData, ParameterLoader, ParameterRangeUnresolved } from './ParameterLoader'; + +/** + * Loads the member data of classes. + */ +export class MemberLoader { + private readonly parameterLoader: ParameterLoader; + + public constructor(args: MemberLoaderArgs) { + this.parameterLoader = args.parameterLoader; + } + + /** + * Create a class index containing all member data from the classes in the given index. + * @param classIndex An index of loaded classes. + */ + public getMembers( + classIndex: ClassIndex, + ): ClassIndex> { + const membersIndex: ClassIndex> = {}; + for (const [ className, classLoadedRoot ] of Object.entries(classIndex)) { + if (classLoadedRoot.type === 'class' || classLoadedRoot.type === 'interface') { + membersIndex[className] = { + members: this.collectClassFields(classLoadedRoot), + classLoaded: classLoadedRoot, + }; + } + } + return membersIndex; + } + + /** + * Obtain the class member fields. + * This should correspond to the keys that are available within the `keyof` range of this class + * @param classLoaded A class or interface + */ + public collectClassFields( + classLoaded: ClassReferenceLoadedClassOrInterface, + ): MemberParameterData[] { + const members: MemberParameterData[] = []; + for (const element of classLoaded.declaration.body.body) { + // eslint-disable-next-line ts/switch-exhaustiveness-check + switch (element.type) { + case AST_NODE_TYPES.PropertyDefinition: + case AST_NODE_TYPES.TSAbstractPropertyDefinition: + case AST_NODE_TYPES.MethodDefinition: + case AST_NODE_TYPES.TSAbstractMethodDefinition: + case AST_NODE_TYPES.TSPropertySignature: + case AST_NODE_TYPES.TSMethodSignature: + if (element.key.type === 'Identifier') { + // TODO: more types may be needed here, such as AST_NODE_TYPES.TSPropertySignature + const typeNode = element.type === AST_NODE_TYPES.PropertyDefinition || + element.type === AST_NODE_TYPES.TSAbstractPropertyDefinition ? + element.typeAnnotation?.typeAnnotation : + undefined; + members.push({ + name: element.key.name, + range: typeNode ? + this.parameterLoader.getRangeFromTypeNode(classLoaded, typeNode, `field ${element.key.name}`) : + undefined, + }); + } + break; + } + } + return members; + } +} + +/** + * Member parameter information + */ +export interface MemberData { + members: MemberParameterData[]; + classLoaded: ClassReferenceLoaded; +} + +export interface MemberLoaderArgs { + parameterLoader: ParameterLoader; +} diff --git a/lib/parse/PackageMetadataLoader.ts b/lib/parse/PackageMetadataLoader.ts index 0dc8644..5777651 100644 --- a/lib/parse/PackageMetadataLoader.ts +++ b/lib/parse/PackageMetadataLoader.ts @@ -1,17 +1,17 @@ -import * as Path from 'path'; import semverMajor = require('semver/functions/major'); import type { ResolutionContext } from '../resolution/ResolutionContext'; +import { joinFilePath } from '../util/PathUtil'; /** - * Load metadata from packages. + * Load metadata from a package. */ export class PackageMetadataLoader { private readonly resolutionContext: ResolutionContext; - private readonly prefix?: string; + private readonly prefixes?: string | Record; public constructor(args: PackageMetadataLoaderArgs) { this.resolutionContext = args.resolutionContext; - this.prefix = args.prefix; + this.prefixes = args.prefixes; } /** @@ -20,7 +20,7 @@ export class PackageMetadataLoader { */ public async load(packageRootDirectory: string): Promise { // Read package.json - const packageJsonPath = Path.join(packageRootDirectory, 'package.json'); + const packageJsonPath = joinFilePath(packageRootDirectory, 'package.json'); const packageJsonRaw = await this.resolutionContext.getFileContent(packageJsonPath); let packageJson: any; try { @@ -54,7 +54,7 @@ export class PackageMetadataLoader { if (!('lsd:components' in packageJson)) { throw new Error(`Invalid package: Missing 'lsd:components' in ${packageJsonPath}`); } - const componentsPath = Path.join(packageRootDirectory, packageJson['lsd:components']); + const componentsPath = joinFilePath(packageRootDirectory, packageJson['lsd:components']); if (!('lsd:contexts' in packageJson)) { throw new Error(`Invalid package: Missing 'lsd:contexts' in ${packageJsonPath}`); } @@ -66,11 +66,14 @@ export class PackageMetadataLoader { if (!('types' in packageJson) && !('typings' in packageJson)) { throw new Error(`Invalid package: Missing 'types' or 'typings' in ${packageJsonPath}`); } - let typesPath = Path.join(packageRootDirectory, packageJson.types || packageJson.typings); + let typesPath = joinFilePath(packageRootDirectory, packageJson.types || packageJson.typings); if (typesPath.endsWith('.d.ts')) { typesPath = typesPath.slice(0, -5); } + // Determine prefixes + const prefix = !this.prefixes || typeof this.prefixes === 'string' ? this.prefixes : this.prefixes[name]; + // Construct metadata hash return { name, @@ -80,14 +83,14 @@ export class PackageMetadataLoader { contexts, importPaths, typesPath, - prefix: this.prefix, + prefix, }; } } export interface PackageMetadataLoaderArgs { resolutionContext: ResolutionContext; - prefix?: string; + prefixes?: string | Record; } export interface PackageMetadata { diff --git a/lib/parse/ParameterLoader.ts b/lib/parse/ParameterLoader.ts index 337036a..73d8691 100644 --- a/lib/parse/ParameterLoader.ts +++ b/lib/parse/ParameterLoader.ts @@ -1,19 +1,16 @@ -import type { - Identifier, - MethodDefinition, - TSPropertySignature, - TSTypeLiteral, - TypeElement, - TypeNode, - TSIndexSignature, - TSTypeReference, - Parameter, -} from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; -import type { ClassReferenceLoaded, InterfaceLoaded } from './ClassIndex'; -import type { CommentData, ConstructorCommentData } from './CommentLoader'; -import { CommentLoader } from './CommentLoader'; -import type { ConstructorData } from './ConstructorLoader'; +import type { Logger } from 'winston'; +import type { + ClassReferenceLoaded, + InterfaceLoaded, + ClassReference, + ClassReferenceLoadedClassOrInterface, + ClassIndex, +} from './ClassIndex'; +import type { CommentData, ConstructorCommentData, CommentLoader } from './CommentLoader'; +import type { ConstructorData, ConstructorHolder } from './ConstructorLoader'; +import type { GenericsData } from './GenericsLoader'; import type { TypeReferenceOverride } from './typereferenceoverride/TypeReferenceOverride'; import { TypeReferenceOverrideAliasRecord } from './typereferenceoverride/TypeReferenceOverrideAliasRecord'; @@ -25,50 +22,178 @@ export class ParameterLoader { new TypeReferenceOverrideAliasRecord(), ]; - private readonly classLoaded: ClassReferenceLoaded; private readonly commentLoader: CommentLoader; + private readonly hardErrorUnsupported: boolean; + private readonly logger: Logger; public constructor(args: ParameterLoaderArgs) { - this.classLoaded = args.classLoaded; - this.commentLoader = new CommentLoader({ classLoaded: this.classLoaded }); + this.commentLoader = args.commentLoader; + this.hardErrorUnsupported = args.hardErrorUnsupported; + this.logger = args.logger; + } + + /** + * Create a class index containing all constructor data from the classes in the given index. + * @param classIndex An index of loaded classes. + */ + public loadAllExtensionData( + classIndex: ClassIndex, + ): ClassIndex[]> { + const newIndex: ClassIndex[]> = {}; + for (const [ key, classLoaded ] of Object.entries(classIndex)) { + if (classLoaded.type === 'class' || classLoaded.type === 'interface') { + newIndex[key] = this.loadExtensionData(classLoaded); + } + } + return newIndex; + } + + /** + * Load the extension data of the given class or interface. + * @param classReference A loaded class or interface reference. + */ + public loadExtensionData( + classReference: ClassReferenceLoadedClassOrInterface, + ): ExtensionData[] { + const extensionDatas: ExtensionData[] = []; + if (classReference.type === 'class') { + if (classReference.superClass) { + extensionDatas.push({ + classLoaded: classReference.superClass.value, + genericTypeInstantiations: classReference.superClass.genericTypeInstantiations ? + this.getGenericTypeParameterInstantiations( + classReference.superClass.genericTypeInstantiations, + classReference, + ) : + [], + }); + } + if (classReference.implementsInterfaces) { + for (const iface of classReference.implementsInterfaces) { + extensionDatas.push({ + classLoaded: iface.value, + genericTypeInstantiations: iface.genericTypeInstantiations ? + this.getGenericTypeParameterInstantiations(iface.genericTypeInstantiations, classReference) : + [], + }); + } + } + } else if (classReference.superInterfaces) { + for (const iface of classReference.superInterfaces) { + extensionDatas.push({ + classLoaded: iface.value, + genericTypeInstantiations: iface.genericTypeInstantiations ? + this.getGenericTypeParameterInstantiations(iface.genericTypeInstantiations, classReference) : + [], + }); + } + } + return extensionDatas; } /** - * Load all parameter data from all fields in the given constructor. - * @param constructor A constructor + * Load all parameter data from all fields in the given constructor inheritance chain. + * @param constructorChain An array of constructors within the class inheritance chain. */ - public loadConstructorFields(constructor: MethodDefinition): ConstructorData { + public loadConstructorFields( + constructorChain: ConstructorHolder[], + ): ConstructorData { + const classLoaded = constructorChain[0].classLoaded.value; + // Load the constructor comment - const constructorCommentData = this.commentLoader.getCommentDataFromConstructor(constructor); + const constructorCommentData = this.commentLoader.getCommentDataFromConstructor(constructorChain); // Load all constructor parameters const parameters: ParameterDataField[] = []; - for (const field of constructor.value.params) { - this.loadConstructorField(parameters, constructorCommentData, field); + for (const field of constructorChain[0].constructor.value.params) { + this.loadConstructorField(classLoaded, parameters, constructorCommentData, field); + } + + return { + parameters, + classLoaded, + }; + } + + /** + * Load generics types from the given class. + * @param classLoaded A loaded class. + */ + public loadClassGenerics(classLoaded: ClassReferenceLoadedClassOrInterface): GenericsData { + // Load all generic type parameters + const genericTypeParameters: GenericTypeParameterData[] = []; + for (const [ genericName, genericType ] of Object.entries(classLoaded.generics)) { + this.loadClassGeneric( + classLoaded, + genericTypeParameters, + genericName, + genericType.type, + genericType.default, + ); } - return { parameters }; + + return { + genericTypeParameters, + classLoaded, + }; + } + + /** + * Load the generic type parameter data from the given generic in a class. + * @param classLoaded The loaded class in which the field is defined. + * @param genericTypeParameters The array of generic type parameters that will be appended to. + * @param genericName The generic type name. + * @param genericType The optional generic type range. + * @param genericDefault The optional generic default value. + */ + public loadClassGeneric( + classLoaded: ClassReferenceLoaded, + genericTypeParameters: GenericTypeParameterData[], + genericName: string, + genericType: TSESTree.TypeNode | undefined, + genericDefault: TSESTree.TypeNode | undefined, + ): void { + genericTypeParameters.push({ + name: genericName, + ...genericType ? + { range: this.getRangeFromTypeNode( + classLoaded, + genericType, + this.getErrorIdentifierGeneric(classLoaded, genericName), + ) } : + {}, + ...genericDefault ? + { default: this.getRangeFromTypeNode( + classLoaded, + genericDefault, + this.getErrorIdentifierGeneric(classLoaded, genericName), + ) } : + {}, + }); } /** * Load the parameter data from the given field in a constructor. + * @param classLoaded The loaded class in which the field is defined. * @param parameters The array of parameters that will be appended to. * @param constructorCommentData Comment data from the constructor. * @param field The field to load. */ public loadConstructorField( + classLoaded: ClassReferenceLoaded, parameters: ParameterDataField[], constructorCommentData: ConstructorCommentData, - field: Parameter, + field: TSESTree.Parameter, ): void { if (field.type === AST_NODE_TYPES.Identifier) { const commentData = constructorCommentData[field.name] || {}; if (!commentData.ignored) { - parameters.push(this.loadField(field, commentData)); + parameters.push(this.loadField(classLoaded, field, commentData)); } } else if (field.type === AST_NODE_TYPES.TSParameterProperty) { - this.loadConstructorField(parameters, constructorCommentData, field.parameter); + this.loadConstructorField(classLoaded, parameters, constructorCommentData, field.parameter); } else { - throw new Error(`Could not understand constructor parameter type ${field.type} in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); + this.throwOrWarn(new Error(`Could not understand constructor parameter type ${field.type} in ${classLoaded.localName} at ${classLoaded.fileName}`)); } } @@ -78,67 +203,80 @@ export class ParameterLoader { * @param iface An interface */ public loadInterfaceFields(iface: InterfaceLoaded): ParameterData[] { - return []> iface.declaration.body.body - .map(field => this.loadTypeElementField(field)) + let fields: ParameterData[] = []> iface + .declaration.body.body + .map(field => this.loadTypeElementField(iface, field)) .filter(Boolean); + if (iface.superInterfaces && iface.superInterfaces.length > 0) { + // TODO: pass down superIface.genericTypeInstantiations to loadInterfaceFields + // eslint-disable-next-line unicorn/prefer-spread + fields = fields.concat(...iface.superInterfaces.map(superIface => this.loadInterfaceFields(superIface.value))); + } + return fields; } /** * Load all parameter data from all fields in the given hash. + * @param classLoaded The loaded class in which the field is defined. * @param hash An hash element. */ - public loadHashFields(hash: TSTypeLiteral): ParameterData[] { + public loadHashFields( + classLoaded: ClassReferenceLoaded, + hash: TSESTree.TSTypeLiteral, + ): ParameterData[] { return []> hash.members - .map(field => this.loadTypeElementField(field)) + .map(field => this.loadTypeElementField(classLoaded, field)) .filter(Boolean); } /** * Load the parameter data from the given type element. + * @param classLoaded The loaded class in which the field is defined. * @param typeElement A type element, such as an interface or hash field. */ - public loadTypeElementField(typeElement: TypeElement): ParameterData | undefined { + public loadTypeElementField( + classLoaded: ClassReferenceLoaded, + typeElement: TSESTree.TypeElement, + ): ParameterData | undefined { let commentData; switch (typeElement.type) { case AST_NODE_TYPES.TSPropertySignature: - commentData = this.commentLoader.getCommentDataFromField(typeElement); + commentData = this.commentLoader.getCommentDataFromField(classLoaded, typeElement); if (!commentData.ignored) { - return this.loadField(typeElement, commentData); + return this.loadField(classLoaded, typeElement, commentData); } return; case AST_NODE_TYPES.TSIndexSignature: - commentData = this.commentLoader.getCommentDataFromField(typeElement); + commentData = this.commentLoader.getCommentDataFromField(classLoaded, typeElement); if (!commentData.ignored) { - return this.loadIndex(typeElement, commentData); + return this.loadIndex(classLoaded, typeElement, commentData); } return; default: - throw new Error(`Unsupported field type ${typeElement.type} in ${this.classLoaded.localName} in ${this.classLoaded.fileName}`); + this.throwOrWarn(new Error(`Unsupported field type ${typeElement.type} in ${classLoaded.localName} in ${classLoaded.fileName}`)); } } /** * Load the parameter data from the given field. + * @param classLoaded The loaded class in which the field is defined. * @param field A field. * @param commentData Comment data about the given field. */ - public loadField(field: Identifier | TSPropertySignature, commentData: CommentData): - ParameterDataField { + public loadField( + classLoaded: ClassReferenceLoaded, + field: TSESTree.Identifier | TSESTree.TSPropertySignature, + commentData: CommentData, + ): ParameterDataField { // Required data const parameterData: ParameterDataField = { type: 'field', - name: this.getFieldName(field), - unique: this.isFieldUnique(field), - required: this.isFieldRequired(field), - range: this.getFieldRange(field, commentData), + name: this.getFieldName(classLoaded, field), + range: this.getFieldRange(classLoaded, field, commentData), + defaults: commentData.defaults, + defaultNested: commentData.defaultNested, }; - // Optional data - const defaultValue = this.getFieldDefault(commentData); - if (defaultValue) { - parameterData.default = defaultValue; - } - const comment = this.getFieldComment(commentData); if (comment) { parameterData.comment = comment; @@ -147,7 +285,10 @@ export class ParameterLoader { return parameterData; } - public getFieldName(field: Identifier | TSPropertySignature): string { + public getFieldName( + classLoaded: ClassReferenceLoaded, + field: TSESTree.Identifier | TSESTree.TSPropertySignature, + ): string { if ('name' in field) { // If Identifier return field.name; @@ -156,26 +297,18 @@ export class ParameterLoader { if (field.key.type === AST_NODE_TYPES.Identifier) { return field.key.name; } - throw new Error(`Unsupported field key type ${field.key.type} in interface ${this.classLoaded.localName} in ${this.classLoaded.fileName}`); + throw new Error(`Unsupported field key type ${field.key.type} in interface ${classLoaded.localName} in ${classLoaded.fileName}`); } - public isFieldIndexedHash(field: Identifier | TSPropertySignature): boolean { - return Boolean(field.typeAnnotation && - field.typeAnnotation.typeAnnotation.type === AST_NODE_TYPES.TSTypeLiteral && - field.typeAnnotation.typeAnnotation.members.some(member => member.type === AST_NODE_TYPES.TSIndexSignature)); + public getErrorIdentifierGeneric(classLoaded: ClassReferenceLoaded, genericName: string): string { + return `generic type ${genericName}`; } - public isFieldUnique(field: Identifier | TSPropertySignature): boolean { - return !(field.typeAnnotation && field.typeAnnotation.typeAnnotation.type === AST_NODE_TYPES.TSArrayType) && - !this.isFieldIndexedHash(field); - } - - public isFieldRequired(field: Identifier | TSPropertySignature): boolean { - return !field.optional && !this.isFieldIndexedHash(field); - } - - public getErrorIdentifierField(field: Identifier | TSPropertySignature): string { - return `field ${this.getFieldName(field)}`; + public getErrorIdentifierField( + classLoaded: ClassReferenceLoaded, + field: TSESTree.Identifier | TSESTree.TSPropertySignature, + ): string { + return `field ${this.getFieldName(classLoaded, field)}`; } public getErrorIdentifierIndex(): string { @@ -183,18 +316,12 @@ export class ParameterLoader { } public getRangeFromTypeNode( - typeNode: TypeNode, + classLoaded: ClassReferenceLoaded, + typeNode: TSESTree.TypeNode, errorIdentifier: string, - nestedArrays = 0, ): ParameterRangeUnresolved { - // Don't allow arrays to be nested - if (nestedArrays > 1) { - throw new Error(`Detected illegal nested array type for ${errorIdentifier - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); - } - let typeAliasOverride: ParameterRangeUnresolved | undefined; - // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check + // eslint-disable-next-line ts/switch-exhaustiveness-check switch (typeNode.type) { case AST_NODE_TYPES.TSTypeReference: if (typeNode.typeName.type === AST_NODE_TYPES.Identifier) { @@ -207,20 +334,22 @@ export class ParameterLoader { case 'String': return { type: 'raw', value: 'string' }; case 'Array': - if (typeNode.typeParameters && typeNode.typeParameters.params.length === 1) { - return this.getRangeFromTypeNode(typeNode.typeParameters.params[0], errorIdentifier, nestedArrays + 1); + if (typeNode.typeArguments && typeNode.typeArguments.params.length === 1) { + return { + type: 'array', + value: this.getRangeFromTypeNode(classLoaded, typeNode.typeArguments.params[0], errorIdentifier), + }; } - throw new Error(`Found invalid Array field type at ${errorIdentifier - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); + this.throwOrWarn(new Error(`Found invalid Array field type at ${errorIdentifier + } in ${classLoaded.localName} at ${classLoaded.fileName}`)); + return { type: 'wildcard' }; default: - // First check if the type is be a generic type - if (typeNode.typeName.name in this.classLoaded.generics) { - const genericProperties = this.classLoaded.generics[typeNode.typeName.name]; - if (!genericProperties.type) { - throw new Error(`Found untyped generic field type at ${errorIdentifier - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); - } - return this.getRangeFromTypeNode(genericProperties.type, errorIdentifier); + // First check if the type is a direct generic type + if (classLoaded.type !== 'enum' && typeNode.typeName.name in classLoaded.generics) { + return { + type: 'genericTypeReference', + value: typeNode.typeName.name, + }; } // Check if this node is a predefined type alias @@ -230,50 +359,234 @@ export class ParameterLoader { } // Otherwise, assume we have an interface/class parameter - return { type: 'interface', value: typeNode.typeName.name }; + return { + type: 'interface', + value: typeNode.typeName.name, + genericTypeParameterInstantiations: typeNode.typeArguments ? + this.getGenericTypeParameterInstantiations(typeNode.typeArguments, classLoaded) : + undefined, + origin: classLoaded, + }; } + } else { + // Case: typeNode.typeName.type === AST_NODE_TYPES.TSQualifiedName + return { + type: 'interface', + value: ( typeNode.typeName).right.name, + qualifiedPath: this.getQualifiedPath(( typeNode.typeName).left), + genericTypeParameterInstantiations: typeNode.typeArguments ? + this.getGenericTypeParameterInstantiations(typeNode.typeArguments, classLoaded) : + undefined, + origin: classLoaded, + }; } - break; - case AST_NODE_TYPES.TSArrayType: - return this.getRangeFromTypeNode(typeNode.elementType, errorIdentifier, nestedArrays + 1); case AST_NODE_TYPES.TSBooleanKeyword: return { type: 'raw', value: 'boolean' }; case AST_NODE_TYPES.TSNumberKeyword: return { type: 'raw', value: 'number' }; case AST_NODE_TYPES.TSStringKeyword: return { type: 'raw', value: 'string' }; + case AST_NODE_TYPES.TSLiteralType: + if (typeNode.literal.type !== AST_NODE_TYPES.UnaryExpression && + typeNode.literal.type !== AST_NODE_TYPES.UpdateExpression && + 'value' in typeNode.literal && + (typeof typeNode.literal.value === 'number' || + typeof typeNode.literal.value === 'string' || + typeof typeNode.literal.value === 'boolean')) { + return { type: 'literal', value: typeNode.literal.value }; + } + break; case AST_NODE_TYPES.TSTypeLiteral: return { type: 'hash', value: typeNode }; - case AST_NODE_TYPES.TSUnknownKeyword: + case AST_NODE_TYPES.TSUnionType: + case AST_NODE_TYPES.TSIntersectionType: + return { + type: typeNode.type === AST_NODE_TYPES.TSUnionType ? 'union' : 'intersection', + elements: typeNode.types + .map(type => this.getRangeFromTypeNode(classLoaded, type, errorIdentifier)), + }; case AST_NODE_TYPES.TSUndefinedKeyword: + return { type: 'undefined' }; + case AST_NODE_TYPES.TSUnknownKeyword: case AST_NODE_TYPES.TSVoidKeyword: case AST_NODE_TYPES.TSNullKeyword: case AST_NODE_TYPES.TSAnyKeyword: - case AST_NODE_TYPES.TSUnionType: + return { type: 'wildcard' }; + case AST_NODE_TYPES.TSFunctionType: + case AST_NODE_TYPES.TSImportType: + case AST_NODE_TYPES.TSMappedType: + case AST_NODE_TYPES.TSNeverKeyword: + // TODO: These types are explicitly not supported at the moment + return { type: 'wildcard' }; case AST_NODE_TYPES.TSTupleType: - return { type: 'undefined' }; + return { + type: 'tuple', + elements: typeNode.elementTypes + .map(type => this.getRangeFromTypeNode(classLoaded, type, errorIdentifier)), + }; + case AST_NODE_TYPES.TSArrayType: + return { + type: 'array', + value: this.getRangeFromTypeNode(classLoaded, typeNode.elementType, errorIdentifier), + }; + case AST_NODE_TYPES.TSRestType: + return { + type: 'rest', + value: this.getRangeFromTypeNode(classLoaded, typeNode.typeAnnotation, errorIdentifier), + }; + case AST_NODE_TYPES.TSTypeOperator: + if (typeNode.operator === 'keyof' && typeNode.typeAnnotation) { + return { + type: 'keyof', + value: this.getRangeFromTypeNode(classLoaded, typeNode.typeAnnotation, errorIdentifier), + }; + } + break; + case AST_NODE_TYPES.TSTypeQuery: + if (typeNode.exprName.type === AST_NODE_TYPES.Identifier) { + return { + type: 'typeof', + value: typeNode.exprName.name, + origin: classLoaded, + }; + } + if (typeNode.exprName.type === AST_NODE_TYPES.TSQualifiedName) { + // Otherwise we have a qualified name: AST_NODE_TYPES.TSQualifiedName + return { + type: 'typeof', + value: typeNode.exprName.right.name, + qualifiedPath: this.getQualifiedPath(typeNode.exprName.left), + origin: classLoaded, + }; + } + break; + case AST_NODE_TYPES.TSIndexedAccessType: + return { + type: 'indexed', + object: this.getRangeFromTypeNode(classLoaded, typeNode.objectType, errorIdentifier), + index: this.getRangeFromTypeNode(classLoaded, typeNode.indexType, errorIdentifier), + }; } - throw new Error(`Could not understand parameter type ${typeNode.type} of ${errorIdentifier - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); + this.throwOrWarn(new Error(`Could not understand parameter type ${typeNode.type} of ${errorIdentifier + } in ${classLoaded.localName} at ${classLoaded.fileName}`)); + return { type: 'wildcard' }; } - public getFieldRange(field: Identifier | TSPropertySignature, commentData: CommentData): ParameterRangeUnresolved { - // Check comment data - if (commentData.range) { - return commentData.range; + protected getGenericTypeParameterInstantiations( + typeParameters: TSESTree.TSTypeParameterInstantiation, + classLoaded: ClassReferenceLoaded, + ): ParameterRangeUnresolved[] { + return typeParameters.params + .map(genericTypeParameter => this.getRangeFromTypeNode( + classLoaded, + genericTypeParameter, + `generic type instantiation on ${classLoaded.localName} in ${classLoaded.fileName}`, + )); + } + + protected getQualifiedPath(qualifiedEntity: TSESTree.EntityName): string[] { + switch (qualifiedEntity.type) { + case AST_NODE_TYPES.TSQualifiedName: + return [ ...this.getQualifiedPath(qualifiedEntity.left), qualifiedEntity.right.name ]; + case AST_NODE_TYPES.Identifier: + return [ qualifiedEntity.name ]; + case AST_NODE_TYPES.ThisExpression: { + throw new Error('Not implemented yet: AST_NODE_TYPES.ThisExpression case'); + } } + } + + public getFieldRange( + classLoaded: ClassReferenceLoaded, + field: TSESTree.Identifier | TSESTree.TSPropertySignature, + commentData: CommentData, + ): ParameterRangeUnresolved { + let range: ParameterRangeUnresolved | undefined; // Check the typescript raw field type if (field.typeAnnotation) { - return this.getRangeFromTypeNode(field.typeAnnotation.typeAnnotation, this.getErrorIdentifierField(field)); + range = this.getRangeFromTypeNode( + classLoaded, + field.typeAnnotation.typeAnnotation, + this.getErrorIdentifierField(classLoaded, field), + ); + } + + // Throw if no range was found + if (!range) { + this.throwOrWarn(new Error(`Missing field type on ${this.getFieldName(classLoaded, field) + } in ${classLoaded.localName} at ${classLoaded.fileName}`)); + return { type: 'wildcard' }; + } + + // If the field has the '?' annotation, explicitly allow undefined as value to make it be considered optional. + if (field.optional) { + if (range.type === 'union') { + // Don't add undefined element if it is already present + if (!range.elements.some(element => element.type === 'undefined')) { + range.elements.push({ type: 'undefined' }); + } + } else { + range = { + type: 'union', + elements: [ + range, + { type: 'undefined' }, + ], + }; + } + } + + // Check comment data + if (commentData.range) { + range = this.overrideRawRange(range, commentData.range); } - throw new Error(`Missing field type on ${this.getFieldName(field) - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); + return range; } - public getFieldDefault(commentData: CommentData): string | undefined { - return commentData.default; + /** + * Apply a range override on the given range + * @param range The range to override in. + * @param override The range set set. + */ + public overrideRawRange( + range: ParameterRangeUnresolved, + override: ParameterRangeUnresolved, + ): ParameterRangeUnresolved { + switch (range.type) { + case 'raw': + case 'literal': + case 'hash': + case 'interface': + case 'genericTypeReference': + case 'typeof': + case 'indexed': + // Replace these types + return override; + case 'undefined': + case 'wildcard': + case 'override': + // Override has no effect here + return range; + case 'union': + case 'intersection': + case 'tuple': + // Recursively apply override operation on elements + return { + type: range.type, + elements: range.elements.map(element => this.overrideRawRange(element, override)), + }; + case 'rest': + case 'array': + case 'keyof': + // Recursively apply override operation on value + return { + type: range.type, + // TODO: remove the following any cast when TS bug is fixed + value: this.overrideRawRange(range.value, override), + }; + } } public getFieldComment(commentData: CommentData): string | undefined { @@ -282,23 +595,24 @@ export class ParameterLoader { /** * Load the parameter data from the given index signature. + * @param classLoaded The loaded class in which the field is defined. * @param indexSignature An index signature. * @param commentData Comment data about the given field. */ - public loadIndex(indexSignature: TSIndexSignature, commentData: CommentData): - ParameterDataIndex { + public loadIndex( + classLoaded: ClassReferenceLoaded, + indexSignature: TSESTree.TSIndexSignature, + commentData: CommentData, + ): ParameterDataIndex { // Required data const parameterData: ParameterDataIndex = { type: 'index', - domain: this.getIndexDomain(indexSignature), - range: this.getIndexRange(indexSignature, commentData), + domain: this.getIndexDomain(classLoaded, indexSignature), + range: this.getIndexRange(classLoaded, indexSignature, commentData), }; // Optional data - const defaultValue = this.getFieldDefault(commentData); - if (defaultValue) { - parameterData.default = defaultValue; - } + parameterData.defaults = commentData.defaults; const comment = this.getFieldComment(commentData); if (comment) { @@ -308,29 +622,39 @@ export class ParameterLoader { return parameterData; } - public getIndexDomain(indexSignature: TSIndexSignature): 'string' | 'number' | 'boolean' { + public getIndexDomain( + classLoaded: ClassReferenceLoaded, + indexSignature: TSESTree.TSIndexSignature, + ): 'string' | 'number' | 'boolean' { if (indexSignature.parameters.length !== 1) { throw new Error(`Expected exactly one key in index signature in ${ - this.classLoaded.localName} at ${this.classLoaded.fileName}`); + classLoaded.localName} at ${classLoaded.fileName}`); } if (indexSignature.parameters[0].type !== 'Identifier') { throw new Error(`Only identifier-based index signatures are allowed in ${ - this.classLoaded.localName} at ${this.classLoaded.fileName}`); + classLoaded.localName} at ${classLoaded.fileName}`); } if (!indexSignature.parameters[0].typeAnnotation) { throw new Error(`Missing key type annotation in index signature in ${ - this.classLoaded.localName} at ${this.classLoaded.fileName}`); + classLoaded.localName} at ${classLoaded.fileName}`); } - const type = this.getRangeFromTypeNode(indexSignature.parameters[0].typeAnnotation.typeAnnotation, - this.getErrorIdentifierIndex()); + const type = this.getRangeFromTypeNode( + classLoaded, + indexSignature.parameters[0].typeAnnotation.typeAnnotation, + this.getErrorIdentifierIndex(), + ); if (type.type !== 'raw') { throw new Error(`Only raw types are allowed in index signature keys in ${ - this.classLoaded.localName} at ${this.classLoaded.fileName}`); + classLoaded.localName} at ${classLoaded.fileName}`); } return type.value; } - public getIndexRange(indexSignature: TSIndexSignature, commentData: CommentData): ParameterRangeUnresolved { + public getIndexRange( + classLoaded: ClassReferenceLoaded, + indexSignature: TSESTree.TSIndexSignature, + commentData: CommentData, + ): ParameterRangeUnresolved { // Check comment data if (commentData.range) { return commentData.range; @@ -338,18 +662,23 @@ export class ParameterLoader { // Check the typescript raw field type if (indexSignature.typeAnnotation) { - return this.getRangeFromTypeNode(indexSignature.typeAnnotation.typeAnnotation, this.getErrorIdentifierIndex()); + return this.getRangeFromTypeNode( + classLoaded, + indexSignature.typeAnnotation.typeAnnotation, + this.getErrorIdentifierIndex(), + ); } - throw new Error(`Missing field type on ${this.getErrorIdentifierIndex() - } in ${this.classLoaded.localName} at ${this.classLoaded.fileName}`); + this.throwOrWarn(new Error(`Missing field type on ${this.getErrorIdentifierIndex() + } in ${classLoaded.localName} at ${classLoaded.fileName}`)); + return { type: 'wildcard' }; } /** * Iterate over all type reference override handler to see if one of them overrides the given type. * @param typeNode A type reference node. */ - public handleTypeOverride(typeNode: TSTypeReference): ParameterRangeUnresolved | undefined { + public handleTypeOverride(typeNode: TSESTree.TSTypeReference): ParameterRangeUnresolved | undefined { for (const typeReferenceOverride of ParameterLoader.typeReferenceOverrides) { const handled = typeReferenceOverride.handle(typeNode); if (handled) { @@ -357,10 +686,20 @@ export class ParameterLoader { } } } + + protected throwOrWarn(error: Error): void { + if (this.hardErrorUnsupported) { + throw error; + } else { + this.logger.error(error.message); + } + } } export interface ParameterLoaderArgs { - classLoaded: ClassReferenceLoaded; + commentLoader: CommentLoader; + hardErrorUnsupported: boolean; + logger: Logger; } export type ParameterData = ParameterDataField | ParameterDataIndex; @@ -374,27 +713,22 @@ export interface ParameterDataField { * The parameter name. */ name: string; - /** - * If only one value for the given parameter can exist. - * This is always false for an array. - */ - unique: boolean; - /** - * If the parameter MUST have a value. - */ - required: boolean; /** * The range of the parameter values. */ range: R; /** - * The default value. + * The default values. */ - default?: string; + defaults?: DefaultValue[]; /** * The human-readable description of this parameter. */ comment?: string; + /** + * The nested default values on parameters. + */ + defaultNested?: DefaultNested[]; } export interface ParameterDataIndex { @@ -410,44 +744,205 @@ export interface ParameterDataIndex { * The range of the parameter values. */ range: R; + /** + * The default values. + */ + defaults?: DefaultValue[]; + /** + * The human-readable description of this parameter. + */ + comment?: string; +} + +export interface GenericTypeParameterData { + /** + * The generic type parameter name. + */ + name: string; + /** + * The range of the generic type parameter. + */ + range?: R; /** * The default value. */ - default?: string; + default?: R; /** * The human-readable description of this parameter. */ comment?: string; } +export interface MemberParameterData { + /** + * The member name. + */ + name: string; + /** + * The range of the member parameter. + */ + range?: R; + /** + * The human-readable description of this member. + */ + comment?: string; +} + +/** + * Extension information + */ +export interface ExtensionData { + classLoaded: ClassReferenceLoaded; + genericTypeInstantiations: R[]; +} + export type ParameterRangeUnresolved = { type: 'raw'; value: 'boolean' | 'number' | 'string'; +} | { + type: 'literal'; + value: boolean | number | string; } | { type: 'override'; value: string; } | { type: 'interface'; value: string; + /** + * For qualified names, this array contains the path segments. + */ + qualifiedPath?: string[]; + genericTypeParameterInstantiations: ParameterRangeUnresolved[] | undefined; + /** + * The place from which the interface was referenced. + */ + origin: ClassReferenceLoaded; } | { type: 'hash'; - value: TSTypeLiteral; + value: TSESTree.TSTypeLiteral; } | { type: 'undefined'; +} | { + type: 'wildcard'; +} | { + type: 'union'; + elements: ParameterRangeUnresolved[]; +} | { + type: 'intersection'; + elements: ParameterRangeUnresolved[]; +} | { + type: 'tuple'; + elements: ParameterRangeUnresolved[]; +} | { + type: 'rest'; + value: ParameterRangeUnresolved; +} | { + type: 'array'; + value: ParameterRangeUnresolved; +} | { + type: 'keyof'; + value: ParameterRangeUnresolved; +} | { + type: 'genericTypeReference'; + value: string; +} | { + type: 'typeof'; + value: string; + /** + * For qualified names, this array contains the path segments. + */ + qualifiedPath?: string[]; + /** + * The place from which the interface was referenced. + */ + origin: ClassReferenceLoaded; +} | { + type: 'indexed'; + object: ParameterRangeUnresolved; + index: ParameterRangeUnresolved; }; export type ParameterRangeResolved = { type: 'raw'; value: 'boolean' | 'number' | 'string'; +} | { + type: 'literal'; + value: boolean | number | string; } | { type: 'override'; value: string; } | { type: 'class'; value: ClassReferenceLoaded; + genericTypeParameterInstances: ParameterRangeResolved[] | undefined; } | { type: 'nested'; value: ParameterData[]; } | { type: 'undefined'; +} | { + type: 'wildcard'; +} | { + type: 'union'; + elements: ParameterRangeResolved[]; +} | { + type: 'intersection'; + elements: ParameterRangeResolved[]; +} | { + type: 'tuple'; + elements: ParameterRangeResolved[]; +} | { + type: 'rest'; + value: ParameterRangeResolved; +} | { + type: 'array'; + value: ParameterRangeResolved; +} | { + type: 'keyof'; + value: ParameterRangeResolved; +} | { + type: 'genericTypeReference'; + value: string; + /** + * The place in which the generic type was defined. + */ + origin: ClassReferenceLoaded; +} | { + type: 'typeof'; + value: ParameterRangeResolved; +} | { + type: 'indexed'; + object: ParameterRangeResolved; + index: ParameterRangeResolved; +}; + +/** + * Represents a default value that is to be set on a nested parameter, + * indicated by a path of parameter keys. + */ +export interface DefaultNested { + /** + * The path of parameter keys in which the default value applies. + */ + paramPath: string[]; + /** + * A default value for the path. + */ + value: DefaultValue; +} + +/** + * A default value + */ +export type DefaultValue = { + type: 'raw'; + value: string; +} | { + type: 'iri'; + value?: string; + typeIri?: string; + /** + * The component reference for relative IRIs. + */ + baseComponent: ClassReference; }; diff --git a/lib/parse/ParameterResolver.ts b/lib/parse/ParameterResolver.ts index 027845f..7cc172e 100644 --- a/lib/parse/ParameterResolver.ts +++ b/lib/parse/ParameterResolver.ts @@ -1,42 +1,53 @@ -import type { TSTypeLiteral } from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; -import type { ClassIndex, ClassLoaded, ClassReference, ClassReferenceLoaded, InterfaceLoaded } from './ClassIndex'; +import { LRUCache } from 'lru-cache'; +import type { + ClassIndex, + ClassReference, + ClassReferenceLoaded, + InterfaceLoaded, +} from './ClassIndex'; import type { ClassLoader } from './ClassLoader'; import type { ConstructorData } from './ConstructorLoader'; -import type { ParameterData, - ParameterDataField, +import type { GenericsData } from './GenericsLoader'; +import type { MemberData } from './MemberLoader'; +import type { + ExtensionData, + GenericTypeParameterData, + ParameterData, ParameterRangeResolved, - ParameterRangeUnresolved } from './ParameterLoader'; -import { + ParameterRangeUnresolved, ParameterLoader, + MemberParameterData, } from './ParameterLoader'; export class ParameterResolver { private readonly classLoader: ClassLoader; + private readonly parameterLoader: ParameterLoader; private readonly ignoreClasses: Record; + private readonly cacheInterfaceRange: LRUCache>; public constructor(args: ParameterResolverArgs) { this.classLoader = args.classLoader; + this.parameterLoader = args.parameterLoader; this.ignoreClasses = args.ignoreClasses; + this.cacheInterfaceRange = new LRUCache({ max: 2_048 }); } /** * Resolve all constructor parameters of a given constructor index. * @param unresolvedParametersIndex An index of unresolved constructor data. - * @param classIndex A class index. */ public async resolveAllConstructorParameters( unresolvedParametersIndex: ClassIndex>, - classIndex: ClassIndex, ): Promise>> { const resolvedParametersIndex: ClassIndex> = {}; // Resolve parameters for the different constructors in parallel await Promise.all(Object.entries(unresolvedParametersIndex) .map(async([ className, parameters ]) => { - const classOrInterface = classIndex[className]; - if (classOrInterface.type === 'class') { - resolvedParametersIndex[className] = await this.resolveConstructorParameters(parameters, classOrInterface); + if (parameters.classLoaded.type === 'class') { + resolvedParametersIndex[className] = await this.resolveConstructorParameters(parameters); } })); @@ -46,88 +57,495 @@ export class ParameterResolver { /** * Resolve all parameters of a given constructor. * @param unresolvedConstructorData Unresolved constructor data. - * @param owningClass The class in which the given constructor is declared. */ public async resolveConstructorParameters( unresolvedConstructorData: ConstructorData, - owningClass: ClassLoaded, ): Promise> { return { - parameters: await this.resolveParameterData(unresolvedConstructorData.parameters, owningClass), + parameters: (await this.resolveParameterData( + unresolvedConstructorData.parameters, + unresolvedConstructorData.classLoaded, + {}, + new Set(), + )).filter(parameter => parameter.type === 'field'), + classLoaded: unresolvedConstructorData.classLoaded, }; } + /** + * Resolve all generic type parameters of a given constructor index. + * @param unresolvedParametersIndex An index of unresolved constructor data. + */ + public async resolveAllGenericTypeParameterData( + unresolvedParametersIndex: ClassIndex>, + ): Promise>> { + const resolvedGenericsIndex: ClassIndex> = {}; + + // Resolve parameters for the different constructors in parallel + await Promise.all(Object.entries(unresolvedParametersIndex) + .map(async([ className, unresolvedGenericsData ]) => { + resolvedGenericsIndex[className] = { + genericTypeParameters: await this.resolveGenericTypeParameterData( + unresolvedGenericsData.genericTypeParameters, + unresolvedGenericsData.classLoaded, + {}, + ), + classLoaded: unresolvedGenericsData.classLoaded, + }; + })); + + return resolvedGenericsIndex; + } + + /** + * Resolve the given array of generic type parameter data in parallel. + * @param genericTypeParameters An array of unresolved generic type parameters. + * @param owningClass The class in which the given generic type parameters are declared. + * @param genericTypeRemappings A remapping of generic type names. + */ + public async resolveGenericTypeParameterData( + genericTypeParameters: GenericTypeParameterData[], + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + ): Promise[]> { + return await Promise.all(genericTypeParameters + .map(async generic => ({ + ...generic, + range: generic.range ? + await this.resolveRange(generic.range, owningClass, genericTypeRemappings, false, new Set()) : + undefined, + default: generic.default ? + await this.resolveRange(generic.default, owningClass, genericTypeRemappings, false, new Set()) : + undefined, + }))); + } + + /** + * Resolve all member parameters of a given constructor index. + * @param unresolvedParametersIndex An index of unresolved constructor data. + */ + public async resolveAllMemberParameterData( + unresolvedParametersIndex: ClassIndex>, + ): Promise>> { + const resolvedIndex: ClassIndex> = {}; + + // Resolve parameters for the different constructors in parallel + await Promise.all(Object.entries(unresolvedParametersIndex) + .map(async([ className, unresolvedData ]) => { + resolvedIndex[className] = { + members: await this.resolveMemberParameterData(unresolvedData.members, unresolvedData.classLoaded, {}), + classLoaded: unresolvedData.classLoaded, + }; + })); + + return resolvedIndex; + } + + /** + * Resolve the given array of member parameter data in parallel. + * @param members An array of unresolved members. + * @param owningClass The class in which the given generic type parameters are declared. + * @param genericTypeRemappings A remapping of generic type names. + */ + public async resolveMemberParameterData( + members: MemberParameterData[], + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + ): Promise[]> { + return await Promise.all(members + .map(async member => ({ + ...member, + range: member.range ? + await this.resolveRange(member.range, owningClass, genericTypeRemappings, false, new Set()) : + undefined, + }))); + } + /** * Resolve the given array of parameter data in parallel. * @param parameters An array of unresolved parameters. * @param owningClass The class in which the given parameters are declared. + * @param genericTypeRemappings A remapping of generic type names. + * @param handlingInterfaces The names of interfaces that are being handled, and this interface is a part of. */ public async resolveParameterData( parameters: ParameterData[], owningClass: ClassReferenceLoaded, - ): Promise[]> { + genericTypeRemappings: Record, + handlingInterfaces: Set, + ): Promise[]> { return await Promise.all(parameters - .map(async parameter => ({ ...parameter, range: await this.resolveRange(parameter.range, owningClass) }))); + .map(async parameter => ({ + ...parameter, + range: await this.resolveRange(parameter.range, owningClass, genericTypeRemappings, true, handlingInterfaces), + }))); + } + + /** + * Resolve all extension data of a given constructor index. + * @param unresolvedExtensionData An index of unresolved constructor data. + * @param classIndex The class index containing the owning class references. + */ + public async resolveAllExtensionData( + unresolvedExtensionData: ClassIndex[]>, + classIndex: ClassIndex, + ): Promise[]>> { + const resolvedIndex: ClassIndex[]> = {}; + + // Resolve parameters for the different constructors in parallel + await Promise.all(Object.entries(unresolvedExtensionData) + .map(async([ className, extensionData ]) => { + resolvedIndex[className] = await this.resolveExtensionData(extensionData, classIndex[className], {}); + })); + + return resolvedIndex; + } + + /** + * Resolve the given array of generic type parameter data in parallel. + * @param extensionDatas The extensions of the class. + * @param owningClass The class in which the given generic type parameters are declared. + * @param genericTypeRemappings A remapping of generic type names. + */ + public async resolveExtensionData( + extensionDatas: ExtensionData[], + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + ): Promise[]> { + return await Promise.all(extensionDatas.map(async extensionData => ({ + classLoaded: extensionData.classLoaded, + genericTypeInstantiations: await Promise.all(extensionData.genericTypeInstantiations + .map(async genericTypeInstantiation => await this.resolveRange( + genericTypeInstantiation, + owningClass, + genericTypeRemappings, + false, + new Set(), + ))), + }))); + } + + protected isIgnored(qualifiedPath: string[] | undefined, className: string): boolean { + if (qualifiedPath && qualifiedPath.length > 0) { + className = `${qualifiedPath.join('.')}.${className}`; + } + return className in this.ignoreClasses; } /** * Resolve the given parameter range. * @param range An unresolved parameter range. * @param owningClass The class this range was defined in. + * @param genericTypeRemappings A remapping of generic type names. + * @param getNestedFields If Records and interfaces should produce nested field ranges. + * @param handlingInterfaces The names of interfaces that are being handled, and this interface is a part of. */ - public async resolveRange(range: ParameterRangeUnresolved, owningClass: ClassReferenceLoaded): - Promise { + public async resolveRange( + range: ParameterRangeUnresolved, + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + getNestedFields: boolean, + handlingInterfaces: Set, + ): Promise { switch (range.type) { case 'raw': + case 'literal': case 'override': return range; case 'interface': - if (range.value in this.ignoreClasses) { + if (this.isIgnored(range.qualifiedPath, range.value)) { return { - type: 'undefined', + type: 'wildcard', }; } - return await this.resolveRangeInterface(range.value, owningClass); + + // If we detect an infinite recursion for a nested interface field, stop the recursion. + + if (getNestedFields) { + const interfaceKey = this.hashParameterRangeUnresolved(range); + if (handlingInterfaces.has(interfaceKey)) { + getNestedFields = false; + } else { + handlingInterfaces = new Set(handlingInterfaces); + handlingInterfaces.add(interfaceKey); + } + } + + return await this.resolveRangeInterface( + range.value, + range.qualifiedPath, + range.genericTypeParameterInstantiations, + range.origin, + owningClass, + genericTypeRemappings, + getNestedFields, + handlingInterfaces, + ); case 'hash': return { type: 'nested', - value: await this.getNestedFieldsFromHash(range.value, owningClass), + value: await this + .getNestedFieldsFromHash(range.value, owningClass, genericTypeRemappings, handlingInterfaces), + }; + case 'wildcard': + return { + type: 'wildcard', }; case 'undefined': return { type: 'undefined', }; + case 'union': + case 'intersection': + case 'tuple': + return { + type: range.type, + elements: await Promise.all(range.elements + .map(child => this + .resolveRange(child, owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces))), + }; + case 'array': + case 'rest': + case 'keyof': + // Special case: if we have a `keyof typeof Enum`, return a union of the keys of the enum + if (range.value.type === 'typeof') { + const classOrInterface = await this.loadClassOrInterfacesChain({ + packageName: owningClass.packageName, + localName: range.value.value, + qualifiedPath: range.value.qualifiedPath, + fileName: owningClass.fileName, + fileNameReferenced: owningClass.fileNameReferenced, + }); + + if (classOrInterface.type === 'enum') { + const enumRangeTypes: ParameterRangeResolved[] = await Promise.all(classOrInterface.declaration.members + // eslint-disable-next-line array-callback-return + .map((enumMember) => { + const key = enumMember.id; + switch (key.type) { + case AST_NODE_TYPES.Literal: + return { type: 'literal', value: key.value }; + case AST_NODE_TYPES.Identifier: + return { type: 'literal', value: key.name }; + } + })); + return { + type: 'union', + elements: enumRangeTypes, + }; + } + } + + return { + type: range.type, + // TODO: remove the following any cast when TS bug is fixed + value: await this + .resolveRange(range.value, owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces), + }; + case 'genericTypeReference': + // If this generic type was remapped, return that remapped type + if (range.value in genericTypeRemappings) { + const mapped = genericTypeRemappings[range.value]; + // Avoid infinite recursion via mapping to itself + if (mapped.type !== 'genericTypeReference' || mapped.value !== range.value) { + return this + .resolveRange(mapped, owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces); + } + } + return { + type: 'genericTypeReference', + value: range.value, + origin: owningClass, + }; + case 'typeof': + throw new Error(`Detected typeof of unsupported value ${range.value} in ${owningClass.fileName}`); + case 'indexed': + return { + type: 'indexed', + object: await this + .resolveRange(range.object, owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces), + index: await this + .resolveRange(range.index, owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces), + }; + } + } + + /** + * Hash the given parameter range to a unique string representation. + * @param range An unresolved range. + */ + public hashParameterRangeUnresolved(range: ParameterRangeUnresolved): string { + switch (range.type) { + case 'undefined': + return 'undefined'; + case 'wildcard': + return 'wildcard'; + case 'interface': + case 'genericTypeReference': + case 'raw': + case 'literal': + case 'override': + case 'typeof': + return `${range.type}:${range.value}`; + case 'union': + case 'intersection': + case 'tuple': + return `${range.type}:[${range.elements.map(element => this.hashParameterRangeUnresolved(element)).join(',')}]`; + case 'rest': + case 'array': + case 'keyof': + return `${range.type}:[${this.hashParameterRangeUnresolved(range.value)}]`; + case 'hash': + return `hash:${JSON.stringify(range.value)}`; + case 'indexed': + return `${range.type}:[${this.hashParameterRangeUnresolved(range.object)};${this.hashParameterRangeUnresolved(range.index)}]`; } } /** * Resolve a class or interface. * @param interfaceName A class or interface name. + * @param qualifiedPath Qualified path to the class or interface. Is undefined if there is no qualified path. + * @param genericTypeParameterInstances Generic type parameters that were supplied for instantiation. + * Note that these generics are NOT the same as the generics that may be defined + * within the class itself. * @param owningClass The class this interface was used in. + * @param rootOwningClass The top-level class this interface was used in. Necessary for generic type resolution. + * @param genericTypeRemappings A remapping of generic type names. + * @param getNestedFields If Records and interfaces should produce nested field ranges. + * @param handlingInterfaces The names of interfaces that are being handled, and this interface is a part of. */ - public async resolveRangeInterface( + public resolveRangeInterface( + interfaceName: string, + qualifiedPath: string[] | undefined, + genericTypeParameterInstances: ParameterRangeUnresolved[] | undefined, + owningClass: ClassReferenceLoaded, + rootOwningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + getNestedFields: boolean, + handlingInterfaces: Set, + ): Promise { + const cacheKeyGenerics = genericTypeParameterInstances ? + genericTypeParameterInstances.map(genericTypeParameterInstance => this + .hashParameterRangeUnresolved(genericTypeParameterInstance)).join(',') : + ''; + const cacheKey = `${interfaceName}::${(qualifiedPath ?? []).join('.')}::${cacheKeyGenerics}::${owningClass.fileName}::${getNestedFields}`; + let promise = this.cacheInterfaceRange.get(cacheKey); + if (!promise) { + promise = this.resolveRangeInterfaceInner( + interfaceName, + qualifiedPath, + genericTypeParameterInstances, + owningClass, + rootOwningClass, + genericTypeRemappings, + getNestedFields, + handlingInterfaces, + ); + this.cacheInterfaceRange.set(cacheKey, promise); + } + return promise; + } + + protected async resolveRangeInterfaceInner( interfaceName: string, + qualifiedPath: string[] | undefined, + genericTypeParameterInstances: ParameterRangeUnresolved[] | undefined, owningClass: ClassReferenceLoaded, + rootOwningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + getNestedFields: boolean, + handlingInterfaces: Set, ): Promise { const classOrInterface = await this.loadClassOrInterfacesChain({ packageName: owningClass.packageName, localName: interfaceName, + qualifiedPath, fileName: owningClass.fileName, + fileNameReferenced: owningClass.fileNameReferenced, }); // If we find a class, or an interface that is implicitly a class, return the class reference directly if (classOrInterface.type === 'class' || - (classOrInterface.type === 'interface' && this.isInterfaceImplicitClass(classOrInterface))) { + (classOrInterface.type === 'interface' && + (!getNestedFields || this.isInterfaceImplicitClass(classOrInterface)))) { return { type: 'class', value: classOrInterface, + genericTypeParameterInstances: genericTypeParameterInstances ? + await Promise.all(genericTypeParameterInstances + .map(genericTypeParameter => this.resolveRange( + genericTypeParameter, + rootOwningClass, + genericTypeRemappings, + getNestedFields, + handlingInterfaces, + ))) : + undefined, + }; + } + + // If we find a type alias, just interpret the type directly + if (classOrInterface.type === 'type') { + // Error on unsupported recursive types + const interfaceKey = this.hashParameterRangeUnresolved({ + type: 'interface', + value: classOrInterface.localName, + genericTypeParameterInstantiations: [], + origin: undefined, + }); + if (!getNestedFields && handlingInterfaces.has(interfaceKey)) { + throw new Error(`Detected unsupported recursive type definition on ${classOrInterface.localName}`); + } + + const unresolvedFields = this.parameterLoader.getRangeFromTypeNode( + classOrInterface, + classOrInterface.declaration.typeAnnotation, + `type alias ${classOrInterface.localName} in ${classOrInterface.fileName}`, + ); + return this + .resolveRange(unresolvedFields, classOrInterface, genericTypeRemappings, getNestedFields, handlingInterfaces); + } + + // If we find an enum, just interpret the enum value, and return as union type + if (classOrInterface.type === 'enum') { + const enumRangeTypes = await Promise.all(classOrInterface.declaration.members + .map((enumMember, i) => { + if (enumMember.initializer && enumMember.initializer.type === AST_NODE_TYPES.Literal) { + return this.resolveRange(this.parameterLoader.getRangeFromTypeNode( + classOrInterface, + { + type: AST_NODE_TYPES.TSLiteralType, + literal: enumMember.initializer, + loc: undefined, + range: undefined, + parent: undefined, + }, + `enum ${classOrInterface.localName} in ${classOrInterface.fileName}`, + ), owningClass, genericTypeRemappings, getNestedFields, handlingInterfaces); + } + throw new Error(`Detected enum ${classOrInterface.localName} having an unsupported member (member ${i}) in ${classOrInterface.fileName}`); + })); + return { + type: 'union', + elements: enumRangeTypes, }; } // If we find an interface, load it as a hash with nested fields + if (genericTypeParameterInstances) { + // If the interfaces has generic type instantiations, + // map the generic type declarations of the class on the generic types of the interface + const ifaceGenericTypes = Object.keys(classOrInterface.generics); + for (const [ i, genericTypeParameterInstance ] of genericTypeParameterInstances.entries()) { + genericTypeRemappings[ifaceGenericTypes[i]] = genericTypeParameterInstance; + } + } + return { type: 'nested', - value: await this.getNestedFieldsFromInterface(classOrInterface), + value: await this + .getNestedFieldsFromInterface(classOrInterface, rootOwningClass, genericTypeRemappings, handlingInterfaces), }; } @@ -158,53 +576,82 @@ export class ParameterResolver { * * @param classReference A class reference. */ - public async loadClassOrInterfacesChain(classReference: ClassReference): Promise { - const classOrInterface = await this.classLoader.loadClassDeclaration(classReference, true); + public async loadClassOrInterfacesChain(classReference: ClassReference): Promise { + const classOrInterface = await this.classLoader.loadClassDeclaration(classReference, true, true); // If the result is an interface, load all its super interfaces recursively if (classOrInterface.type === 'interface') { classOrInterface.superInterfaces = await Promise.all(this.classLoader .getSuperInterfaceNames(classOrInterface.declaration, classOrInterface.fileName) - .filter(interfaceName => !(interfaceName in this.ignoreClasses)) - .map(async interfaceName => { + .filter(interfaceName => !this.isIgnored(classReference.qualifiedPath, interfaceName.value)) + .map(async(interfaceName) => { const superInterface = await this.loadClassOrInterfacesChain({ packageName: classOrInterface.packageName, - localName: interfaceName, + localName: interfaceName.value, + qualifiedPath: [], fileName: classOrInterface.fileName, + fileNameReferenced: classOrInterface.fileNameReferenced, }); if (superInterface.type !== 'interface') { - throw new Error(`Detected interface ${classOrInterface.localName} extending from a class ${interfaceName} in ${classReference.fileName}`); + throw new Error(`Detected interface ${classOrInterface.localName} extending from a non-interface ${interfaceName.value} in ${classReference.fileName}`); } - return superInterface; + return { value: superInterface, genericTypeInstantiations: interfaceName.genericTypeInstantiations }; })); } + + // If the result is a type, check if it is an alias for another interface, and load that + if (classOrInterface.type === 'type' && + classOrInterface.declaration.typeAnnotation.type === AST_NODE_TYPES.TSTypeReference && + classOrInterface.declaration.typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier) { + return await this.loadClassOrInterfacesChain({ + packageName: classOrInterface.packageName, + localName: classOrInterface.declaration.typeAnnotation.typeName.name, + qualifiedPath: [], + fileName: classOrInterface.fileName, + fileNameReferenced: classOrInterface.fileNameReferenced, + }); + } + return classOrInterface; } /** * Recursively get all fields from the given interface. * @param iface A loaded interface. + * @param owningClass The class this hash is declared in. + * @param genericTypeRemappings A remapping of generic type names. + * @param handlingInterfaces The names of interfaces that are being handled, and this interface is a part of. */ - public async getNestedFieldsFromInterface(iface: InterfaceLoaded): Promise[]> { - const parameterLoader = new ParameterLoader({ classLoaded: iface }); - const unresolvedFields = parameterLoader.loadInterfaceFields(iface); - return this.resolveParameterData(unresolvedFields, iface); + public async getNestedFieldsFromInterface( + iface: InterfaceLoaded, + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + handlingInterfaces: Set, + ): Promise[]> { + const unresolvedFields = this.parameterLoader.loadInterfaceFields(iface); + return await this.resolveParameterData(unresolvedFields, owningClass, genericTypeRemappings, handlingInterfaces); } /** * Recursively get all fields from the given hash. * @param hash A hash object. * @param owningClass The class this hash is declared in. + * @param genericTypeRemappings A remapping of generic type names. + * @param handlingInterfaces The names of interfaces that are being handled, and this interface is a part of. */ - public async getNestedFieldsFromHash(hash: TSTypeLiteral, owningClass: ClassReferenceLoaded): - Promise[]> { - const parameterLoader = new ParameterLoader({ classLoaded: owningClass }); - const unresolvedFields = parameterLoader.loadHashFields(hash); - return this.resolveParameterData(unresolvedFields, owningClass); + public async getNestedFieldsFromHash( + hash: TSESTree.TSTypeLiteral, + owningClass: ClassReferenceLoaded, + genericTypeRemappings: Record, + handlingInterfaces: Set, + ): Promise[]> { + const unresolvedFields = this.parameterLoader.loadHashFields(owningClass, hash); + return this.resolveParameterData(unresolvedFields, owningClass, genericTypeRemappings, handlingInterfaces); } } export interface ParameterResolverArgs { classLoader: ClassLoader; + parameterLoader: ParameterLoader; ignoreClasses: Record; } diff --git a/lib/parse/typereferenceoverride/TypeReferenceOverride.ts b/lib/parse/typereferenceoverride/TypeReferenceOverride.ts index 9ae3d74..d284cfa 100644 --- a/lib/parse/typereferenceoverride/TypeReferenceOverride.ts +++ b/lib/parse/typereferenceoverride/TypeReferenceOverride.ts @@ -1,4 +1,4 @@ -import type { TSTypeReference } from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; import type { ParameterRangeUnresolved } from '../ParameterLoader'; /** @@ -10,5 +10,5 @@ export interface TypeReferenceOverride { * Returns undefined if this handler is not applicable. * @param typeNode A type node. */ - handle: (typeNode: TSTypeReference) => ParameterRangeUnresolved | undefined; + handle: (typeNode: TSESTree.TSTypeReference) => ParameterRangeUnresolved | undefined; } diff --git a/lib/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.ts b/lib/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.ts index b7d10fc..616bca7 100644 --- a/lib/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.ts +++ b/lib/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.ts @@ -1,4 +1,4 @@ -import type { Range, SourceLocation, TSTypeLiteral, TSTypeReference } from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; import type { ParameterRangeUnresolved } from '../ParameterLoader'; import type { TypeReferenceOverride } from './TypeReferenceOverride'; @@ -7,14 +7,14 @@ import type { TypeReferenceOverride } from './TypeReferenceOverride'; * Converts type aliases of the form `Record` into `{[k: K]: V}`. */ export class TypeReferenceOverrideAliasRecord implements TypeReferenceOverride { - public handle(typeNode: TSTypeReference): ParameterRangeUnresolved | undefined { + public handle(typeNode: TSESTree.TSTypeReference): ParameterRangeUnresolved | undefined { if (typeNode.typeName.type === AST_NODE_TYPES.Identifier && typeNode.typeName.name === 'Record' && - typeNode.typeParameters && - typeNode.typeParameters.params.length === 2) { - const loc: SourceLocation = { start: { line: 0, column: 0 }, end: { line: 0, column: 7 }}; - const range: Range = [ 0, 0 ]; - const typeLiteral: TSTypeLiteral = { + typeNode.typeArguments && + typeNode.typeArguments.params.length === 2) { + const loc: TSESTree.SourceLocation = { start: { line: 0, column: 0 }, end: { line: 0, column: 7 }}; + const range: TSESTree.Range = [ 0, 0 ]; + const typeLiteral: TSESTree.TSTypeLiteral = { type: AST_NODE_TYPES.TSTypeLiteral, members: [ { @@ -25,7 +25,7 @@ export class TypeReferenceOverrideAliasRecord implements TypeReferenceOverride { name: 'key', typeAnnotation: { type: AST_NODE_TYPES.TSTypeAnnotation, - typeAnnotation: typeNode.typeParameters.params[0], + typeAnnotation: typeNode.typeArguments.params[0], loc, range, }, @@ -35,7 +35,7 @@ export class TypeReferenceOverrideAliasRecord implements TypeReferenceOverride { ], typeAnnotation: { type: AST_NODE_TYPES.TSTypeAnnotation, - typeAnnotation: typeNode.typeParameters.params[1], + typeAnnotation: typeNode.typeArguments.params[1], loc, range, }, diff --git a/lib/resolution/ExternalModulesLoader.ts b/lib/resolution/ExternalModulesLoader.ts index d7fe010..dc3a238 100644 --- a/lib/resolution/ExternalModulesLoader.ts +++ b/lib/resolution/ExternalModulesLoader.ts @@ -5,13 +5,15 @@ import { ComponentRegistryFinalizer, ComponentRegistry, } from 'componentsjs'; +import type { JsonLdContextNormalized } from 'jsonld-context-parser'; import type { Resource } from 'rdf-object'; import type { Logger } from 'winston'; import type { ClassIndex, ClassReferenceLoaded } from '../parse/ClassIndex'; import type { ConstructorData } from '../parse/ConstructorLoader'; import type { PackageMetadata } from '../parse/PackageMetadataLoader'; -import type { ParameterData, ParameterRangeResolved } from '../parse/ParameterLoader'; +import type { ParameterRangeResolved } from '../parse/ParameterLoader'; import type { PathDestinationDefinition } from '../serialize/ComponentConstructor'; +import type { ResolutionContext } from './ResolutionContext'; /** * Loads components from Node modules. @@ -19,11 +21,17 @@ import type { PathDestinationDefinition } from '../serialize/ComponentConstructo export class ExternalModulesLoader { private readonly pathDestination: PathDestinationDefinition; private readonly packageMetadata: PackageMetadata; + private readonly packagesBeingGenerated: Record; + private readonly resolutionContext: ResolutionContext; + private readonly debugState: boolean; private readonly logger: Logger; public constructor(args: ExternalModulesLoaderArgs) { this.pathDestination = args.pathDestination; this.packageMetadata = args.packageMetadata; + this.packagesBeingGenerated = args.packagesBeingGenerated; + this.resolutionContext = args.resolutionContext; + this.debugState = args.debugState; this.logger = args.logger; } @@ -46,7 +54,14 @@ export class ExternalModulesLoader { // Handle constructor parameters for (const ctor of Object.values(constructors)) { for (const parameter of ctor.parameters) { - this.indexParameterInExternalPackage(parameter, externalPackages); + this.indexParameterRangeInExternalPackage(parameter.range, externalPackages); + } + } + + // Exclude packages that are being generated + for (const key of Object.keys(externalPackages)) { + if (key in this.packagesBeingGenerated) { + delete externalPackages[key]; } } @@ -62,33 +77,53 @@ export class ExternalModulesLoader { } if (classReference.type === 'class') { if (classReference.superClass) { - this.indexClassInExternalPackage(classReference.superClass, externalPackages); + this.indexClassInExternalPackage(classReference.superClass.value, externalPackages); } if (classReference.implementsInterfaces) { for (const iface of classReference.implementsInterfaces) { - this.indexClassInExternalPackage(iface, externalPackages); + this.indexClassInExternalPackage(iface.value, externalPackages); } } } } - public indexParameterInExternalPackage( - parameter: ParameterData, + public indexParameterRangeInExternalPackage( + parameterRange: ParameterRangeResolved, externalPackages: Record, ): void { - switch (parameter.range.type) { + switch (parameterRange.type) { case 'raw': + case 'literal': case 'override': case 'undefined': + case 'wildcard': + case 'genericTypeReference': break; case 'class': - this.indexClassInExternalPackage(parameter.range.value, externalPackages); + this.indexClassInExternalPackage(parameterRange.value, externalPackages); break; case 'nested': - for (const nestedParameter of parameter.range.value) { - this.indexParameterInExternalPackage(nestedParameter, externalPackages); + for (const nestedParameter of parameterRange.value) { + this.indexParameterRangeInExternalPackage(nestedParameter.range, externalPackages); + } + break; + case 'union': + case 'intersection': + case 'tuple': + for (const child of parameterRange.elements) { + this.indexParameterRangeInExternalPackage(child, externalPackages); } break; + case 'rest': + case 'array': + case 'keyof': + case 'typeof': + this.indexParameterRangeInExternalPackage(parameterRange.value, externalPackages); + break; + case 'indexed': + this.indexParameterRangeInExternalPackage(parameterRange.object, externalPackages); + this.indexParameterRangeInExternalPackage(parameterRange.index, externalPackages); + break; } } @@ -107,10 +142,35 @@ export class ExternalModulesLoader { const moduleStateBuilder = new ModuleStateBuilder(this.logger); const mainModulePath = this.pathDestination.packageRootDirectory; const nodeModuleImportPaths = moduleStateBuilder.buildNodeModuleImportPaths(mainModulePath); - const nodeModulePaths = this.buildNodeModulePathsSelective(req, nodeModuleImportPaths, packageNames); - const packageJsons = await moduleStateBuilder.buildPackageJsons(nodeModulePaths); - await moduleStateBuilder.preprocessPackageJsons(packageJsons); - const componentModules = await moduleStateBuilder.buildComponentModules(packageJsons); + + // This loop makes sure that we also consider dependencies (recursively) of the given package names + let nodeModulePaths: string[] = []; + let packageJsons: Record = {}; + let componentModules: Record> = {}; + let packageNamesNew: string[] = packageNames; + while (packageNamesNew.length > 0) { + const nodeModulePathsNew = this.buildNodeModulePathsSelective(req, nodeModuleImportPaths, packageNamesNew); + const packageJsonsNew = await moduleStateBuilder.buildPackageJsons(nodeModulePathsNew); + await moduleStateBuilder.preprocessPackageJsons(packageJsonsNew); + const componentModulesNew = await moduleStateBuilder.buildComponentModules(packageJsonsNew); + + // Determine (Components.js) modules that we haven't seen yet + const newComponentModuleIris = new Set(Object.keys(componentModulesNew) + .filter(componentModuleNew => !componentModules[componentModuleNew])); + + nodeModulePaths = [ ...nodeModulePaths, ...nodeModulePathsNew ]; + packageJsons = { ...packageJsons, ...packageJsonsNew }; + componentModules = { ...componentModules, ...componentModulesNew }; + packageNamesNew = []; + + // For the new modules, extract their dependencies, and handle them in the next iteration + for (const packageJson of Object.values(packageJsonsNew)) { + if (packageJson.dependencies && newComponentModuleIris.has(packageJson['lsd:module'])) { + packageNamesNew.push(...Object.keys(packageJson.dependencies)); + } + } + } + const contexts = await moduleStateBuilder.buildComponentContexts(packageJsons); const importPaths = await moduleStateBuilder.buildComponentImportPaths(packageJsons); return { @@ -127,6 +187,7 @@ export class ExternalModulesLoader { /** * Get all currently available node module paths. * Adapted from {@link ModuleStateBuilder#buildNodeModulePaths}. + * Invalid packages will be ignored and filtered out. * @param req The `require` instance. * @param nodeModuleImportPaths The import paths to resolve from. * @param packageNames The package names to resolve the path for. @@ -136,10 +197,16 @@ export class ExternalModulesLoader { nodeModuleImportPaths: string[], packageNames: string[], ): string[] { - return packageNames - .map(packageName => req - .resolve(`${packageName}/package.json`, { paths: nodeModuleImportPaths }) - .slice(0, -13)); + const packages: string[] = []; + for (const packageName of packageNames) { + try { + const packagePath = req.resolve(`${packageName}/package.json`, { paths: nodeModuleImportPaths }); + packages.push(packagePath.slice(0, -13)); + } catch (error: unknown) { + this.logger.warn(`Ignoring invalid package "${packageName}": ${( error).message}`); + } + } + return packages; } /** @@ -151,6 +218,11 @@ export class ExternalModulesLoader { // Load module state for the external packages const moduleState = await this.buildModuleStateSelective(req, externalPackages); + // Dump the module state to a file if needed + if (this.debugState) { + await this.dumpModuleState(moduleState, externalPackages); + } + // Load components for this module state (code inspired by ComponentsManagerBuilder from Components.js) const componentResources: Record = {}; const objectLoader = ComponentsManagerBuilder.createObjectLoader(); @@ -160,11 +232,13 @@ export class ExternalModulesLoader { logger: this.logger, componentResources, skipContextValidation: true, + remoteContextLookups: false, }); await componentRegistry.registerAvailableModules(); const componentFinalizer = new ComponentRegistryFinalizer({ objectLoader, - logger: this.logger, + // We pass another logger, because there's no valuable information being logged here related to generation + logger: ComponentsManagerBuilder.createLogger('error'), componentResources, componentRegistry, }); @@ -180,33 +254,55 @@ export class ExternalModulesLoader { const externalComponents: ExternalComponents = { moduleState, components: {}, + packagesBeingGenerated: this.packagesBeingGenerated, }; for (const componentResource of Object.values(componentResources)) { - const packageName = componentResource.property.module.property.requireName.value; - - // Initialize metadata for a package if it doesn't exist yet - if (!externalComponents.components[packageName]) { - const packageJson = packageJsons[packageName]; - if (!packageJson) { - this.logger.warn(`Could not find a package.json for '${packageName}'`); - } else { - const contexts = packageJson.contents['lsd:contexts']; - externalComponents.components[packageName] = { - contextIris: Object.keys(contexts), - componentNamesToIris: {}, - }; + const packageNames = componentResource.properties.module.map(module => module.property.requireName.value); + for (const packageName of packageNames) { + // Initialize metadata for a package if it doesn't exist yet + if (!externalComponents.components[packageName]) { + const packageJson = packageJsons[packageName]; + if (packageJson) { + const contexts = packageJson.contents['lsd:contexts']; + externalComponents.components[packageName] = { + contextIris: Object.keys(contexts), + componentNamesToIris: {}, + }; + } else { + this.logger.warn(`Could not find a package.json for '${packageName}'`); + } } - } - // Add component to package - if (externalComponents.components[packageName]) { - externalComponents.components[packageName] - .componentNamesToIris[componentResource.property.requireElement.value] = componentResource.value; + // Add component to package + if (externalComponents.components[packageName]) { + externalComponents.components[packageName] + .componentNamesToIris[componentResource.property.requireElement.value] = componentResource.value; + } } } return externalComponents; } + + /** + * Create a 'componentsjs-debug-state.json' file with the given module state. + * @param moduleState The module state to dump. + * @param externalPackages The external packages to include in the dump. + */ + public async dumpModuleState(moduleState: IModuleState, externalPackages: string[]): Promise { + const contents = JSON.stringify({ + externalPackages, + moduleState: { + mainModulePath: moduleState.mainModulePath, + componentModules: moduleState.componentModules, + importPaths: moduleState.importPaths, + contexts: moduleState.contexts, + nodeModuleImportPaths: moduleState.nodeModuleImportPaths, + nodeModulePaths: moduleState.nodeModulePaths, + }, + }, null, ' '); + await this.resolutionContext.writeFileContent('componentsjs-generator-debug-state.json', contents); + } } /** @@ -224,10 +320,26 @@ export interface ExternalComponents { contextIris: string[]; componentNamesToIris: Record; }>; + /** + * Maps package name to package metadata. + */ + packagesBeingGenerated: Record; } export interface ExternalModulesLoaderArgs { pathDestination: PathDestinationDefinition; packageMetadata: PackageMetadata; + /** + * Maps package name to package metadata. + */ + packagesBeingGenerated: Record; + resolutionContext: ResolutionContext; + debugState: boolean; logger: Logger; } + +export interface PackageMetadataScope { + packageMetadata: PackageMetadata; + pathDestination: PathDestinationDefinition; + minimalContext: JsonLdContextNormalized; +} diff --git a/lib/resolution/ResolutionContext.ts b/lib/resolution/ResolutionContext.ts index b030610..b10358b 100644 --- a/lib/resolution/ResolutionContext.ts +++ b/lib/resolution/ResolutionContext.ts @@ -1,8 +1,8 @@ -import * as fs from 'fs'; -import * as Path from 'path'; +import * as fs from 'node:fs'; import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; import { parse } from '@typescript-eslint/typescript-estree'; -import * as LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; +import { filePathDirName, joinFilePath, normalizeFilePath } from '../util/PathUtil'; /** * Context for loading files. @@ -11,7 +11,7 @@ export class ResolutionContext { private readonly parsedCache: LRUCache>; public constructor() { - this.parsedCache = new LRUCache(2_048); + this.parsedCache = new LRUCache({ max: 2_048 }); } /** @@ -31,6 +31,26 @@ export class ResolutionContext { }); } + /** + * Resolve the correct type declarations path for a specific path used + * in the exports. + * + * @param {string} filePath File path without .d.ts + * @returns {Promise} Promise of the file path without .d.ts that is + * either equal to the parameter or the index of the directory. + */ + public resolveTypesPath(filePath: string): Promise { + return new Promise((resolve) => { + fs.access(`${filePath}.d.ts`, (error) => { + if (error) { + // No file found, treat as directory with an index + filePath = normalizeFilePath(`${filePath}/index`); + } + resolve(filePath); + }); + }); + } + /** * Write the content of a file. * If any of the underlying directories do not exist, they will be created. @@ -39,8 +59,8 @@ export class ResolutionContext { * @param content The content of the file. */ public async writeFileContent(filePath: string, content: string): Promise { - await new Promise((resolve, reject) => { - fs.mkdir(Path.dirname(filePath), { recursive: true }, error => { + await new Promise((resolve, reject) => { + fs.mkdir(filePathDirName(filePath), { recursive: true }, (error) => { if (error) { reject(error); } else { @@ -48,8 +68,8 @@ export class ResolutionContext { } }); }); - await new Promise((resolve, reject) => { - fs.writeFile(filePath, content, 'utf8', error => { + await new Promise((resolve, reject) => { + fs.writeFile(filePath, content, 'utf8', (error) => { if (error) { reject(error); } else { @@ -81,7 +101,7 @@ export class ResolutionContext { * Parse a given typescript file into an abstract syntax tree. * This method has a built-in cache, so repeated calls for the same file are safe. * @param filePath A typescript file path, without extension. - * @return An abstract syntax tree. + * @return - An abstract syntax tree. */ public async parseTypescriptFile(filePath: string): Promise> { // First check cache @@ -107,6 +127,34 @@ export class ResolutionContext { * The requested package has to be a dependency of this file's package. */ public resolvePackageIndex(packageName: string, currentFilePath: string): string { - return require.resolve(packageName, { paths: [ currentFilePath ]}); + try { + // First check if we have an @types package + return this.resolvePackageIndexInner(require, `@types/${packageName}`, currentFilePath); + } catch { + try { + // Fallback to the actual package + return this.resolvePackageIndexInner(require, packageName, currentFilePath); + } catch { + // As final fallback, check if the package is a valid Node.js built-in like 'stream'. + require.resolve(packageName, { paths: [ currentFilePath ]}); + + // If so, require the Node.js types, and resolve the file for the built-in package + const rootFile = this.resolvePackageIndexInner(require, `@types/node`, currentFilePath); + return rootFile.replace(/index\.d\.ts$/u, `${packageName}.d.ts`); + } + } + } + + public resolvePackageIndexInner(req: NodeJS.Require, packageName: string, currentFilePath: string): string { + const packageJsonPath = req.resolve( + `${packageName}/package.json`, + { paths: [ currentFilePath ]}, + ); + const packageJson = req(packageJsonPath); + let typesPath = packageJson.types || packageJson.typings || packageJson.main.replace(/\.js$/u, '.d.ts'); + if (!typesPath.endsWith('.d.ts')) { + typesPath += '.d.ts'; + } + return joinFilePath(filePathDirName(packageJsonPath), typesPath); } } diff --git a/lib/serialize/ComponentConstructor.ts b/lib/serialize/ComponentConstructor.ts index 2641607..b3d32cb 100644 --- a/lib/serialize/ComponentConstructor.ts +++ b/lib/serialize/ComponentConstructor.ts @@ -1,36 +1,66 @@ -import * as Path from 'path'; import type { ContextParser, JsonLdContextNormalized } from 'jsonld-context-parser'; -import type { ClassIndex, ClassLoaded, ClassReference, ClassReferenceLoaded } from '../parse/ClassIndex'; +import semverMajor = require('semver/functions/major'); +import type { + ClassIndex, + ClassLoaded, + ClassReference, + ClassReferenceLoadedClassOrInterface, +} from '../parse/ClassIndex'; import type { ConstructorData } from '../parse/ConstructorLoader'; +import type { GenericsData } from '../parse/GenericsLoader'; +import type { MemberData } from '../parse/MemberLoader'; import type { PackageMetadata } from '../parse/PackageMetadataLoader'; -import type { ParameterData, ParameterRangeResolved } from '../parse/ParameterLoader'; +import type { + DefaultNested, + DefaultValue, + GenericTypeParameterData, + ParameterData, + ParameterRangeResolved, + ExtensionData, + MemberParameterData, +} from '../parse/ParameterLoader'; import type { ExternalComponents } from '../resolution/ExternalModulesLoader'; import type { ComponentDefinition, - ComponentDefinitions, ComponentDefinitionsIndex, - ConstructorArgumentDefinition, ConstructorFieldDefinition, + ComponentDefinitions, + ComponentDefinitionsIndex, + ConstructorArgumentDefinition, + ConstructorFieldDefinition, + DefaultValueDefinition, ParameterDefinition, + ParameterDefinitionRange, + GenericTypeParameterDefinition, + ExtensionDefinition, + MemberFieldDefinition, } from './ComponentDefinitions'; -import type { ContextConstructor } from './ContextConstructor'; +import { ContextConstructor } from './ContextConstructor'; /** * Creates declarative JSON components for the given classes. */ export class ComponentConstructor { private readonly packageMetadata: PackageMetadata; + private readonly fileExtension: string; private readonly contextConstructor: ContextConstructor; private readonly pathDestination: PathDestinationDefinition; - private readonly classAndInterfaceIndex: ClassIndex; + private readonly classAndInterfaceIndex: ClassIndex; private readonly classConstructors: ClassIndex>; + private readonly classGenerics: ClassIndex>; + private readonly classExtensions: ClassIndex[]>; + private readonly classMembers: ClassIndex>; private readonly externalComponents: ExternalComponents; private readonly contextParser: ContextParser; public constructor(args: ComponentConstructorArgs) { this.packageMetadata = args.packageMetadata; + this.fileExtension = args.fileExtension; this.contextConstructor = args.contextConstructor; this.pathDestination = args.pathDestination; this.classAndInterfaceIndex = args.classAndInterfaceIndex; this.classConstructors = args.classConstructors; + this.classGenerics = args.classGenerics; + this.classExtensions = args.classExtensions; + this.classMembers = args.classMembers; this.externalComponents = args.externalComponents; this.contextParser = args.contextParser; } @@ -46,7 +76,10 @@ export class ComponentConstructor { for (const [ className, classReference ] of Object.entries(this.classAndInterfaceIndex)) { // Initialize or get context and component array - const path = this.getPathDestination(classReference.fileName); + const sourcePath = classReference.packageName === this.packageMetadata.name ? + classReference.fileName : + classReference.fileNameReferenced; + const path = ComponentConstructor.getPathDestination(this.pathDestination, sourcePath); if (!(path in definitions)) { definitions[path] = { '@context': Object.keys(this.packageMetadata.contexts), @@ -59,7 +92,7 @@ export class ComponentConstructor { // Construct the component for this class components.push(await this.constructComponent( context, - externalContextUrl => { + (externalContextUrl) => { // Append external contexts URLs to @context array if (!contexts.includes(externalContextUrl)) { contexts.push(externalContextUrl); @@ -67,6 +100,9 @@ export class ComponentConstructor { }, classReference, this.classConstructors[className], + this.classGenerics[className], + this.classExtensions[className], + this.classMembers[className]?.members, )); } @@ -76,11 +112,9 @@ export class ComponentConstructor { /** * Construct a component definitions index. * @param definitions The component definitions for which the index should be constructed. - * @param fileExtension The file extension to apply on files. */ public async constructComponentsIndex( definitions: ComponentDefinitions, - fileExtension: string, ): Promise { // Construct a minimal context const context: JsonLdContextNormalized = await this.contextParser.parse(this.contextConstructor.constructContext()); @@ -91,7 +125,7 @@ export class ComponentConstructor { '@type': 'Module', requireName: this.packageMetadata.name, import: Object.keys(definitions) - .map(pathAbsolute => this.getPathRelative(`${pathAbsolute}.${fileExtension}`)) + .map(pathAbsolute => ComponentConstructor.getPathRelative(this.pathDestination, `${pathAbsolute}.${this.fileExtension}`)) .map(pathRelative => this.getImportPathIri(pathRelative)) .map(iri => context.compactIri(iri)), }; @@ -99,31 +133,29 @@ export class ComponentConstructor { /** * Determine the relative path of a component file within a package. + * @param pathDestination The path destination. * @param sourcePath The absolute path to a class file. */ - public getPathRelative(sourcePath: string): string { - if (!sourcePath.startsWith(this.pathDestination.packageRootDirectory)) { + public static getPathRelative(pathDestination: PathDestinationDefinition, sourcePath: string): string { + if (!sourcePath.startsWith(pathDestination.packageRootDirectory)) { throw new Error(`Tried to reference a file outside the current package: ${sourcePath}`); } - let strippedPath = sourcePath.slice(this.pathDestination.packageRootDirectory.length + 1); - if (Path.sep !== '/') { - strippedPath = strippedPath.split(Path.sep).join('/'); - } - - return strippedPath.replace(`${this.pathDestination.originalPath}/`, ''); + const strippedPath = sourcePath.slice(pathDestination.packageRootDirectory.length + 1); + return strippedPath.replace(`${pathDestination.originalPath}/`, ''); } /** * Determine the path a component file should exist at based on a class source file path. + * @param pathDestination The path destination. * @param sourcePath The absolute path to a class file. */ - public getPathDestination(sourcePath: string): string { - if (!sourcePath.startsWith(this.pathDestination.packageRootDirectory)) { + public static getPathDestination(pathDestination: PathDestinationDefinition, sourcePath: string): string { + if (!sourcePath.startsWith(pathDestination.packageRootDirectory)) { throw new Error(`Tried to reference a file outside the current package: ${sourcePath}`); } - return sourcePath.replace(this.pathDestination.originalPath, this.pathDestination.replacementPath); + return sourcePath.replace(pathDestination.originalPath, pathDestination.replacementPath); } /** @@ -148,16 +180,33 @@ export class ComponentConstructor { * @param externalContextsCallback Callback for external contexts. * @param classReference Class reference of the class component. * @param constructorData Constructor data of the owning class. + * @param genericsData Generics data of the owning class. + * @param classExtensions Class extensions of the owning class. + * @param classMembers Class members of the owning class. */ public async constructComponent( context: JsonLdContextNormalized, externalContextsCallback: ExternalContextCallback, - classReference: ClassReferenceLoaded, - constructorData: ConstructorData, + classReference: ClassReferenceLoadedClassOrInterface, + constructorData: ConstructorData | undefined, + genericsData: GenericsData | undefined, + classExtensions: ExtensionData[] | undefined, + classMembers: MemberParameterData[] | undefined, ): Promise { + // Determine generic type parameters + const genericTypeParameters = genericsData ? + await this.constructGenericTypeParameters( + context, + externalContextsCallback, + classReference, + genericsData.genericTypeParameters, + ) : + undefined; + // Fill in parameters and constructor arguments const parameters: ParameterDefinition[] = []; - const constructorArguments = classReference.type === 'class' ? + const scopedId = await this.classNameToId(context, externalContextsCallback, classReference); + const constructorArguments = constructorData && classReference.type === 'class' ? await this.constructParameters( context, externalContextsCallback, @@ -165,43 +214,67 @@ export class ComponentConstructor { constructorData, parameters, ) : - []; + []; // Determine extends field based on super class and implementing interfaces. // Components.js makes no distinction between a super class and implementing interface, so we merge them here. - let ext: string[] | undefined; - if (classReference.type === 'class') { - if (classReference.superClass || classReference.implementsInterfaces) { - ext = []; - if (classReference.superClass) { - ext.push(await this.classNameToId(context, externalContextsCallback, classReference.superClass)); - } - if (classReference.implementsInterfaces) { - for (const iface of classReference.implementsInterfaces) { - ext.push(await this.classNameToId(context, externalContextsCallback, iface)); - } - } - } - } else if (classReference.superInterfaces) { - ext = []; - for (const iface of classReference.superInterfaces) { - ext.push(await this.classNameToId(context, externalContextsCallback, iface)); - } - } + const ext: ExtensionDefinition[] | undefined = classExtensions && classExtensions.length > 0 ? + await Promise.all(classExtensions.map(async classExtension => await this + .constructExtensionDefinition(context, externalContextsCallback, classExtension))) : + undefined; + + // Obtain the keys of all members + const memberFields = classMembers ? + await this.constructMembers( + context, + externalContextsCallback, + classReference, + classMembers, + ) : + undefined; // Fill in fields - const scopedId = await this.classNameToId(context, externalContextsCallback, classReference); return { '@id': scopedId, '@type': classReference.type === 'interface' || classReference.abstract ? 'AbstractClass' : 'Class', requireElement: classReference.localName, ...ext ? { extends: ext } : {}, ...classReference.comment ? { comment: classReference.comment } : {}, + ...genericTypeParameters && genericTypeParameters.length > 0 ? { genericTypeParameters } : {}, parameters, + ...memberFields && memberFields.length > 0 ? { memberFields } : {}, constructorArguments, }; } + /** + * Construct a compacted class IRI. + * @param context A parsed JSON-LD context. + * @param externalContextsCallback Callback for external contexts. + * @param extensionData The extension data. + */ + public async constructExtensionDefinition( + context: JsonLdContextNormalized, + externalContextsCallback: ExternalContextCallback, + extensionData: ExtensionData, + ): Promise { + const id = await this.classNameToId(context, externalContextsCallback, extensionData.classLoaded); + if (extensionData.genericTypeInstantiations.length > 0) { + return { + '@type': 'GenericComponentExtension', + component: id, + genericTypeInstances: await Promise.all(extensionData.genericTypeInstantiations + .map(async genericTypeInstantiation => this.constructParameterRange( + genericTypeInstantiation, + context, + externalContextsCallback, + '', + ))), + }; + } + return id; + } + /** * Construct a compacted module IRI. * @param context A parsed JSON-LD context. @@ -223,15 +296,39 @@ export class ComponentConstructor { ): Promise { // Mint a new IRI if class is in the current package if (classReference.packageName === this.packageMetadata.name) { - return context.compactIri(`${this.packageMetadata.moduleIri}/${this.getPathRelative(classReference.fileName)}#${classReference.localName}`); + return ComponentConstructor.classNameToIdForPackage( + context, + this.packageMetadata, + this.pathDestination, + classReference, + this.fileExtension, + ); } - // Use existing IRI if class is in another package + // Use existing IRI if class is in another package (that is also being built currently) + const otherPackageMetadata = this.externalComponents.packagesBeingGenerated[classReference.packageName]; + if (otherPackageMetadata) { + for (const iri of Object.keys(otherPackageMetadata.packageMetadata.contexts)) { + externalContextsCallback(iri); + } + return await ComponentConstructor.classNameToIdForPackage( + otherPackageMetadata.minimalContext, + otherPackageMetadata.packageMetadata, + otherPackageMetadata.pathDestination, + classReference, + this.fileExtension, + ); + } + + // Use existing IRI if class is in another package (pre-built) const moduleComponents = this.externalComponents.components[classReference.packageName]; if (!moduleComponents) { - throw new Error(`Tried to reference a class '${classReference.localName}' from an external module '${classReference.packageName}' that is not a dependency`); + // Mint a dummy IRI if the component is not exposing components files + return `urn:npm:${classReference.packageName}:${classReference.localName}`; + } + for (const iri of moduleComponents.contextIris) { + externalContextsCallback(iri); } - moduleComponents.contextIris.forEach(iri => externalContextsCallback(iri)); const componentIri = moduleComponents.componentNamesToIris[classReference.localName]; if (!componentIri) { throw new Error(`Tried to reference a class '${classReference.localName}' from an external module '${classReference.packageName}' that does not expose this component`); @@ -240,6 +337,30 @@ export class ComponentConstructor { return contextExternal.compactIri(componentIri); } + public static async classNameToIdForPackage( + context: JsonLdContextNormalized, + packageMetadata: PackageMetadata, + pathDestination: PathDestinationDefinition, + classReference: ClassReference, + fileExtension: string, + ): Promise { + return context.compactIri(ComponentConstructor + .classNameToIriForPackage(packageMetadata, pathDestination, classReference, fileExtension)); + } + + public static classNameToIriForPackage( + packageMetadata: PackageMetadata, + pathDestination: PathDestinationDefinition, + classReference: ClassReference, + fileExtension: string, + ): string { + const filePath = ComponentConstructor.getPathRelative( + pathDestination, + ComponentConstructor.getPathDestination(pathDestination, classReference.fileName), + ); + return `${packageMetadata.moduleIri}/^${semverMajor(packageMetadata.version)}.0.0/${filePath}.${fileExtension}#${classReference.localName}`; + } + /** * Construct a compacted field IRI. * @param context A parsed JSON-LD context. @@ -256,7 +377,34 @@ export class ComponentConstructor { if (scope.parentFieldNames.length > 0) { fieldName = `${scope.parentFieldNames.join('_')}_${fieldName}`; } - let id = context.compactIri(`${this.packageMetadata.moduleIri}/${this.getPathRelative(classReference.fileName)}#${classReference.localName}_${fieldName}`); + + // Mint a new IRI if class is in the current package + let iri: string | undefined; + if (classReference.packageName === this.packageMetadata.name) { + iri = ComponentConstructor.classNameToIriForPackage( + this.packageMetadata, + this.pathDestination, + classReference, + this.fileExtension, + ); + } + + // Use existing IRI if class is in another package (that is also being built currently) + const otherPackageMetadata = this.externalComponents.packagesBeingGenerated[classReference.packageName]; + if (otherPackageMetadata) { + iri = ComponentConstructor.classNameToIriForPackage( + otherPackageMetadata.packageMetadata, + otherPackageMetadata.pathDestination, + classReference, + this.fileExtension, + ); + } + + if (!iri) { + throw new Error(`Tried to reference a field ${fieldName} in "${this.pathDestination.packageRootDirectory}" outside the current package: ${classReference.fileName}`); + } + + let id = context.compactIri(`${iri}_${fieldName}`); if (id in scope.fieldIdsHash) { id += `_${scope.fieldIdsHash[id]++}`; } else { @@ -265,6 +413,105 @@ export class ComponentConstructor { return id; } + /** + * Construct a compacted generic name IRI. + * @param context A parsed JSON-LD context. + * @param classReference The class reference. + * @param genericTypeName The name of the generic type. + */ + public genericNameToId( + context: JsonLdContextNormalized, + classReference: ClassReference, + genericTypeName: string, + ): string { + return this.fieldNameToId(context, classReference, `_generic_${genericTypeName}`, { + parentFieldNames: [], + fieldIdsHash: {}, + defaultNested: [], + }); + } + + /** + * Construct a compacted member name IRI. + * @param context A parsed JSON-LD context. + * @param classReference The class reference. + * @param memberName The name of the member type. + */ + public memberToId( + context: JsonLdContextNormalized, + classReference: ClassReference, + memberName: string, + ): string { + return this.fieldNameToId(context, classReference, `_member_${memberName}`, { + parentFieldNames: [], + fieldIdsHash: {}, + defaultNested: [], + }); + } + + /** + * Construct constructor arguments from the given constructor data. + * Additionally, parameters will be appended to the parameters array. + * + * @param context A parsed JSON-LD context. + * @param externalContextsCallback Callback for external contexts. + * @param classReference Class reference of the class component owning this constructor. + * @param genericTypes Generic types of the class. + */ + public async constructGenericTypeParameters( + context: JsonLdContextNormalized, + externalContextsCallback: ExternalContextCallback, + classReference: ClassReferenceLoadedClassOrInterface, + genericTypes: GenericTypeParameterData[], + ): Promise { + const definitions: GenericTypeParameterDefinition[] = []; + for (const genericType of genericTypes) { + const id = this.genericNameToId(context, classReference, genericType.name); + definitions.push({ + '@id': id, + ...genericType.range ? + { range: await this.constructParameterRange(genericType.range, context, externalContextsCallback, id) } : + {}, + ...genericType.default ? + { + default: await this.constructParameterRange(genericType.default, context, externalContextsCallback, id), + } : + {}, + }); + } + return definitions; + } + + /** + * Construct constructor arguments from the given member data. + * + * @param context A parsed JSON-LD context. + * @param externalContextsCallback Callback for external contexts. + * @param classReference Class reference of the class component owning this constructor. + * @param members Members of the class. + */ + public async constructMembers( + context: JsonLdContextNormalized, + externalContextsCallback: ExternalContextCallback, + classReference: ClassReferenceLoadedClassOrInterface, + members: MemberParameterData[], + ): Promise { + const definitions: MemberFieldDefinition[] = []; + for (const member of members) { + const id = this.memberToId(context, classReference, member.name); + definitions.push({ + '@id': id, + memberFieldName: member.name, + ...member.range ? + { + range: await this.constructParameterRange(member.range, context, externalContextsCallback, id), + } : + {}, + }); + } + return definitions; + } + /** * Construct constructor arguments from the given constructor data. * Additionally, parameters will be appended to the parameters array. @@ -285,6 +532,7 @@ export class ComponentConstructor { const scope: FieldScope = { parentFieldNames: [], fieldIdsHash: {}, + defaultNested: [], }; return await Promise.all(constructorData.parameters.map(parameter => this.parameterDataToConstructorArgument( context, @@ -320,59 +568,114 @@ export class ComponentConstructor { fieldId: string, scope: FieldScope, ): Promise { - // Append the current field name to the scope if (parameterData.type === 'field') { + // Append the current field name to the scope scope = { ...scope, parentFieldNames: [ ...scope.parentFieldNames, parameterData.name ], }; + // Obtain the defaultNested targets + if (parameterData.defaultNested) { + scope.defaultNested = parameterData.defaultNested; + } } - if (parameterData.range.type === 'nested') { + if (parameterData.range.type === 'nested' || + (parameterData.range.type === 'union' && + parameterData.range.elements.some(element => element.type === 'nested'))) { + // TODO: this union type check is not great, so solve this when refactoring nested fields // Create a hash object with `fields` entries. // Each entry's value is (indirectly) recursively handled by this method again. const fields: ConstructorFieldDefinition[] = []; - for (const subParamData of parameterData.range.value) { + const subParams: ParameterData[] = parameterData.range.type === 'nested' ? + parameterData.range.value : + ( parameterData.range.elements.find(element => element.type === 'nested')).value; + for (const subParamData of subParams) { fields.push(await this.constructFieldDefinitionNested( context, externalContextsCallback, classReference, - & { range: { type: 'nested' } }>parameterData, + & { range: { type: 'nested' }}>parameterData, parameters, subParamData, fieldId, scope, )); } - return { fields }; + return { '@id': `${fieldId}__constructorArgument`, fields }; } - // For all other range types, create a parameter and return its parameter id. - let param: ParameterDefinition; - switch (parameterData.range.type) { - case 'raw': - case 'override': - param = this.constructParameterRaw(context, classReference, parameterData, parameterData.range.value, fieldId); - break; - case 'undefined': - param = this.constructParameterRangeUndefined(context, classReference, parameterData, fieldId); - break; - case 'class': - // eslint-disable-next-line no-case-declarations - param = await this.constructParameterClass( - context, - externalContextsCallback, - classReference, - parameterData, - parameterData.range.value, - fieldId, - ); - break; + // Check if we have a defaultNested value that applies on this field + const defaultValues: DefaultValue[] = parameterData.defaults ?? []; + for (const defaultNested of scope.defaultNested) { + if (defaultNested.paramPath.join('_') === scope.parentFieldNames.join('_')) { + defaultValues.push(defaultNested.value); + } } + + const defaultValuesConstructed = await Promise.all(defaultValues + .map(defaultValue => this.constructDefaultValueDefinition( + fieldId, + context, + externalContextsCallback, + defaultValue, + parameterData.range, + ))); + + // For all other range types, create a parameter and return its parameter id. + const range = await this.constructParameterRange(parameterData.range, context, externalContextsCallback, fieldId); + const param: ParameterDefinition = { + '@id': fieldId, + range, + ...defaultValuesConstructed.length > 0 ? + { + default: defaultValuesConstructed.length > 1 || ContextConstructor.isParameterRangeList(range) ? + { '@list': defaultValuesConstructed } : + defaultValuesConstructed[0], + } : + {}, + }; + + // Fill in optional fields + this.populateOptionalParameterFields(param, parameterData); + parameters.push(param); return { '@id': fieldId }; } + public async constructDefaultValueDefinition( + fieldId: string, + context: JsonLdContextNormalized, + externalContextsCallback: ExternalContextCallback, + defaultValue: DefaultValue, + range: ParameterRangeResolved, + ): Promise { + if (defaultValue.type === 'raw') { + if ((range.type === 'override' && range.value === 'json') || + (range.type === 'union' && + range.elements.some(subRange => subRange.type === 'override' && subRange.value === 'json'))) { + try { + return { + '@type': '@json', + '@value': JSON.parse(defaultValue.value), + }; + } catch (error: unknown) { + throw new Error(`JSON parsing error in default value of ${fieldId}: ${( error).message}`); + } + } + return defaultValue.value; + } + + // Resolve relative IRI + let iri = defaultValue.value; + if (iri && !iri.includes(':')) { + const baseIRI = await this.classNameToId(context, externalContextsCallback, defaultValue.baseComponent); + iri = `${baseIRI}_${iri}`; + } + + return { '@id': iri, '@type': defaultValue.typeIri }; + } + /** * For the given parameter with nested range, construct field definitions for all sub-parameters. * @param context A parsed JSON-LD context. @@ -388,7 +691,7 @@ export class ComponentConstructor { context: JsonLdContextNormalized, externalContextsCallback: ExternalContextCallback, classReference: ClassLoaded, - parameterData: ParameterData & { range: { type: 'nested' } }, + parameterData: ParameterData & { range: { type: 'nested' }}, parameters: ParameterDefinition[], subParamData: ParameterData, fieldId: string, @@ -431,11 +734,7 @@ export class ComponentConstructor { // Create sub parameters for key and value const subParameters: ParameterDefinition[] = []; - subParameters.push({ - '@id': idKey, - required: true, - unique: true, - }); + subParameters.push({ '@id': idKey }); const value = await this.parameterDataToConstructorArgument( context, externalContextsCallback, @@ -445,20 +744,15 @@ export class ComponentConstructor { idValue, scope, ); - subParameters[subParameters.length - 1].required = true; - subParameters[subParameters.length - 1].unique = true; // Construct parameter, which has key and value as sub-parameters const parameter: ParameterDefinition = { '@id': idCollectEntries, range: { - '@type': this.fieldNameToId(context, classReference, `${parameterData.name}_range`, scope), - parameters: subParameters, + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: subParameters, }, }; - // Params for collected entries are never required, and can have more than one entry. - parameterData.unique = false; - parameterData.required = false; this.populateOptionalParameterFields(parameter, parameterData); parameters.push(parameter); @@ -471,83 +765,114 @@ export class ComponentConstructor { } /** - * Construct a parameter definition from the given parameter data with raw range. - * @param context A parsed JSON-LD context. - * @param classReference Class reference of the class component owning this parameter. - * @param parameterData Parameter data. - * @param range Range of this parameter data. - * @param fieldId The @id of the field. - */ - public constructParameterRaw( - context: JsonLdContextNormalized, - classReference: ClassLoaded, - parameterData: ParameterData, - range: string, - fieldId: string, - ): ParameterDefinition { - // Fill in required fields - const definition: ParameterDefinition = { - '@id': fieldId, - range: range === 'json' ? 'rdf:JSON' : `xsd:${range}`, - }; - - // Fill in optional fields - this.populateOptionalParameterFields(definition, parameterData); - - return definition; - } - - /** - * Construct a parameter definition from the given parameter data with an undefined range. - * @param context A parsed JSON-LD context. - * @param classReference Class reference of the class component owning this parameter. - * @param parameterData Parameter data. - * @param fieldId The @id of the field. - */ - public constructParameterRangeUndefined( - context: JsonLdContextNormalized, - classReference: ClassLoaded, - parameterData: ParameterData, - fieldId: string, - ): ParameterDefinition { - // Fill in required fields - const definition: ParameterDefinition = { - '@id': fieldId, - }; - - // Fill in optional fields - this.populateOptionalParameterFields(definition, parameterData); - - return definition; - } - - /** - * Construct a parameter definition from the given parameter data with class reference range. + * Determine the parameter definition's range definition. + * @param range The range of a parameter * @param context A parsed JSON-LD context. * @param externalContextsCallback Callback for external contexts. - * @param classReference Class reference of the class component owning this parameter. - * @param parameterData Parameter data. - * @param range Range of this parameter data. * @param fieldId The @id of the field. */ - public async constructParameterClass( + public async constructParameterRange( + range: ParameterRangeResolved, context: JsonLdContextNormalized, externalContextsCallback: ExternalContextCallback, - classReference: ClassReference, - parameterData: ParameterData, - range: ClassReference, fieldId: string, - ): Promise { - // Fill in required fields - const definition: ParameterDefinition = { - '@id': fieldId, - range: await this.classNameToId(context, externalContextsCallback, range), - }; - - // Fill in optional fields - this.populateOptionalParameterFields(definition, parameterData); - - return definition; + ): Promise { + let type: string; + switch (range.type) { + case 'raw': + case 'override': + return range.value === 'json' ? 'rdf:JSON' : `xsd:${range.value}`; + case 'literal': + return { + '@type': 'ParameterRangeLiteral', + parameterRangeValueLiteral: range.value, + }; + case 'class': + // eslint-disable-next-line no-case-declarations + const componentId = await this.classNameToId(context, externalContextsCallback, range.value); + if (range.genericTypeParameterInstances) { + return { + '@type': 'ParameterRangeGenericComponent', + component: componentId, + genericTypeInstances: await Promise.all(range.genericTypeParameterInstances + .map(genericType => this.constructParameterRange( + genericType, + context, + externalContextsCallback, + fieldId, + ))), + }; + } + return componentId; + case 'nested': + // TODO: Composition of nested fields is unsupported + return { + '@type': 'ParameterRangeWildcard', + }; + case 'undefined': + return { + '@type': 'ParameterRangeUndefined', + }; + case 'wildcard': + return { + '@type': 'ParameterRangeWildcard', + }; + case 'union': + case 'intersection': + case 'tuple': + switch (range.type) { + case 'union': + type = 'ParameterRangeUnion'; + break; + case 'intersection': + type = 'ParameterRangeIntersection'; + break; + case 'tuple': + type = 'ParameterRangeTuple'; + break; + } + return { + '@type': type, + parameterRangeElements: await Promise.all(range.elements + .map(child => this.constructParameterRange(child, context, externalContextsCallback, fieldId))), + }; + case 'rest': + case 'array': + case 'keyof': + case 'typeof': + switch (range.type) { + case 'rest': + type = 'ParameterRangeRest'; + break; + case 'array': + type = 'ParameterRangeArray'; + break; + case 'keyof': + type = 'ParameterRangeKeyof'; + break; + case 'typeof': + type = 'ParameterRangeTypeof'; + break; + } + return { + '@type': type, + parameterRangeValue: await this + .constructParameterRange(range.value, context, externalContextsCallback, fieldId), + }; + case 'genericTypeReference': + return { + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: this.genericNameToId(context, range.origin, range.value), + }; + case 'indexed': + return { + '@type': 'ParameterRangeIndexed', + parameterRangeIndexedObject: await this + .constructParameterRange(range.object, context, externalContextsCallback, fieldId), + parameterRangeIndexedIndex: await this + .constructParameterRange(range.index, context, externalContextsCallback, fieldId), + }; + } } /** @@ -562,21 +887,19 @@ export class ComponentConstructor { if (parameterData.comment) { parameterDefinition.comment = parameterData.comment; } - if ('unique' in parameterData && parameterData.unique) { - parameterDefinition.unique = parameterData.unique; - } - if ('required' in parameterData && parameterData.required) { - parameterDefinition.required = parameterData.required; - } } } export interface ComponentConstructorArgs { packageMetadata: PackageMetadata; + fileExtension: string; contextConstructor: ContextConstructor; pathDestination: PathDestinationDefinition; - classAndInterfaceIndex: ClassIndex; + classAndInterfaceIndex: ClassIndex; classConstructors: ClassIndex>; + classGenerics: ClassIndex>; + classExtensions: ClassIndex[]>; + classMembers: ClassIndex>; externalComponents: ExternalComponents; contextParser: ContextParser; } @@ -605,6 +928,10 @@ export interface FieldScope { * A hash containing all previously created field names, to ensure uniqueness. */ fieldIdsHash: Record; + /** + * The nested default values on parameters. + */ + defaultNested: DefaultNested[]; } export type ExternalContextCallback = (contextUrl: string) => void; diff --git a/lib/serialize/ComponentDefinitions.ts b/lib/serialize/ComponentDefinitions.ts index ca77f33..f85da8f 100644 --- a/lib/serialize/ComponentDefinitions.ts +++ b/lib/serialize/ComponentDefinitions.ts @@ -19,23 +19,75 @@ export interface ComponentDefinition { '@id': string; '@type': string; requireElement: string; - extends?: string[]; + extends?: ExtensionDefinition[]; comment?: string; + genericTypeParameters?: GenericTypeParameterDefinition[]; parameters: ParameterDefinition[]; + memberFields?: MemberFieldDefinition[]; constructorArguments: ConstructorArgumentDefinition[]; } +export type ExtensionDefinition = string | { + '@type': 'GenericComponentExtension'; + component: string; + genericTypeInstances: ParameterDefinitionRange[]; +}; + +export interface GenericTypeParameterDefinition { + '@id': string; + range?: ParameterDefinitionRange; + default?: ParameterDefinitionRange; +} + export interface ParameterDefinition { '@id': string; comment?: string; - unique?: boolean; - required?: boolean; - range?: string | { '@type': string; parameters: ParameterDefinition[] }; + range?: ParameterDefinitionRange; + default?: DefaultValueDefinition | { '@list': DefaultValueDefinition[] }; lazy?: boolean; } +export type DefaultValueDefinition = string | +{ '@id'?: string; '@type'?: string } | +{ '@type': '@json'; '@value': any }; + +export type ParameterDefinitionRange = string | { '@id': string; parameters: ParameterDefinition[] } | { + '@type': 'ParameterRangeUnion' | 'ParameterRangeIntersection' | 'ParameterRangeTuple'; + parameterRangeElements: ParameterDefinitionRange[]; +} | { + '@type': 'ParameterRangeRest' | 'ParameterRangeArray' | 'ParameterRangeKeyof'; + parameterRangeValue: ParameterDefinitionRange; +} | { + '@type': 'ParameterRangeUndefined'; +} | { + '@type': 'ParameterRangeWildcard'; +} | { + '@type': 'ParameterRangeCollectEntries'; + parameterRangeCollectEntriesParameters: ParameterDefinition[]; +} | { + '@type': 'ParameterRangeLiteral'; + parameterRangeValueLiteral: number | string | boolean; +} | { + '@type': 'ParameterRangeGenericTypeReference'; + parameterRangeGenericType: string; +} | { + '@type': 'ParameterRangeGenericComponent'; + component: string; + genericTypeInstances: ParameterDefinitionRange[]; +} | { + '@type': 'ParameterRangeIndexed'; + parameterRangeIndexedObject: ParameterDefinitionRange; + parameterRangeIndexedIndex: ParameterDefinitionRange; +}; + +export interface MemberFieldDefinition { + '@id': string; + memberFieldName: string; + range?: ParameterDefinitionRange; +} + export type ConstructorArgumentDefinition = string | { '@id': string } | { - '@id'?: string; + '@id': string; extends?: string; fields?: ConstructorFieldDefinition[]; elements?: ConstructorElementDefinition[]; diff --git a/lib/serialize/ComponentSerializer.ts b/lib/serialize/ComponentSerializer.ts index 67c6462..c8c7d62 100644 --- a/lib/serialize/ComponentSerializer.ts +++ b/lib/serialize/ComponentSerializer.ts @@ -1,5 +1,5 @@ -import * as Path from 'path'; import type { ResolutionContext } from '../resolution/ResolutionContext'; +import { joinFilePath } from '../util/PathUtil'; import type { PathDestinationDefinition } from './ComponentConstructor'; import type { ComponentDefinitions, ComponentDefinitionsIndex } from './ComponentDefinitions'; import type { ContextRaw } from './ContextConstructor'; @@ -50,7 +50,7 @@ export class ComponentSerializer { * @return The absolute file path that was created. */ public async serializeComponentsIndex(componentsIndex: ComponentDefinitionsIndex): Promise { - const filePathBase = Path.join( + const filePathBase = joinFilePath( this.pathDestination.replacementPath, 'components', ); @@ -63,7 +63,7 @@ export class ComponentSerializer { * @return The absolute file path that was created. */ public async serializeContext(contextRaw: ContextRaw): Promise { - const filePathBase = Path.join( + const filePathBase = joinFilePath( this.pathDestination.replacementPath, 'context', ); diff --git a/lib/serialize/ContextConstructor.ts b/lib/serialize/ContextConstructor.ts index 8eab918..67ed3c4 100644 --- a/lib/serialize/ContextConstructor.ts +++ b/lib/serialize/ContextConstructor.ts @@ -1,18 +1,16 @@ import { PrefetchedDocumentLoader } from 'componentsjs'; import semverMajor = require('semver/functions/major'); import type { PackageMetadata } from '../parse/PackageMetadataLoader'; -import type { ComponentDefinitions } from './ComponentDefinitions'; +import type { ComponentDefinitions, ParameterDefinitionRange } from './ComponentDefinitions'; /** * Constructs a JSON-LD context for a given package.. */ export class ContextConstructor { private readonly packageMetadata: PackageMetadata; - private readonly typeScopedContexts: boolean; public constructor(args: ContextConstructorArgs) { this.packageMetadata = args.packageMetadata; - this.typeScopedContexts = args.typeScopedContexts; } /** @@ -22,7 +20,7 @@ export class ContextConstructor { */ public static getPackageNamePrefix(packageName: string): string { return packageName - .replace(/@/gu, '') + .replaceAll('@', '') .split(/[/-]/u) .map(part => part.charAt(0)) .join(''); @@ -44,8 +42,7 @@ export class ContextConstructor { PrefetchedDocumentLoader.CONTEXT_URL, { npmd: 'https://linkedsoftwaredependencies.org/bundles/npm/', - [prefix]: `npmd:${this.packageMetadata.name}/`, - [`files-${prefix}`]: `${prefix}:^${semverMajor(this.packageMetadata.version)}.0.0/`, + [prefix]: `npmd:${this.packageMetadata.name}/^${semverMajor(this.packageMetadata.version)}.0.0/`, ...componentShortcuts, }, ], @@ -68,27 +65,86 @@ export class ContextConstructor { '@prefix': true, }; - // Generate type-scoped context when enabled - if (this.typeScopedContexts) { - const typeScopedContext: Record> = {}; - for (const parameter of component.parameters) { - typeScopedContext[parameter['@id'].slice(Math.max(0, component['@id'].length + 1))] = { - '@id': parameter['@id'], - ...parameter.range === 'rdf:JSON' ? { '@type': '@json' } : {}, - ...parameter.unique || parameter.range === 'rdf:JSON' ? {} : { '@container': '@list' }, - }; + // Generate type-scoped context + const typeScopedContext: Record> = {}; + const shortcutAliases: string[] = []; + for (const parameter of component.parameters) { + const shortcut = parameter['@id'].slice(Math.max(0, component['@id'].length + 1)); + typeScopedContext[shortcut] = { + '@id': parameter['@id'], + ...ContextConstructor.isParameterRangeJson(parameter.range) ? { '@type': '@json' } : {}, + // Mark as list container if range is array + ...ContextConstructor.isParameterRangeList(parameter.range) ? + { '@container': '@list' } : + {}, + }; + shortcutAliases.push(shortcut); + } + + // If all shortcuts share the same prefix, add shorter variants for them + let longestCommonPrefix: string | undefined; + const prefixDelimiter = '_'; + for (const shortcut of shortcutAliases) { + if (!longestCommonPrefix) { + longestCommonPrefix = shortcut; + } else if (!shortcut.startsWith(longestCommonPrefix)) { + const longestCommonPrefixNew: string[] = []; + const shortcutSplit = shortcut.split(prefixDelimiter); + const longestCommonPrefixSplit = longestCommonPrefix.split(prefixDelimiter); + for (let i = 0; i < Math.min(longestCommonPrefixSplit.length, shortcutSplit.length); i++) { + if (shortcutSplit[i] === longestCommonPrefixSplit[i]) { + longestCommonPrefixNew.push(shortcutSplit[i]); + } else { + break; + } + } + longestCommonPrefix = longestCommonPrefixNew.join(prefixDelimiter); + } + } + if (longestCommonPrefix && longestCommonPrefix.length > 0) { + for (const shortcut of shortcutAliases) { + if (shortcut.length > longestCommonPrefix.length) { + typeScopedContext[shortcut.slice(longestCommonPrefix.length + 1)] = typeScopedContext[shortcut]; + } } - ( shortcuts[match[0]])['@context'] = typeScopedContext; } + + ( shortcuts[match[0]])['@context'] = typeScopedContext; } } return shortcuts; } + + public static isParameterRangeList(range: ParameterDefinitionRange | undefined): boolean { + if (range && typeof range !== 'string' && '@type' in range) { + if (range['@type'] === 'ParameterRangeArray' || range['@type'] === 'ParameterRangeCollectEntries') { + return true; + } + if (range['@type'] === 'ParameterRangeUnion' && range.parameterRangeElements.length === 2) { + const elementLeft = range.parameterRangeElements[0]; + const elementRight = range.parameterRangeElements[1]; + return (this.isParameterRangeUndefined(elementLeft) && this.isParameterRangeList(elementRight)) || + (this.isParameterRangeUndefined(elementRight) && this.isParameterRangeList(elementLeft)); + } + } + return false; + } + + public static isParameterRangeUndefined(range: ParameterDefinitionRange): boolean { + return typeof range !== 'string' && '@type' in range && range['@type'] === 'ParameterRangeUndefined'; + } + + public static isParameterRangeJson(range: ParameterDefinitionRange | undefined): boolean { + if (range && typeof range !== 'string' && '@type' in range && + range['@type'] === 'ParameterRangeArray' && this.isParameterRangeJson(range.parameterRangeValue)) { + return true; + } + return range === 'rdf:JSON'; + } } export interface ContextConstructorArgs { packageMetadata: PackageMetadata; - typeScopedContexts: boolean; } export interface ContextRaw { diff --git a/lib/util/PathUtil.ts b/lib/util/PathUtil.ts new file mode 100644 index 0000000..900845e --- /dev/null +++ b/lib/util/PathUtil.ts @@ -0,0 +1,46 @@ +import * as Path from 'node:path'; + +/** + * Changes a potential Windows path into a POSIX path. + * + * @param path - Path to check (POSIX or Windows). + * + * @returns The potentially changed path (POSIX). + */ +function windowsToPosixPath(path: string): string { + return path.replaceAll(/\\+/gu, '/'); +} + +/** + * Resolves relative segments in the path. + * + * @param path - Path to check (POSIX or Windows). + * + * @returns The potentially changed path (POSIX). + */ +export function normalizeFilePath(path: string): string { + return Path.posix.normalize(windowsToPosixPath(path)); +} + +/** + * Adds the paths to the base path. + * + * @param basePath - The base path (POSIX or Windows). + * @param paths - Subpaths to attach (POSIX). + * + * @returns The potentially changed path (POSIX). + */ +export function joinFilePath(basePath: string, ...paths: string[]): string { + return Path.posix.join(windowsToPosixPath(basePath), ...paths); +} + +/** + * Returns the directory name of a path. + * + * @param path - Path to find directory of. + * + * @returns The directory path. + */ +export function filePathDirName(path: string): string { + return Path.posix.dirname(windowsToPosixPath(path)); +} diff --git a/package.json b/package.json index 30e8e11..a10c8e9 100644 --- a/package.json +++ b/package.json @@ -1,42 +1,14 @@ { "name": "componentsjs-generator", - "version": "2.6.0", + "version": "4.3.0", + "packageManager": "yarn@4.7.0", "description": "Automatically generate component files from TypeScript classes for the Components.js dependency injection framework", - "main": "index.js", - "scripts": { - "build": "tsc", - "test": "jest ${1}", - "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls", - "lint": "eslint . --ext .ts --cache", - "prepare": "husky install", - "version": "manual-git-changelog onversion" - }, - "jest": { - "globals": { - "ts-jest": { - "tsconfig": "tsconfig.json" - } - }, - "transform": { - "^.+\\.ts$": "ts-jest" - }, - "testRegex": "(/test/.*|(\\.|/)(test|spec))\\.test.ts$", - "moduleFileExtensions": [ - "ts", - "js" - ], - "collectCoverage": true, - "coveragePathIgnorePatterns": [ - "test" - ], - "coverageThreshold": { - "global": { - "branches": 100, - "functions": 100, - "lines": 100, - "statements": 100 - } - } + "author": "Ruben Taelman ", + "license": "MIT", + "homepage": "https://github.com/LinkedSoftwareDependencies/Components-Generator.js#readme", + "repository": "git@github.com:LinkedSoftwareDependencies/Components-Generator.js.git", + "bugs": { + "url": "https://github.com/LinkedSoftwareDependencies/Components-Generator.js/issues" }, "keywords": [ "lsd", @@ -45,61 +17,52 @@ "dependency injection", "typescript" ], - "author": "Ruben Taelman ", - "repository": "git@github.com:LinkedSoftwareDependencies/Components-Generator.js.git", - "bugs": { - "url": "https://github.com/LinkedSoftwareDependencies/Components-Generator.js/issues" - }, - "homepage": "https://github.com/LinkedSoftwareDependencies/Components-Generator.js#readme", - "license": "MIT", - "bin": { - "componentsjs-generator": "bin/componentsjs-generator.js" - }, + "main": "lib/index.js", + "bin": "bin/componentsjs-generator.js", "files": [ "bin/**/*.d.ts", "bin/**/*.js", "lib/**/*.d.ts", "lib/**/*.js", - "lib/**/*.json", - "index.d.ts", - "index.ts" + "lib/**/*.json" ], + "engines": { + "node": ">=18.12" + }, + "scripts": { + "build": "tsc", + "test": "jest --maxWorkers=50%", + "lint": "eslint . --cache", + "prepare": "husky && yarn build", + "version": "manual-git-changelog onversion" + }, "dependencies": { - "@types/lru-cache": "^5.1.0", - "@types/semver": "^7.3.4", - "@typescript-eslint/typescript-estree": "^4.6.1", - "comment-parser": "^0.7.6", - "componentsjs": "^4.4.0", - "jsonld-context-parser": "^2.0.2", - "lru-cache": "^6.0.0", - "minimist": "^1.2.5", - "semver": "^7.3.2" + "@types/semver": "^7.0.0", + "@typescript-eslint/typescript-estree": "^7.1.0", + "comment-parser": "^1.4.0", + "componentsjs": "^6.3.0", + "jsonld-context-parser": "^3.0.0", + "lru-cache": "^11.0.0", + "minimist": "^1.2.0", + "rdf-object": "^2.0.0", + "semver": "^7.0.0" }, "devDependencies": { - "@rubensworks/eslint-config": "^1.0.1", - "@types/fs-extra": "^9.0.0", - "@types/jest": "^26.0.0", - "@types/jsonld": "^1.5.0", + "@rubensworks/eslint-config": "^3.0.0", + "@types/fs-extra": "^11.0.0", + "@types/jest": "^29.0.0", "@types/minimist": "^1.2.0", - "@types/node": "^14.14.7", - "@types/rimraf": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^4.2.0", - "@typescript-eslint/parser": "^4.1.1", - "coveralls": "^3.0.0", - "eslint": "^7.9.0", - "eslint-config-es": "^3.23.0", - "eslint-import-resolver-typescript": "^2.3.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jest": "^24.0.2", - "eslint-plugin-tsdoc": "^0.2.7", - "eslint-plugin-unused-imports": "^0.1.3", - "fs-extra": "^9.0.0", - "husky": "^6.0.0", - "jest": "^27.0.1", - "jest-extended": "^0.11.2", - "manual-git-changelog": "^1.0.1", - "rimraf": "latest", - "ts-jest": "^27.0.1", - "typescript": "^4.0.5" + "@types/node": "^24.0.0", + "@types/rimraf": "^4.0.0", + "eslint": "^8.0.0", + "fs-extra": "^11.0.0", + "husky": "^9.0.0", + "jest": "^29.0.0", + "jest-extended": "^7.0.0", + "manual-git-changelog": "^1.0.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.0.0", + "ts-node": "^10.0.0", + "typescript": "^5.0.0" } } diff --git a/test/ResolutionContextMocked.ts b/test/ResolutionContextMocked.ts index 7cb2af4..751256b 100644 --- a/test/ResolutionContextMocked.ts +++ b/test/ResolutionContextMocked.ts @@ -1,6 +1,7 @@ /* istanbul ignore file */ import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; import { ResolutionContext } from '../lib/resolution/ResolutionContext'; +import { normalizeFilePath } from '../lib/util/PathUtil'; export class ResolutionContextMocked extends ResolutionContext { public contentsOverrides: Record>; @@ -15,6 +16,15 @@ export class ResolutionContextMocked extends ResolutionContext { this.packageNameIndexOverrides = packageNameIndexOverrides; } + public resolveTypesPath(filePath: string): Promise { + return new Promise((resolve) => { + if (!(`${filePath}.d.ts` in this.contentsOverrides)) { + return resolve(normalizeFilePath(`${filePath}/index`)); + } + resolve(filePath); + }); + } + public async getFileContent(filePath: string): Promise { if (!(filePath in this.contentsOverrides)) { throw new Error(`Could not find mocked path for ${filePath}`); diff --git a/test/config/FileConfigLoader.test.ts b/test/config/FileConfigLoader.test.ts new file mode 100644 index 0000000..654b053 --- /dev/null +++ b/test/config/FileConfigLoader.test.ts @@ -0,0 +1,48 @@ +import { FileConfigLoader } from '../../lib/config/FileConfigLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('FileConfigLoader', () => { + let resolutionContext: ResolutionContextMocked; + let loader: FileConfigLoader; + + beforeEach(() => { + resolutionContext = new ResolutionContextMocked({}); + loader = new FileConfigLoader({ resolutionContext }); + }); + + describe('getClosestConfigFile', () => { + it('should be undefined when no config file exists', async() => { + await expect(loader.getClosestConfigFile(normalizeFilePath('/a/b/c'))).resolves.toBeUndefined(); + }); + + it('should be defined when a config file exists', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/a/b/c/.componentsjs-generator-config.json')] = `{ "a": true }`; + await expect(loader.getClosestConfigFile(normalizeFilePath('/a/b/c/'))).resolves.toEqual({ a: true }); + }); + + it('should be defined when a config file exists in parent directory', async() => { + resolutionContext + .contentsOverrides[normalizeFilePath('/a/b/.componentsjs-generator-config.json')] = '{ "a": true }'; + await expect(loader.getClosestConfigFile(normalizeFilePath('/a/b/c/'))).resolves.toEqual({ a: true }); + }); + + it('should be defined when multiple config files exists directory chain', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/a/b/c/.componentsjs-generator-config.json')] = `{ "a": true }`; + resolutionContext + .contentsOverrides[normalizeFilePath('/a/b/.componentsjs-generator-config.json')] = '{ "b": true }'; + await expect(loader.getClosestConfigFile(normalizeFilePath('/a/b/c/'))).resolves.toEqual({ a: true }); + }); + }); + + describe('getConsideredDirectories', () => { + it('should return all parent directories', () => { + expect(loader.getConsideredDirectories([ '', 'a', 'b', 'c', 'd' ].join('/'))).toEqual([ + [ '', 'a', 'b', 'c', 'd' ].join('/'), + [ '', 'a', 'b', 'c' ].join('/'), + [ '', 'a', 'b' ].join('/'), + [ '', 'a' ].join('/'), + ]); + }); + }); +}); diff --git a/test/config/GeneratorFactory.test.ts b/test/config/GeneratorFactory.test.ts new file mode 100644 index 0000000..28ef75b --- /dev/null +++ b/test/config/GeneratorFactory.test.ts @@ -0,0 +1,159 @@ +import { GeneratorFactory } from '../../lib/config/GeneratorFactory'; +import { Generator } from '../../lib/generate/Generator'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('GeneratorFactory', () => { + let resolutionContext: ResolutionContextMocked; + let factory: GeneratorFactory; + + beforeEach(() => { + resolutionContext = new ResolutionContextMocked({}); + factory = new GeneratorFactory({ resolutionContext }); + }); + + describe('createGenerator', () => { + it('should create a new generator without custom options', async() => { + await expect(factory.createGenerator( + normalizeFilePath('/root'), + {}, + [ normalizeFilePath('/root') ], + )).resolves.toBeInstanceOf(Generator); + }); + + it('should create a new generator with custom options', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/root/.componentsjs-generator-config.json')] = `{ "source": "FILESRC/", "extension": "FILEEXT", "debugState": true }`; + resolutionContext.contentsOverrides[normalizeFilePath('/root/.componentsignore')] = '[ "a", "b" ]'; + await expect(factory.createGenerator('/root', { + c: 'COMPONENTS/', + e: 'EXT', + r: 'PRE', + i: normalizeFilePath('/root/.componentsignore'), + }, [ normalizeFilePath('/root') ])).resolves.toBeInstanceOf(Generator); + }); + + it('should create a new generator when ignoring certain packages', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/root/.componentsjs-generator-config.json')] = `{ "ignorePackagePaths": [ "ignored1/", "ignored2/" ] }`; + await expect(factory.createGenerator(normalizeFilePath('/root'), { + c: 'COMPONENTS/', + e: 'EXT', + r: 'PRE', + }, [ normalizeFilePath('/root'), normalizeFilePath('/ignored1'), normalizeFilePath('/ignored2') ])).resolves + .toBeInstanceOf(Generator); + }); + }); + + describe('getConfig', () => { + it('should handle no cli args and no config file', async() => { + await expect(factory.getConfig('root', {})).resolves.toEqual({ + source: 'lib', + destination: 'components', + extension: 'jsonld', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: undefined, + debugState: false, + hardErrorUnsupported: true, + }); + }); + + it('should handle no cli args and config file', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/root/.componentsjs-generator-config.json')] = `{ "source": "FILESRC/", "extension": "FILEEXT", "debugState": true }`; + await expect(factory.getConfig(normalizeFilePath('/root'), {})).resolves.toEqual({ + source: 'FILESRC/', + destination: 'components', + extension: 'FILEEXT', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: undefined, + debugState: true, + hardErrorUnsupported: true, + }); + }); + + it('should handle cli args and no config file', async() => { + await expect(factory.getConfig('root', { + s: 'SOURCE/', + c: 'COMPONENTS/', + e: 'EXT', + r: 'PRE', + })).resolves.toEqual({ + source: 'SOURCE/', + destination: 'COMPONENTS/', + extension: 'EXT', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: 'PRE', + debugState: false, + hardErrorUnsupported: true, + }); + }); + + it('should handle cli args and config file', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('/root/.componentsjs-generator-config.json')] = `{ "source": "FILESRC/", "extension": "FILEEXT", "debugState": true }`; + await expect(factory.getConfig(normalizeFilePath('/root'), { + c: 'COMPONENTS/', + e: 'EXT', + r: 'PRE', + })).resolves.toEqual({ + source: 'FILESRC/', + destination: 'COMPONENTS/', + extension: 'EXT', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: 'PRE', + debugState: true, + hardErrorUnsupported: true, + }); + }); + }); + + describe('getDefaultConfig', () => { + it('should return the default config', () => { + expect(factory.getDefaultConfig()).toEqual({ + source: 'lib', + destination: 'components', + extension: 'jsonld', + ignorePackagePaths: [], + ignoreComponents: [], + logLevel: 'info', + modulePrefix: undefined, + debugState: false, + hardErrorUnsupported: true, + }); + }); + }); + + describe('getCliConfig', () => { + it('should handle empty CLI args', async() => { + await expect(factory.getCliConfig({})).resolves.toEqual({}); + }); + + it('should handle complete CLI args', async() => { + resolutionContext.contentsOverrides['.componentsignore'] = '[ "a", "b" ]'; + await expect(factory.getCliConfig({ + s: 'lib/', + c: 'components/', + e: 'jsonld', + i: '.componentsignore', + l: 'info', + r: 'pre', + debugState: true, + lenient: true, + })).resolves.toEqual({ + source: 'lib/', + destination: 'components/', + extension: 'jsonld', + ignoreComponents: [ 'a', 'b' ], + logLevel: 'info', + modulePrefix: 'pre', + debugState: true, + hardErrorUnsupported: false, + }); + }); + }); +}); diff --git a/test/data/directory/index.d.ts b/test/data/directory/index.d.ts new file mode 100644 index 0000000..b52bbad --- /dev/null +++ b/test/data/directory/index.d.ts @@ -0,0 +1 @@ +export class MyClass {} diff --git a/test/generate/Generator.test.ts b/test/generate/Generator.test.ts new file mode 100644 index 0000000..395cd88 --- /dev/null +++ b/test/generate/Generator.test.ts @@ -0,0 +1,64 @@ +import { Generator } from '../../lib/generate/Generator'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('Generator', () => { + let resolutionContext: ResolutionContextMocked; + let generator: Generator; + + beforeEach(() => { + resolutionContext = new ResolutionContextMocked({}); + generator = new Generator({ + resolutionContext, + pathDestinations: [ + { + packageRootDirectory: 'pckg1', + originalPath: 'orig', + replacementPath: 'repl', + }, + { + packageRootDirectory: 'pckg2', + originalPath: 'orig', + replacementPath: 'repl', + }, + ], + fileExtension: 'jsonld', + ignoreClasses: {}, + logLevel: 'info', + debugState: false, + prefixes: 'pre', + hardErrorUnsupported: true, + }); + }); + + describe('generateComponents', () => { + it('should run for valid packages', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('pckg1/package.json')] = `{ + "name": "@solid/community-server", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`; + resolutionContext.contentsOverrides[normalizeFilePath('pckg1/index.d.ts')] = ``; + resolutionContext.contentsOverrides[normalizeFilePath('pckg2/package.json')] = `{ + "name": "@solid/community-server2", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`; + resolutionContext.contentsOverrides[normalizeFilePath('pckg2/index.d.ts')] = ``; + await generator.generateComponents(); + }); + + it('should run for only a single valid package', async() => { + resolutionContext.contentsOverrides[normalizeFilePath('pckg1/package.json')] = `{ + "name": "@solid/community-server", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`; + resolutionContext.contentsOverrides[normalizeFilePath('pckg1/index.d.ts')] = ``; + await generator.generateComponents(); + }); + }); +}); diff --git a/test/parse/BulkPackageMetadataLoader.test.ts b/test/parse/BulkPackageMetadataLoader.test.ts new file mode 100644 index 0000000..b075d0f --- /dev/null +++ b/test/parse/BulkPackageMetadataLoader.test.ts @@ -0,0 +1,209 @@ +import { JsonLdContextNormalized } from 'jsonld-context-parser'; +import { BulkPackageMetadataLoader } from '../../lib/parse/BulkPackageMetadataLoader'; +import { PackageMetadataLoader } from '../../lib/parse/PackageMetadataLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('BulkPackageMetadataLoader', () => { + const resolutionContext = new ResolutionContextMocked({}); + let packageMetadataLoader: PackageMetadataLoader; + let logger: any; + let loader: BulkPackageMetadataLoader; + + beforeEach(() => { + packageMetadataLoader = new PackageMetadataLoader({ resolutionContext }); + logger = { + warn: jest.fn(), + }; + loader = new BulkPackageMetadataLoader({ + packageMetadataLoader, + logger, + }); + }); + + describe('load', () => { + it('should handle empty paths', async() => { + await expect(loader.load([])).resolves.toEqual({ + packageMetadatas: {}, + pathMetadatas: {}, + }); + }); + + it('should skip a package that does not exist', async() => { + await expect(loader.load([ + { + packageRootDirectory: '/', + originalPath: 'src', + replacementPath: 'components', + }, + ])).resolves.toEqual({ + packageMetadatas: {}, + pathMetadatas: {}, + }); + expect(logger.warn).toHaveBeenCalledWith(`Skipped generating invalid package at "/": Could not find mocked path for ${normalizeFilePath('/package.json')}`); + }); + + it('should skip an invalid package that does not exist', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('/package.json')]: `{ + "name": "@solid/community-server", + "version": "1.2.3" +}`, + }; + + await expect(loader.load([ + { + packageRootDirectory: '/', + originalPath: 'src', + replacementPath: 'components', + }, + ])).resolves.toEqual({ + packageMetadatas: {}, + pathMetadatas: {}, + }); + expect(logger.warn).toHaveBeenCalledWith(`Skipped generating invalid package at "/": Invalid package: Missing 'lsd:module' IRI in ${normalizeFilePath('/package.json')}`); + }); + + it('should a single valid paths', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('/packages/pckg1/package.json')]: `{ + "name": "pckg1", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`, + }; + + await expect(loader.load([ + { + packageRootDirectory: '/packages/pckg1', + originalPath: 'src', + replacementPath: 'components', + }, + ])).resolves.toEqual({ + packageMetadatas: { + pckg1: { + minimalContext: expect.any(JsonLdContextNormalized), + packageMetadata: { + componentsPath: normalizeFilePath('/packages/pckg1/components/components.jsonld'), + contexts: { + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/components/context.jsonld': + 'components/context.jsonld', + }, + importPaths: { + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/components/': 'components/', + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/config/': 'config/', + }, + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1', + name: 'pckg1', + prefix: undefined, + typesPath: normalizeFilePath('/packages/pckg1/index'), + version: '1.2.3', + }, + pathDestination: { + packageRootDirectory: '/packages/pckg1', + originalPath: 'src', + replacementPath: 'components', + }, + }, + }, + pathMetadatas: { + '/packages/pckg1': { + componentsPath: normalizeFilePath('/packages/pckg1/components/components.jsonld'), + contexts: { + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/components/context.jsonld': + 'components/context.jsonld', + }, + importPaths: { + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/components/': 'components/', + 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1/^1.0.0/config/': 'config/', + }, + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/pckg1', + name: 'pckg1', + prefix: undefined, + typesPath: normalizeFilePath('/packages/pckg1/index'), + version: '1.2.3', + }, + }, + }); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('should multiple valid paths', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('/packages/pckg1/package.json')]: `{ + "name": "pckg1", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`, + [normalizeFilePath('/packages/pckg2/package.json')]: `{ + "name": "pckg2", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`, + [normalizeFilePath('/packages/pckg3/package.json')]: `{ + "name": "pckg3", + "version": "1.2.3", + "lsd:module": true, + "types": "./index.d.ts" +}`, + }; + + await expect(loader.load([ + { + packageRootDirectory: '/packages/pckg1', + originalPath: 'src', + replacementPath: 'components', + }, + { + packageRootDirectory: '/packages/pckg2', + originalPath: 'src', + replacementPath: 'components', + }, + { + packageRootDirectory: '/packages/pckg3', + originalPath: 'src', + replacementPath: 'components', + }, + ])).resolves.toEqual({ + packageMetadatas: { + pckg1: { + minimalContext: expect.any(JsonLdContextNormalized), + packageMetadata: expect.anything(), + pathDestination: { + packageRootDirectory: '/packages/pckg1', + originalPath: 'src', + replacementPath: 'components', + }, + }, + pckg2: { + minimalContext: expect.any(JsonLdContextNormalized), + packageMetadata: expect.anything(), + pathDestination: { + packageRootDirectory: '/packages/pckg2', + originalPath: 'src', + replacementPath: 'components', + }, + }, + pckg3: { + minimalContext: expect.any(JsonLdContextNormalized), + packageMetadata: expect.anything(), + pathDestination: { + packageRootDirectory: '/packages/pckg3', + originalPath: 'src', + replacementPath: 'components', + }, + }, + }, + pathMetadatas: { + '/packages/pckg1': expect.anything(), + '/packages/pckg2': expect.anything(), + '/packages/pckg3': expect.anything(), + }, + }); + expect(logger.warn).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/test/parse/ClassFinder.test.ts b/test/parse/ClassFinder.test.ts index fe5d811..d56085a 100644 --- a/test/parse/ClassFinder.test.ts +++ b/test/parse/ClassFinder.test.ts @@ -1,6 +1,7 @@ -import * as Path from 'path'; import { ClassFinder } from '../../lib/parse/ClassFinder'; import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ClassFinder', () => { @@ -12,7 +13,8 @@ describe('ClassFinder', () => { logger = { debug: jest.fn(), }; - parser = new ClassFinder({ classLoader: new ClassLoader({ resolutionContext, logger }) }); + const commentLoader = new CommentLoader(); + parser = new ClassFinder({ classLoader: new ClassLoader({ resolutionContext, logger, commentLoader }) }); }); describe('getFileExports', () => { @@ -20,12 +22,13 @@ describe('ClassFinder', () => { resolutionContext.contentsOverrides = { 'file.d.ts': `export {B as Class} from './lib/B'`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { Class: { packageName: 'package', - fileName: Path.normalize('lib/B'), + fileName: normalizeFilePath('lib/B'), + fileNameReferenced: 'file', localName: 'B', }, }, @@ -37,13 +40,14 @@ describe('ClassFinder', () => { resolutionContext.contentsOverrides = { 'file.d.ts': `export * from './lib/B'`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [ { packageName: 'package', - fileName: Path.normalize('lib/B'), + fileName: normalizeFilePath('lib/B'), + fileNameReferenced: 'file', }, ], }); @@ -54,13 +58,14 @@ describe('ClassFinder', () => { 'file.d.ts': `export * from 'other-package'`, }; resolutionContext.packageNameIndexOverrides['other-package'] = '/some-dir/index.js'; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [ { packageName: 'other-package', fileName: '/some-dir/index', + fileNameReferenced: 'file', }, ], }); @@ -73,12 +78,13 @@ export class A{} export type B = string; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { A: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -93,12 +99,13 @@ export interface A{} export type B = string; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { A: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -115,29 +122,33 @@ export {C as Class3} from './lib/C'; export * from './lib/D'; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { Class1: { packageName: 'package', - fileName: Path.normalize('lib/A'), + fileName: normalizeFilePath('lib/A'), + fileNameReferenced: 'file', localName: 'A', }, Class2: { packageName: 'package', - fileName: Path.normalize('lib/B'), + fileName: normalizeFilePath('lib/B'), + fileNameReferenced: 'file', localName: 'B', }, Class3: { packageName: 'package', - fileName: Path.normalize('lib/C'), + fileName: normalizeFilePath('lib/C'), + fileNameReferenced: 'file', localName: 'C', }, }, unnamed: [ { packageName: 'package', - fileName: Path.normalize('lib/D'), + fileName: normalizeFilePath('lib/D'), + fileNameReferenced: 'file', }, ], }); @@ -147,26 +158,18 @@ export * from './lib/D'; resolutionContext.contentsOverrides = { 'file.d.ts': `export default class {}`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [], }); }); - it('for an invalid class with no name', async() => { - resolutionContext.contentsOverrides = { - 'file.d.ts': `export class {}`, - }; - await expect(parser.getFileExports('package', 'file')).rejects - .toThrow(new Error(`Export parsing failure: missing exported class name in file on line 1 column 7`)); - }); - it('for a single constant should be ignored', async() => { resolutionContext.contentsOverrides = { 'file.d.ts': `export const foo = "a";`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [], @@ -180,12 +183,13 @@ declare class A {} export {A as B}; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { B: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -200,12 +204,13 @@ export {A as B}; declare class A {} `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { B: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -220,12 +225,13 @@ declare interface A {} export {A as B}; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { B: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -240,12 +246,13 @@ export {A as B}; declare interface A {} `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { B: { packageName: 'package', fileName: 'file', + fileNameReferenced: 'file', localName: 'A', }, }, @@ -257,7 +264,7 @@ declare interface A {} resolutionContext.contentsOverrides = { 'file.d.ts': `export {A as B};`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [], @@ -271,12 +278,13 @@ import {X as A} from './lib/A'; export {A}; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: { A: { packageName: 'package', - fileName: Path.normalize('lib/A'), + fileName: normalizeFilePath('lib/A'), + fileNameReferenced: 'file', localName: 'X', }, }, @@ -288,7 +296,7 @@ export {A}; resolutionContext.contentsOverrides = { 'file.d.ts': `import polygons = Shapes.Polygons`, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [], @@ -302,7 +310,7 @@ import A from './lib/A'; export {A}; `, }; - expect(await parser.getFileExports('package', 'file')) + await expect(parser.getFileExports('package', 'file')).resolves .toEqual({ named: {}, unnamed: [], @@ -313,14 +321,15 @@ export {A}; describe('getPackageExports', () => { it('for a single named export', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('package-simple-named/index.d.ts')]: `export {A as B} from './lib/A';`, - [Path.normalize('package-simple-named/lib/A.d.ts')]: 'export class A {}', + [normalizeFilePath('package-simple-named/index.d.ts')]: `export {A as B} from './lib/A';`, + [normalizeFilePath('package-simple-named/lib/A.d.ts')]: 'export class A {}', }; - expect(await parser.getPackageExports('package', Path.normalize('package-simple-named/index'))) + await expect(parser.getPackageExports('package', normalizeFilePath('package-simple-named/index'))).resolves .toEqual({ B: { packageName: 'package', - fileName: Path.normalize('package-simple-named/lib/A'), + fileName: normalizeFilePath('package-simple-named/lib/A'), + fileNameReferenced: normalizeFilePath('package-simple-named/index'), localName: 'A', }, }); @@ -328,38 +337,70 @@ export {A}; it('for a single unnamed export', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('package-simple-unnamed/index.d.ts')]: `export * from './lib/A';`, - [Path.normalize('package-simple-unnamed/lib/A.d.ts')]: 'export class A {}', + [normalizeFilePath('package-simple-unnamed/index.d.ts')]: `export * from './lib/A';`, + [normalizeFilePath('package-simple-unnamed/lib/A.d.ts')]: 'export class A {}', + }; + await expect(parser.getPackageExports('package', normalizeFilePath('package-simple-unnamed/index'))).resolves + .toEqual({ + A: { + packageName: 'package', + fileName: normalizeFilePath('package-simple-unnamed/lib/A'), + fileNameReferenced: normalizeFilePath('package-simple-unnamed/lib/A'), + localName: 'A', + }, + }); + }); + + it('for a directory export', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('directory-export/index.d.ts')]: ` + export * from './lib'; + `, + [normalizeFilePath('directory-export/lib/index.d.ts')]: ` + export * from './A'; + export * from './C'; + `, + [normalizeFilePath('directory-export/lib/A.d.ts')]: 'export class A {}', + [normalizeFilePath('directory-export/lib/C.d.ts')]: 'export class C {}', }; - expect(await parser.getPackageExports('package', Path.normalize('package-simple-unnamed/index'))) + await expect(parser.getPackageExports('package', normalizeFilePath('directory-export/index'))).resolves .toEqual({ A: { packageName: 'package', - fileName: Path.normalize('package-simple-unnamed/lib/A'), + fileName: normalizeFilePath('directory-export/lib/A'), + fileNameReferenced: normalizeFilePath('directory-export/lib/A'), localName: 'A', }, + C: { + packageName: 'package', + fileName: normalizeFilePath('directory-export/lib/C'), + fileNameReferenced: normalizeFilePath('directory-export/lib/C'), + localName: 'C', + }, }); }); it('for a multiple exports', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('package-multiple/index.d.ts')]: ` + [normalizeFilePath('package-multiple/index.d.ts')]: ` export {A as B} from './lib/A'; export * from './lib/C'; `, - [Path.normalize('package-multiple/lib/A.d.ts')]: 'export class A {}', - [Path.normalize('package-multiple/lib/C.d.ts')]: 'export class C {}', + [normalizeFilePath('package-multiple/lib/A.d.ts')]: 'export class A {}', + [normalizeFilePath('package-multiple/lib/C.d.ts')]: 'export class C {}', }; - expect(await parser.getPackageExports('package', Path.normalize('package-multiple/index'))) + await expect(parser.getPackageExports('package', normalizeFilePath('package-multiple/index'))).resolves .toEqual({ B: { packageName: 'package', - fileName: Path.normalize('package-multiple/lib/A'), + fileName: normalizeFilePath('package-multiple/lib/A'), + fileNameReferenced: normalizeFilePath('package-multiple/index'), localName: 'A', }, C: { packageName: 'package', - fileName: Path.normalize('package-multiple/lib/C'), + fileName: normalizeFilePath('package-multiple/lib/C'), + fileNameReferenced: normalizeFilePath('package-multiple/lib/C'), localName: 'C', }, }); @@ -367,24 +408,26 @@ export * from './lib/C'; it('for nested exports', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('package-nested/index.d.ts')]: `export * from './lib/A';`, - [Path.normalize('package-nested/lib/A.d.ts')]: ` + [normalizeFilePath('package-nested/index.d.ts')]: `export * from './lib/A';`, + [normalizeFilePath('package-nested/lib/A.d.ts')]: ` export * from './sub1/B' export * from './sub2/C' `, - [Path.normalize('package-nested/lib/sub1/B.d.ts')]: 'export class B {}', - [Path.normalize('package-nested/lib/sub2/C.d.ts')]: 'export class C {}', + [normalizeFilePath('package-nested/lib/sub1/B.d.ts')]: 'export class B {}', + [normalizeFilePath('package-nested/lib/sub2/C.d.ts')]: 'export class C {}', }; - expect(await parser.getPackageExports('package', Path.normalize('package-nested/index'))) + await expect(parser.getPackageExports('package', normalizeFilePath('package-nested/index'))).resolves .toEqual({ B: { packageName: 'package', - fileName: Path.normalize('package-nested/lib/sub1/B'), + fileName: normalizeFilePath('package-nested/lib/sub1/B'), + fileNameReferenced: normalizeFilePath('package-nested/lib/sub1/B'), localName: 'B', }, C: { packageName: 'package', - fileName: Path.normalize('package-nested/lib/sub2/C'), + fileName: normalizeFilePath('package-nested/lib/sub2/C'), + fileNameReferenced: normalizeFilePath('package-nested/lib/sub2/C'), localName: 'C', }, }); diff --git a/test/parse/ClassIndexer.test.ts b/test/parse/ClassIndexer.test.ts index 562a85d..ecade69 100644 --- a/test/parse/ClassIndexer.test.ts +++ b/test/parse/ClassIndexer.test.ts @@ -1,6 +1,7 @@ import { ClassFinder } from '../../lib/parse/ClassFinder'; import { ClassIndexer } from '../../lib/parse/ClassIndexer'; import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ClassIndexer', () => { @@ -16,14 +17,15 @@ describe('ClassIndexer', () => { logger = { debug: jest.fn(), }; - classLoader = new ClassLoader({ resolutionContext, logger }); + const commentLoader = new CommentLoader(); + classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); classFinder = new ClassFinder({ classLoader }); indexer = new ClassIndexer({ classLoader, classFinder, ignoreClasses, logger }); }); describe('createIndex', () => { it('for an empty index should return empty', async() => { - expect(await indexer.createIndex({})) + await expect(indexer.createIndex({})).resolves .toEqual({}); }); @@ -31,13 +33,14 @@ describe('ClassIndexer', () => { resolutionContext.contentsOverrides = { 'x.d.ts': `export class X{}`, }; - expect(await indexer.createIndex({ + await expect(indexer.createIndex({ A: { packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', }, - })).toMatchObject({ + })).resolves.toMatchObject({ A: { packageName: 'package', localName: 'X', @@ -56,6 +59,7 @@ describe('ClassIndexer', () => { packageName: 'package', localName: 'Unknown', fileName: 'unknown', + fileNameReferenced: 'unknownR', }, })).rejects.toThrow(new Error(`Could not load class or interface Unknown from unknown: Could not find mocked path for unknown.d.ts`)); @@ -63,13 +67,14 @@ Could not find mocked path for unknown.d.ts`)); it('should not throw on a direct class reference to an unknown file when it is ignored', async() => { ignoreClasses.Unknown = true; - expect(await indexer.createIndex({ + await expect(indexer.createIndex({ Unknown: { packageName: 'package', localName: 'Unknown', fileName: 'unknown', + fileNameReferenced: 'unknownR', }, - })).toMatchObject({}); + })).resolves.toMatchObject({}); }); it('should load an indirect class reference', async() => { @@ -77,16 +82,18 @@ Could not find mocked path for unknown.d.ts`)); 'x.d.ts': `export * from './y'`, 'y.d.ts': `export class X{}`, }; - expect(await indexer.createIndex({ + await expect(indexer.createIndex({ A: { packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', }, - })).toMatchObject({ + })).resolves.toMatchObject({ A: { localName: 'X', fileName: 'y', + fileNameReferenced: 'xR', declaration: { id: { name: 'X' }, type: 'ClassDeclaration', @@ -104,6 +111,7 @@ Could not find mocked path for unknown.d.ts`)); packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', }, })).rejects.toThrow(new Error('Could not load class or interface X from x')); }); @@ -115,22 +123,25 @@ export class X{} export class Y{} `, }; - expect(await indexer.createIndex({ + await expect(indexer.createIndex({ A: { packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', }, B: { packageName: 'package', localName: 'Y', fileName: 'x', + fileNameReferenced: 'xR', }, - })).toMatchObject({ + })).resolves.toMatchObject({ A: { packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', declaration: { id: { name: 'X' }, type: 'ClassDeclaration', @@ -140,6 +151,7 @@ export class Y{} packageName: 'package', localName: 'Y', fileName: 'x', + fileNameReferenced: 'xR', declaration: { id: { name: 'Y' }, type: 'ClassDeclaration', @@ -158,22 +170,25 @@ export class X{} export class Y{} `, }; - expect(await indexer.createIndex({ + await expect(indexer.createIndex({ A: { packageName: 'package', localName: 'X', fileName: 'x', + fileNameReferenced: 'xR', }, B: { packageName: 'package', localName: 'Y', fileName: 'x', + fileNameReferenced: 'xR', }, - })).toMatchObject({ + })).resolves.toMatchObject({ A: { packageName: 'package', localName: 'X', fileName: 'y', + fileNameReferenced: 'xR', declaration: { id: { name: 'X' }, type: 'ClassDeclaration', @@ -183,6 +198,7 @@ export class Y{} packageName: 'package', localName: 'Y', fileName: 'y', + fileNameReferenced: 'xR', declaration: { id: { name: 'Y' }, type: 'ClassDeclaration', @@ -197,7 +213,12 @@ export class Y{} resolutionContext.contentsOverrides = { 'file.d.ts': ``, }; - await expect(indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })) .rejects.toThrow(new Error('Could not load class or interface A from file')); }); @@ -205,7 +226,12 @@ export class Y{} resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -224,7 +250,47 @@ export class A extends B{} export class B{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves + .toMatchObject({ + packageName: 'package', + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + superClass: { + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }, + }, + }); + }); + + it('for an exported class with super in current file with generics', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': ` +export class A extends B{} +export class B{} +`, + }; + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -234,12 +300,21 @@ export class B{} type: 'ClassDeclaration', }, superClass: { - packageName: 'package', - localName: 'B', - fileName: 'file', - declaration: { - id: { name: 'B' }, - type: 'ClassDeclaration', + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }, + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], }, }, }); @@ -253,7 +328,12 @@ export { X as B } from './X' `, 'X.d.ts': `export class X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -263,12 +343,14 @@ export { X as B } from './X' type: 'ClassDeclaration', }, superClass: { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'ClassDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'ClassDeclaration', + }, }, }, }); @@ -283,7 +365,12 @@ export { X as B } from 'other-package' '/some-dir/index.d.ts': `export class X{}`, }; resolutionContext.packageNameIndexOverrides['other-package'] = '/some-dir/index.js'; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -293,12 +380,14 @@ export { X as B } from 'other-package' type: 'ClassDeclaration', }, superClass: { - packageName: 'other-package', - localName: 'X', - fileName: '/some-dir/index', - declaration: { - id: { name: 'X' }, - type: 'ClassDeclaration', + value: { + packageName: 'other-package', + localName: 'X', + fileName: '/some-dir/index', + declaration: { + id: { name: 'X' }, + type: 'ClassDeclaration', + }, }, }, }); @@ -312,7 +401,12 @@ export * from './X' `, 'X.d.ts': `export class X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -322,12 +416,14 @@ export * from './X' type: 'ClassDeclaration', }, superClass: { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'ClassDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'ClassDeclaration', + }, }, }, }); @@ -343,7 +439,12 @@ export * from './Z' 'Y.d.ts': `export * from './X'`, 'X.d.ts': `export class X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -353,12 +454,14 @@ export * from './Z' type: 'ClassDeclaration', }, superClass: { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'ClassDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'ClassDeclaration', + }, }, }, }); @@ -371,7 +474,12 @@ export class A extends Interface{}; export interface Interface{}; `, }; - await expect(indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })) .rejects.toThrow(new Error(`Detected non-class Interface extending from a class A in file`)); }); @@ -381,7 +489,12 @@ export interface Interface{}; export class A extends Unknown{} `, }; - await expect(indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })) .rejects.toThrow(new Error(`Failed to load super class Unknown of A in file: Could not load class or interface Unknown from file`)); }); @@ -393,7 +506,12 @@ Could not load class or interface Unknown from file`)); export class A extends Unknown{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -412,7 +530,12 @@ export class A implements B{} export interface B{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -423,12 +546,58 @@ export interface B{} }, implementsInterfaces: [ { - packageName: 'package', - localName: 'B', - fileName: 'file', - declaration: { - id: { name: 'B' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'TSInterfaceDeclaration', + }, + }, + }, + ], + }); + }); + + it('for an exported class with implements interface in current file with generics', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': ` +export class A implements B{} +export interface B{} +`, + }; + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves + .toMatchObject({ + packageName: 'package', + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + implementsInterfaces: [ + { + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'TSInterfaceDeclaration', + }, + }, + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], }, }, ], @@ -443,7 +612,12 @@ export { X as B } from './X' `, 'X.d.ts': `export interface X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -454,12 +628,14 @@ export { X as B } from './X' }, implementsInterfaces: [ { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -472,7 +648,12 @@ export { X as B } from './X' export class A implements Unknown{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -494,7 +675,12 @@ Could not load class or interface Unknown from file`); export class A implements Unknown{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -513,7 +699,12 @@ export class A implements B{} export class B{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -524,12 +715,14 @@ export class B{} }, implementsInterfaces: [ { - packageName: 'package', - localName: 'B', - fileName: 'file', - declaration: { - id: { name: 'B' }, - type: 'ClassDeclaration', + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, }, }, ], @@ -540,7 +733,12 @@ export class B{} resolutionContext.contentsOverrides = { 'file.d.ts': `export interface A{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -559,7 +757,12 @@ export interface A extends B{} export interface B{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -570,12 +773,58 @@ export interface B{} }, superInterfaces: [ { - packageName: 'package', - localName: 'B', - fileName: 'file', - declaration: { - id: { name: 'B' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'TSInterfaceDeclaration', + }, + }, + }, + ], + }); + }); + + it('for an exported interface with super in current file with generics', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': ` +export interface A extends B{} +export interface B{} +`, + }; + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves + .toMatchObject({ + packageName: 'package', + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSInterfaceDeclaration', + }, + superInterfaces: [ + { + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'TSInterfaceDeclaration', + }, + }, + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], }, }, ], @@ -590,7 +839,12 @@ export interface B{} export interface C{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -601,21 +855,25 @@ export interface C{} }, superInterfaces: [ { - packageName: 'package', - localName: 'B', - fileName: 'file', - declaration: { - id: { name: 'B' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'B', + fileName: 'file', + declaration: { + id: { name: 'B' }, + type: 'TSInterfaceDeclaration', + }, }, }, { - packageName: 'package', - localName: 'C', - fileName: 'file', - declaration: { - id: { name: 'C' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'C', + fileName: 'file', + declaration: { + id: { name: 'C' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -630,7 +888,12 @@ export { X as B } from './X' `, 'X.d.ts': `export interface X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -641,12 +904,14 @@ export { X as B } from './X' }, superInterfaces: [ { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -662,7 +927,12 @@ export { X as B } from 'other-package' '/some-dir/index.d.ts': `export interface X{}`, }; resolutionContext.packageNameIndexOverrides['other-package'] = '/some-dir/index.js'; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -673,12 +943,14 @@ export { X as B } from 'other-package' }, superInterfaces: [ { - packageName: 'other-package', - localName: 'X', - fileName: '/some-dir/index', - declaration: { - id: { name: 'X' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'other-package', + localName: 'X', + fileName: '/some-dir/index', + declaration: { + id: { name: 'X' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -693,7 +965,12 @@ export * from './X' `, 'X.d.ts': `export interface X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -704,12 +981,14 @@ export * from './X' }, superInterfaces: [ { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -726,7 +1005,12 @@ export * from './Z' 'Y.d.ts': `export * from './X'`, 'X.d.ts': `export interface X{}`, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -737,12 +1021,14 @@ export * from './Z' }, superInterfaces: [ { - packageName: 'package', - localName: 'X', - fileName: 'X', - declaration: { - id: { name: 'X' }, - type: 'TSInterfaceDeclaration', + value: { + packageName: 'package', + localName: 'X', + fileName: 'X', + declaration: { + id: { name: 'X' }, + type: 'TSInterfaceDeclaration', + }, }, }, ], @@ -756,7 +1042,12 @@ export interface A extends AClass{}; export class AClass{}; `, }; - await expect(indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })) .rejects.toThrow(new Error(`Detected non-interface A extending from a class AClass in file`)); }); @@ -766,7 +1057,12 @@ export class AClass{}; export interface A extends Unknown{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', @@ -787,7 +1083,12 @@ Could not load class or interface Unknown from file`); export interface A extends Unknown{} `, }; - expect(await indexer.loadClassChain({ packageName: 'package', localName: 'A', fileName: 'file' })) + await expect(indexer.loadClassChain({ + packageName: 'package', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + })).resolves .toMatchObject({ packageName: 'package', localName: 'A', diff --git a/test/parse/ClassLoader.test.ts b/test/parse/ClassLoader.test.ts index d93484d..ab2abcc 100644 --- a/test/parse/ClassLoader.test.ts +++ b/test/parse/ClassLoader.test.ts @@ -1,20 +1,24 @@ -import * as Path from 'path'; import type { AST, TSESTreeOptions } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ClassLoader', () => { let resolutionContext: ResolutionContextMocked; let logger: any; + let commentLoader: CommentLoader; let loader: ClassLoader; beforeEach(() => { resolutionContext = new ResolutionContextMocked({}); logger = { + warn: jest.fn(), debug: jest.fn(), }; - loader = new ClassLoader({ resolutionContext, logger }); + commentLoader = new CommentLoader(); + loader = new ClassLoader({ resolutionContext, logger, commentLoader }); }); describe('getSuperClass', () => { @@ -27,7 +31,7 @@ describe('ClassLoader', () => { it('should return on a class that is extended', async() => { expect(loader.getSuperClassName((resolutionContext .parseTypescriptContents(`class A extends B{}`)).body[0], 'file')) - .toEqual('B'); + .toEqual({ value: 'B' }); }); it('should error on a class that is extended via a namespace', async() => { @@ -41,6 +45,21 @@ describe('ClassLoader', () => { .parseTypescriptContents(`class A extends class {} {}`)).body[0], 'file')) .rejects.toThrow(new Error('Could not interpret type of superclass in file on line 1 column 16')); }); + + it('should return on a class that is extended with generics', async() => { + expect(loader.getSuperClassName((resolutionContext + .parseTypescriptContents(`class A extends B{}`)).body[0], 'file')) + .toMatchObject({ + value: 'B', + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], + }, + }); + }); }); describe('getSuperInterfaceNames', () => { @@ -54,7 +73,7 @@ describe('ClassLoader', () => { expect(loader.getSuperInterfaceNames((resolutionContext .parseTypescriptContents('interface A extends B{}')).body[0], 'file')) .toEqual([ - 'B', + { value: 'B' }, ]); }); @@ -62,9 +81,9 @@ describe('ClassLoader', () => { expect(loader.getSuperInterfaceNames((resolutionContext .parseTypescriptContents('interface A extends B, C, D{}')).body[0], 'file')) .toEqual([ - 'B', - 'C', - 'D', + { value: 'B' }, + { value: 'C' }, + { value: 'D' }, ]); }); @@ -79,11 +98,28 @@ describe('ClassLoader', () => { expect(loader.getSuperInterfaceNames((resolutionContext .parseTypescriptContents('interface A extends B, {}, D {}')).body[0], 'file')) .toEqual([ - 'B', - 'D', + { value: 'B' }, + { value: 'D' }, ]); expect(logger.debug).toHaveBeenCalledWith(`Ignored an interface expression of unknown type ObjectExpression on A`); }); + + it('should return on an interface with generics', async() => { + expect(loader.getSuperInterfaceNames((resolutionContext + .parseTypescriptContents(`interface A extends B{}`)).body[0], 'file')) + .toMatchObject([ + { + value: 'B', + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], + }, + }, + ]); + }); }); describe('getClassInterfaceNames', () => { @@ -97,7 +133,24 @@ describe('ClassLoader', () => { expect(loader.getClassInterfaceNames((resolutionContext .parseTypescriptContents('class A implements X {}')).body[0], 'file')) .toEqual([ - 'X', + { value: 'X' }, + ]); + }); + + it('should return on a class that implements one interface with generics', async() => { + expect(loader.getClassInterfaceNames((resolutionContext + .parseTypescriptContents('class A implements X {}')).body[0], 'file')) + .toMatchObject([ + { + value: 'X', + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], + }, + }, ]); }); @@ -105,15 +158,21 @@ describe('ClassLoader', () => { expect(loader.getClassInterfaceNames((resolutionContext .parseTypescriptContents('class A implements X, Y, Z {}')).body[0], 'file')) .toEqual([ - 'X', - 'Y', - 'Z', + { value: 'X' }, + { value: 'Y' }, + { value: 'Z' }, ]); }); it('should error on a class that is implemented anonymously', async() => { - await expect(async() => loader.getClassInterfaceNames((resolutionContext - .parseTypescriptContents(`interface A implements {} {}`)).body[0], 'file')) + await expect(async() => loader.getClassInterfaceNames( { + implements: [{ + expression: { + type: 'other', + loc: { start: { line: '1', column: 23 }}, + }, + }], + }, 'file')) .rejects.toThrow(new Error('Could not interpret the implements type on a class in file on line 1 column 23')); }); }); @@ -126,11 +185,51 @@ describe('ClassLoader', () => { 'file.d.ts': ``, }), logger, + commentLoader, }); - await expect(loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)) .rejects.toThrow(new Error('Could not load class A from file')); }); + it('for an empty file should throw with qualified path', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ``, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + qualifiedPath: [ 'a', 'b' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)) + .rejects.toThrow(new Error('Could not load class a.b.A from file')); + }); + + it('for an empty file should throw with qualified path when file does not exist', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({}), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + qualifiedPath: [ 'a', 'b' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)) + .rejects.toThrow(new Error(`Could not load class a.b.A from file:\nCould not find mocked path for file.d.ts`)); + }); + it('for a file without the file class should throw', async() => { loader = new ClassLoader({ resolutionContext: new ResolutionContextMocked({ @@ -143,8 +242,14 @@ export * from './lib/D'; `, }), logger, + commentLoader, }); - await expect(loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)) .rejects.toThrow(new Error('Could not load class A from file')); }); @@ -156,8 +261,14 @@ declare interface A{}; `, }), logger, + commentLoader, }); - await expect(loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)) .rejects.toThrow(new Error('Could not load class A from file')); }); @@ -167,8 +278,14 @@ declare interface A{}; 'file.d.ts': `export class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -185,8 +302,14 @@ declare interface A{}; 'file.d.ts': `declare class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -204,8 +327,14 @@ declare interface A{}; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -223,11 +352,18 @@ declare interface A{}; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', + fileNameReferenced: 'fileReferenced', declaration: { id: { name: 'B' }, type: 'ClassDeclaration', @@ -242,11 +378,18 @@ declare interface A{}; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', + fileNameReferenced: 'fileReferenced', declaration: { id: { name: 'B' }, type: 'ClassDeclaration', @@ -265,8 +408,14 @@ export * from './file3' 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -286,8 +435,14 @@ export * from './file3' 'file4.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file4', @@ -297,6 +452,51 @@ export * from './file3' }, }); }); + + it('for an export assignment to namespace declaration with class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `namespace NS { + class A{} +} +export = NS`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for an export assignment to empty namespace declaration', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `namespace NS{}; +export = NS;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).rejects + .toThrow(`Could not load class A from file`); + }); }); describe('when considering interfaces', () => { @@ -306,8 +506,14 @@ export * from './file3' 'file.d.ts': ``, }), logger, + commentLoader, }); - await expect(loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)) .rejects.toThrow(new Error('Could not load class or interface A from file')); }); @@ -323,8 +529,14 @@ export * from './lib/D'; `, }), logger, + commentLoader, }); - await expect(loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)) .rejects.toThrow(new Error('Could not load class or interface A from file')); }); @@ -334,8 +546,14 @@ export * from './lib/D'; 'file.d.ts': `export class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -352,8 +570,14 @@ export * from './lib/D'; 'file.d.ts': `declare class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -371,8 +595,14 @@ export * from './lib/D'; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -390,8 +620,14 @@ export * from './lib/D'; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -409,8 +645,14 @@ export * from './lib/D'; 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -432,8 +674,14 @@ export * from './file3' 'file2.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -453,8 +701,14 @@ export * from './file3' 'file4.d.ts': `export class B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file4', @@ -471,8 +725,14 @@ export * from './file3' 'file.d.ts': `export interface A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -489,8 +749,14 @@ export * from './file3' 'file.d.ts': `declare interface A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -508,8 +774,14 @@ export * from './file3' 'file2.d.ts': `export interface B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -527,8 +799,14 @@ export * from './file3' 'file2.d.ts': `export interface B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -546,8 +824,14 @@ export * from './file3' 'file2.d.ts': `export interface B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -569,8 +853,14 @@ export * from './file3' 'file2.d.ts': `export interface B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file2', @@ -590,8 +880,14 @@ export * from './file3' 'file4.d.ts': `export interface B{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'B', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'B', fileName: 'file4', @@ -613,8 +909,14 @@ export class A{} `, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -637,8 +939,14 @@ declare class A{} `, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, false)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -661,8 +969,14 @@ export interface A{} `, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -685,8 +999,14 @@ declare interface A{} `, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -697,117 +1017,1043 @@ declare interface A{} comment: 'Hello world!', }); }); - }); - it('for an exported abstract class', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ - 'file.d.ts': `export abstract class A{}`, - }), - logger, - }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) - .toMatchObject({ + it('for an export assignment to namespace declaration with interface', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `namespace NS { + interface A{} +} +export = NS`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', localName: 'A', fileName: 'file', - declaration: { - id: { name: 'A' }, - type: 'ClassDeclaration', - }, - abstract: true, - }); + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSInterfaceDeclaration', + }, + }); + }); }); - it('for a declared abstract class', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ - 'file.d.ts': `declare abstract class A{}`, - }), - logger, - }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) - .toMatchObject({ + describe('when considering other types', () => { + it('for an empty file should throw', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ``, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', localName: 'A', fileName: 'file', - declaration: { - id: { name: 'A' }, - type: 'ClassDeclaration', - }, - abstract: true, - }); - }); - - it('for a declared class with one generic type', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ - 'file.d.ts': `declare class A{}`, - }), - logger, + fileNameReferenced: 'fileReferenced', + }, false, true)) + .rejects.toThrow(new Error('Could not load class or other type A from file')); }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) - .toMatchObject({ + + it('for a file without the file type should throw', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +const A = "a"; +declare type B = number; +export type C = number; +export { B as X }; +export * from './lib/D'; +`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', localName: 'A', fileName: 'file', - declaration: { - id: { name: 'A' }, - type: 'ClassDeclaration', - }, - generics: { - T: { type: { type: 'TSStringKeyword' }}, - }, - }); - }); - - it('for a declared class with one untyped generic type', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ - 'file.d.ts': `declare class A{}`, - }), - logger, + fileNameReferenced: 'fileReferenced', + }, false, true)) + .rejects.toThrow(new Error('Could not load class or other type A from file')); }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) - .toMatchObject({ + + it('for an exported class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', localName: 'A', fileName: 'file', - declaration: { - id: { name: 'A' }, - type: 'ClassDeclaration', - }, - generics: { - T: {}, - }, - }); - }); - - it('for a declared class with one generic type with default', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ - 'file.d.ts': `declare class A{}`, - }), - logger, + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + }); }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) - .toMatchObject({ + + it('for a declared class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', localName: 'A', fileName: 'file', - declaration: { - id: { name: 'A' }, - type: 'ClassDeclaration', - }, - generics: { - T: { type: { type: 'TSStringKeyword' }}, - }, - }); - }); - - it('for an exported class with one generic type', async() => { - loader = new ClassLoader({ - resolutionContext: new ResolutionContextMocked({ + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for an imported class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import { B as A } from './file2'`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked via export import', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export { B as A } from './file2'`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked via export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked on of the multiple export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +export * from './file1' +export * from './file2' +export * from './file3' +`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked via nested export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export * from './file3'`, + 'file3.d.ts': `export * from './file4'`, + 'file4.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file4', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for an exported type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export type A = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for an exported type with generics', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export type A = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + generics: { + T: expect.anything(), + }, + }); + }); + + it('for a declared type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare type A = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for an imported type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import { B as A } from './file2'`, + 'file2.d.ts': `export type B = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for a type linked via export import', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export { B as A } from './file2'`, + 'file2.d.ts': `export type B = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for a type linked via export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export type B = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for a type linked on of the multiple export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +export * from './file1' +export * from './file2' +export * from './file3' +`, + 'file2.d.ts': `export type B = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for a type linked via nested export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export * from './file3'`, + 'file3.d.ts': `export * from './file4'`, + 'file4.d.ts': `export type B = number;`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file4', + declaration: { + id: { name: 'B' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for an exported enum', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export enum A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for a declared enum', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare enum A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an imported enum', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import { B as A } from './file2'`, + 'file2.d.ts': `export enum B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an enum linked via export import', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export { B as A } from './file2'`, + 'file2.d.ts': `export enum B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an enum linked via export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export enum B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an enum linked on of the multiple export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +export * from './file1' +export * from './file2' +export * from './file3' +`, + 'file2.d.ts': `export enum B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + declaration: { + id: { name: 'B' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an enum linked via nested export *', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * from './file2'`, + 'file2.d.ts': `export * from './file3'`, + 'file3.d.ts': `export * from './file4'`, + 'file4.d.ts': `export enum B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file4', + declaration: { + id: { name: 'B' }, + type: 'TSEnumDeclaration', + }, + }); + }); + + it('for an exported class with comment', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +/** + * Hello world! + */ +export class A{} +`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + comment: 'Hello world!', + }); + }); + + it('for a declared class with comment', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +/** + * Hello world! + */ +declare class A{} +`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + comment: 'Hello world!', + }); + }); + + it('for an exported type with comment', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +/** + * Hello world! + */ +export type A = number; +`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + comment: 'Hello world!', + }); + }); + + it('for a declared type with comment', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ` +/** + * Hello world! + */ +declare type A = number; +`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + comment: 'Hello world!', + }); + }); + + it('for an export assignment to namespace declaration with type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `namespace NS { + type A = number +} +export = NS`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'TSTypeAliasDeclaration', + }, + }); + }); + + it('for an exported enum value', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export enum A { a = 'B' }`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'a', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + type: 'type', + localName: 'a', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + declaration: { + type: AST_NODE_TYPES.TSTypeAliasDeclaration, + id: { + type: AST_NODE_TYPES.Identifier, + name: 'a', + }, + typeAnnotation: { + type: AST_NODE_TYPES.TSLiteralType, + literal: { + type: AST_NODE_TYPES.Literal, + value: 'B', + }, + }, + }, + }); + }); + + it('for a declared enum value', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare enum A { a = 'B' }`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'a', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)).resolves + .toMatchObject({ + type: 'type', + localName: 'a', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + declaration: { + type: AST_NODE_TYPES.TSTypeAliasDeclaration, + id: { + type: AST_NODE_TYPES.Identifier, + name: 'a', + }, + typeAnnotation: { + type: AST_NODE_TYPES.TSLiteralType, + literal: { + type: AST_NODE_TYPES.Literal, + value: 'B', + }, + }, + }, + }); + }); + + it('for an exported enum value without expression should error', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export enum A { a }`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'a', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)) + .rejects.toThrow(`Could not load class or other type A.a from file`); + }); + + it('for no exported enum value should error', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': ``, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'a', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, true)) + .rejects.toThrow(`Could not load class or other type A.a from file`); + }); + }); + + it('for an exported abstract class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export abstract class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + abstract: true, + }); + }); + + it('for a declared abstract class', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare abstract class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + abstract: true, + }); + }); + + it('for a declared class with one generic type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + generics: { + T: { type: { type: 'TSStringKeyword' }}, + }, + }); + }); + + it('for a declared class with one untyped generic type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + generics: { + T: {}, + }, + }); + }); + + it('for a declared class with one generic type with default', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `declare class A{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves + .toMatchObject({ + localName: 'A', + fileName: 'file', + declaration: { + id: { name: 'A' }, + type: 'ClassDeclaration', + }, + generics: { + T: { type: { type: 'TSStringKeyword' }}, + }, + }); + }); + + it('for an exported class with one generic type', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ 'file.d.ts': `export class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -827,8 +2073,14 @@ declare interface A{} 'file.d.ts': `declare interface A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -848,8 +2100,14 @@ declare interface A{} 'file.d.ts': `export interface A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -869,8 +2127,14 @@ declare interface A{} 'file.d.ts': `declare class A{}`, }), logger, + commentLoader, }); - expect(await loader.loadClassDeclaration({ packageName: 'p', localName: 'A', fileName: 'file' }, true)) + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, false)).resolves .toMatchObject({ localName: 'A', fileName: 'file', @@ -885,6 +2149,203 @@ declare interface A{} }, }); }); + + describe('for qualified paths', () => { + it('for a class linked via export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * as A from './file2'`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked via chained export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export * as A from './file2'`, + 'file2.d.ts': `export * as B from './file3'`, + 'file3.d.ts': `export * as C from './file4'`, + 'file4.d.ts': `export class D{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'D', + qualifiedPath: [ 'A', 'B', 'C' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'D', + fileName: 'file4', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'D' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked export named and export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export { A } from './file2'`, + 'file2.d.ts': `export * as A from './file3'`, + 'file3.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file3', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked export renamed and export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `export { X as A } from './file2'`, + 'file2.d.ts': `export * as X from './file3'`, + 'file3.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file3', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked import named and export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import { A } from './file2'`, + 'file2.d.ts': `export * as A from './file3'`, + 'file3.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file3', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked import renamed and export * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import { X as A } from './file2'`, + 'file2.d.ts': `export * as X from './file3'`, + 'file3.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file3', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + + it('for a class linked via import * named', async() => { + loader = new ClassLoader({ + resolutionContext: new ResolutionContextMocked({ + 'file.d.ts': `import * as A from './file2'`, + 'file2.d.ts': `export class B{}`, + }), + logger, + commentLoader, + }); + await expect(loader.loadClassDeclaration({ + packageName: 'p', + localName: 'B', + qualifiedPath: [ 'A' ], + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, false, false)).resolves + .toMatchObject({ + localName: 'B', + fileName: 'file2', + fileNameReferenced: 'fileReferenced', + declaration: { + id: { name: 'B' }, + type: 'ClassDeclaration', + }, + }); + }); + }); }); describe('loadClassElements', () => { @@ -892,7 +2353,7 @@ declare interface A{} resolutionContext.contentsOverrides = { 'file.d.ts': `declare class A{}`, }; - expect(await loader.loadClassElements('package', 'file')) + await expect(loader.loadClassElements('package', 'file')).resolves .toMatchObject({ declaredClasses: { A: { @@ -906,30 +2367,59 @@ declare interface A{} describe('importTargetToAbsolutePath', () => { it('for a local file', () => { expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', './subdir/fileB')) - .toEqual({ packageName: 'package', fileName: Path.normalize('dir/lib/subdir/fileB') }); + .toEqual({ + packageName: 'package', + fileName: normalizeFilePath('dir/lib/subdir/fileB'), + fileNameReferenced: 'dir/lib/fileA', + }); + }); + + it('for a local file imported with an extension', () => { + expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', './subdir/fileB.js')) + .toEqual({ + packageName: 'package', + fileName: normalizeFilePath('dir/lib/subdir/fileB'), + fileNameReferenced: 'dir/lib/fileA', + }); }); it('for a package', () => { resolutionContext.packageNameIndexOverrides['other-package'] = '/some-dir/index.js'; expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', 'other-package')) - .toEqual({ packageName: 'other-package', fileName: '/some-dir/index' }); + .toEqual({ packageName: 'other-package', fileName: '/some-dir/index', fileNameReferenced: 'dir/lib/fileA' }); + }); + + it('for a package with a .d.ts index', () => { + resolutionContext.packageNameIndexOverrides['other-package'] = '/some-dir/index.d.ts'; + expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', 'other-package')) + .toEqual({ packageName: 'other-package', fileName: '/some-dir/index', fileNameReferenced: 'dir/lib/fileA' }); }); it('for a package that does not exist', () => { - expect(() => loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', 'other-package')) - .toThrow(`Could not resolve 'other-package' from path 'dir/lib/fileA'`); + expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', 'other-package')).toBeUndefined(); + expect(logger.warn).toHaveBeenCalledTimes(1); + expect(logger.warn).toHaveBeenLastCalledWith(`Ignoring invalid package "other-package": Could not resolve 'other-package' from path 'dir/lib/fileA'`); }); it('for a file in a package', () => { - resolutionContext.packageNameIndexOverrides['other-package'] = Path.normalize('/some-dir/index.js'); + resolutionContext.packageNameIndexOverrides['other-package'] = normalizeFilePath('/some-dir/index.js'); expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', 'other-package/lib/bla')) - .toEqual({ packageName: 'other-package', fileName: Path.normalize('/some-dir/lib/bla') }); + .toEqual({ + packageName: 'other-package', + fileName: normalizeFilePath('/some-dir/lib/bla'), + fileNameReferenced: 'dir/lib/fileA', + }); }); it('for a scoped package', () => { - resolutionContext.packageNameIndexOverrides['@rubensworks/other-package'] = Path.normalize('/some-dir/index.js'); + resolutionContext + .packageNameIndexOverrides['@rubensworks/other-package'] = normalizeFilePath('/some-dir/index.js'); expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', '@rubensworks/other-package')) - .toEqual({ packageName: '@rubensworks/other-package', fileName: Path.normalize('/some-dir/index') }); + .toEqual({ + packageName: '@rubensworks/other-package', + fileName: normalizeFilePath('/some-dir/index'), + fileNameReferenced: 'dir/lib/fileA', + }); }); it('for an invalid scoped package', () => { @@ -938,14 +2428,19 @@ declare interface A{} }); it('for a file in a scoped package', () => { - resolutionContext.packageNameIndexOverrides['@rubensworks/other-package'] = Path.normalize('/some-dir/index.js'); + resolutionContext + .packageNameIndexOverrides['@rubensworks/other-package'] = normalizeFilePath('/some-dir/index.js'); expect(loader.importTargetToAbsolutePath('package', 'dir/lib/fileA', '@rubensworks/other-package/lib/bla')) - .toEqual({ packageName: '@rubensworks/other-package', fileName: Path.normalize('/some-dir/lib/bla') }); + .toEqual({ + packageName: '@rubensworks/other-package', + fileName: normalizeFilePath('/some-dir/lib/bla'), + fileNameReferenced: 'dir/lib/fileA', + }); }); }); describe('getClassElements', () => { - const fileName = Path.normalize('dir/file'); + const fileName = normalizeFilePath('dir/file'); it('for an empty file', () => { expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(``))) @@ -1011,12 +2506,21 @@ declare interface A{} importedElements: { B: { localName: 'A', - fileName: Path.normalize('dir/lib/A'), + fileName: normalizeFilePath('dir/lib/A'), }, }, }); }); + it('for a single import all named', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`import * as A from './lib/A'`))) + .toMatchObject({ + importedElementsAllNamed: { + A: { packageName: 'package', fileName: normalizeFilePath('dir/lib/A') }, + }, + }); + }); + it('for a single named export', () => { expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export class A{}`))) .toMatchObject({ @@ -1072,11 +2576,20 @@ declare interface A{} }); }); + it('for a single import from an unknown package', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`import {A as B} from 'unknown-package'`)).importedElements) + .toEqual({}); + expect(logger.warn).toHaveBeenCalledTimes(1); + expect(logger.warn).toHaveBeenLastCalledWith(expect.stringMatching( + /Ignoring invalid package "unknown-package": Could not resolve 'unknown-package' from path .*/u, + )); + }); + it('for export all', () => { expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export * from './lib/A'`))) .toMatchObject({ exportedImportedAll: [ - { packageName: 'package', fileName: Path.normalize('dir/lib/A') }, + { packageName: 'package', fileName: normalizeFilePath('dir/lib/A') }, ], }); }); @@ -1091,6 +2604,15 @@ declare interface A{} }); }); + it('for named export all', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export * as A from './lib/A'`))) + .toMatchObject({ + exportedImportedAllNamed: { + A: { packageName: 'package', fileName: normalizeFilePath('dir/lib/A') }, + }, + }); + }); + it('for export all without source', () => { expect(loader.getClassElements('package', fileName, > { body: [ @@ -1130,7 +2652,17 @@ declare interface A{} }); it('for a single named export without name should error', () => { - expect(() => loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export class{}`))) + expect(() => loader.getClassElements('package', fileName, { + body: [ + { + type: AST_NODE_TYPES.ExportNamedDeclaration, + declaration: { + type: AST_NODE_TYPES.ClassDeclaration, + loc: { start: { line: 1, column: 7 }}, + }, + }, + ], + })) .toThrow(new Error(`Export parsing failure: missing exported class name in ${fileName} on line 1 column 7`)); }); @@ -1149,27 +2681,114 @@ declare interface A{} exportedImportedElements: { B: { localName: 'A', - fileName: Path.normalize('dir/lib/A'), + fileName: normalizeFilePath('dir/lib/A'), }, }, }); }); + it('for a single export object as reference', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export = A`))) + .toMatchObject({ + exportAssignment: 'A', + }); + }); + + it('for a single export object as class', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export = class A{}`))) + .toMatchObject({ + exportAssignment: { type: 'ClassDeclaration' }, + }); + }); + + it('for a single export object as function', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export = a => true`))) + .toMatchObject({ + exportAssignment: undefined, + }); + }); + it('for multiple exports from file', () => { expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export { A as B, C as D, X } from './lib/A'`))) .toMatchObject({ exportedImportedElements: { B: { localName: 'A', - fileName: Path.normalize('dir/lib/A'), + fileName: normalizeFilePath('dir/lib/A'), }, D: { localName: 'C', - fileName: Path.normalize('dir/lib/A'), + fileName: normalizeFilePath('dir/lib/A'), }, X: { localName: 'X', - fileName: Path.normalize('dir/lib/A'), + fileName: normalizeFilePath('dir/lib/A'), + }, + }, + }); + }); + + it('for an exported type', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export type A = string`))) + .toMatchObject({ + exportedTypes: { + A: { + type: 'TSTypeAliasDeclaration', + }, + }, + }); + }); + + it('for a declared type', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`declare type A = string`))) + .toMatchObject({ + declaredTypes: { + A: { + type: 'TSTypeAliasDeclaration', + }, + }, + }); + }); + + it('for an exported enum', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export enum A {}`))) + .toMatchObject({ + exportedEnums: { + A: { + type: 'TSEnumDeclaration', + }, + }, + }); + }); + + it('for a declared enum', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`declare enum A {}`))) + .toMatchObject({ + declaredEnums: { + A: { + type: 'TSEnumDeclaration', + }, + }, + }); + }); + + it('for an exported namespace', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`export namespace A {}`))) + .toMatchObject({ + exportedNamespaces: { + A: { + type: 'TSModuleDeclaration', + }, + }, + }); + }); + + it('for a declared namespace', () => { + expect(loader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`declare namespace A {}`))) + .toMatchObject({ + declaredNamespaces: { + A: { + type: 'TSModuleDeclaration', }, }, }); @@ -1194,11 +2813,11 @@ import {D as X} from './lib/D' importedElements: { C: { localName: 'C', - fileName: Path.normalize('dir/lib/C'), + fileName: normalizeFilePath('dir/lib/C'), }, X: { localName: 'D', - fileName: Path.normalize('dir/lib/D'), + fileName: normalizeFilePath('dir/lib/D'), }, }, }); diff --git a/test/parse/CommentLoader.test.ts b/test/parse/CommentLoader.test.ts index 45d6f3f..8755d8f 100644 --- a/test/parse/CommentLoader.test.ts +++ b/test/parse/CommentLoader.test.ts @@ -1,12 +1,19 @@ -import type { MethodDefinition } from '@typescript-eslint/types/dist/ts-estree'; -import type { ClassReference } from '../../lib/parse/ClassIndex'; +import { ClassFinder } from '../../lib/parse/ClassFinder'; +import type { ClassLoaded, ClassReference } from '../../lib/parse/ClassIndex'; +import { ClassIndexer } from '../../lib/parse/ClassIndexer'; import { ClassLoader } from '../../lib/parse/ClassLoader'; import { CommentLoader } from '../../lib/parse/CommentLoader'; import { ConstructorLoader } from '../../lib/parse/ConstructorLoader'; +import { ParameterLoader } from '../../lib/parse/ParameterLoader'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('CommentLoader', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; const resolutionContext = new ResolutionContextMocked({}); let logger: any; @@ -16,13 +23,183 @@ describe('CommentLoader', () => { }; }); + describe('getCommentDataFromConstructor', () => { + async function createLoader() { + const loader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader: loader }); + const classLoaded = await new ClassIndexer({ + classLoader, + classFinder: new ClassFinder({ classLoader }), + ignoreClasses: {}, + logger, + }).loadClassChain(clazz); + const parameterLoader = new ParameterLoader({ commentLoader: loader, hardErrorUnsupported: true, logger }); + const constructorLoader = new ConstructorLoader({ parameterLoader }); + const constructorChain = constructorLoader.getConstructorChain({ value: classLoaded }); + return { loader, constructorChain, classLoaded }; + } + + it('should handle a single class without superclass', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{ + /** + * @param fieldA This is a field + * @param fieldB This is another field + */ + constructor(fieldA: boolean) {} +}`, + }; + const { loader, constructorChain } = await createLoader(); + expect(loader.getCommentDataFromConstructor(constructorChain)).toEqual({ + fieldA: { + description: 'This is a field', + }, + fieldB: { + description: 'This is another field', + }, + }); + }); + + it('should handle a single class with one superclass', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A extends B{ + /** + * @param fieldA This is a field + * @param fieldB This is another field + */ + constructor(fieldA: boolean) {} +} + +export class B{ + /** + * @param fieldA This comment is ignored - @default {ABC} + * @param fieldC This if field c + */ + constructor(fieldA: boolean) {} +}`, + }; + const { loader, constructorChain } = await createLoader(); + expect(loader.getCommentDataFromConstructor(constructorChain)).toEqual({ + fieldA: { + description: 'This is a field', + defaults: [{ type: 'raw', value: 'ABC' }], + defaultNested: [], + params: {}, + }, + fieldB: { + description: 'This is another field', + }, + fieldC: { + description: 'This if field c', + }, + }); + }); + + it('should handle a single class with two superclasses', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A extends B{ + /** + * @param fieldA + * @param fieldB This is another field + */ + constructor(fieldA: boolean) {} +} + +export class B extends C{ + /** + * @param fieldA This comment is not ignored @default {ABC} + * @param fieldC This if field c @defaultNested {XYZ} subparam1 + */ + constructor(fieldA: boolean) {} +} + +export class C{ + /** + * @param fieldC This if field c with nested defaults @defaultNested {ABC} subparam2 + */ + constructor(fieldA: boolean) {} +}`, + }; + const { loader, constructorChain } = await createLoader(); + expect(loader.getCommentDataFromConstructor(constructorChain)).toEqual({ + fieldA: { + description: 'This comment is not ignored', + defaults: [{ type: 'raw', value: 'ABC' }], + defaultNested: [], + params: {}, + }, + fieldB: { + description: 'This is another field', + }, + fieldC: { + description: 'This if field c', + defaults: [], + defaultNested: [ + { + paramPath: [ 'fieldC', 'subparam1' ], + value: { type: 'raw', value: 'XYZ' }, + }, + { + paramPath: [ 'fieldC', 'subparam2' ], + value: { type: 'raw', value: 'ABC' }, + }, + ], + params: {}, + }, + }); + }); + }); + + describe('getCommentDataFromConstructorSingle', () => { + async function createLoader() { + const loader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader: loader }); + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const parameterLoader = new ParameterLoader({ commentLoader: loader, hardErrorUnsupported: true, logger }); + const constructorLoader = new ConstructorLoader({ parameterLoader }); + const constructor = constructorLoader.getConstructor({ value: classLoaded })!.constructor; + return { loader, constructor, classLoaded }; + } + + it('should return data for simple params in the comment', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{ + /** + * @param fieldA This is a field + * @param fieldB This is another field + */ + constructor(fieldA: boolean) {} +}`, + }; + const { loader, constructor, classLoaded } = await createLoader(); + expect(loader.getCommentDataFromConstructorSingle(classLoaded, constructor)).toEqual({ + fieldA: { + description: 'This is a field', + }, + fieldB: { + description: 'This is another field', + }, + }); + }); + + it('should return empty data for no comment', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{ + constructor(fieldA: boolean) {} +}`, + }; + const { loader, constructor, classLoaded } = await createLoader(); + expect(loader.getCommentDataFromConstructorSingle(classLoaded, constructor)).toEqual({}); + }); + }); + describe('getCommentDataFromField', () => { async function createLoader() { - const classLoader = new ClassLoader({ resolutionContext, logger }); - const iface = await classLoader.loadClassDeclaration(clazz, true); - const field = iface.declaration.body.body[0]; - const loader = new CommentLoader({ classLoaded: iface }); - return { loader, field }; + const loader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader: loader }); + const iface = await classLoader.loadClassDeclaration(clazz, true, false); + const field: any = iface.declaration.body.body[0]; + return { loader, field, iface }; } it('should be empty for no comment', async() => { @@ -31,8 +208,8 @@ describe('CommentLoader', () => { fieldA: boolean; }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentDataFromField(field)).toEqual({}); + const { loader, field, iface } = await createLoader(); + expect(loader.getCommentDataFromField(iface, field)).toEqual({}); }); it('should be defined for a simple comment', async() => { @@ -44,8 +221,8 @@ describe('CommentLoader', () => { fieldA: boolean; }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentDataFromField(field)).toEqual({ + const { loader, field, iface } = await createLoader(); + expect(loader.getCommentDataFromField(iface, field)).toEqual({ description: 'This is a field!', }); }); @@ -61,8 +238,8 @@ describe('CommentLoader', () => { fieldA: boolean; }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentDataFromField(field)).toEqual({ + const { loader, field, iface } = await createLoader(); + expect(loader.getCommentDataFromField(iface, field)).toEqual({ description: 'This is a field! And this is a new line. And another one.', }); }); @@ -79,9 +256,12 @@ describe('CommentLoader', () => { fieldA: boolean; }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentDataFromField(field)).toEqual({ - default: 'true', + const { loader, field, iface } = await createLoader(); + expect(loader.getCommentDataFromField(iface, field)).toEqual({ + defaults: [{ + type: 'raw', + value: 'true', + }], description: 'This is a field!', ignored: true, range: { @@ -92,6 +272,41 @@ describe('CommentLoader', () => { }); }); + describe('getCommentDataFromClassOrInterface', () => { + async function createLoader() { + const loader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader: loader }); + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + return { loader, classLoaded }; + } + + it('should return data for simple params in the comment', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': ` +/** + * @param fieldA This is a field + * @param fieldB This is another field +*/ +export class A{}`, + }; + const { loader, classLoaded } = await createLoader(); + expect(loader.getCommentDataFromClassOrInterface(classLoaded)).toEqual({ + params: { + fieldA: 'This is a field', + fieldB: 'This is another field', + }, + }); + }); + + it('should return empty data for no comment', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{}`, + }; + const { loader, classLoaded } = await createLoader(); + expect(loader.getCommentDataFromClassOrInterface(classLoaded)).toEqual({}); + }); + }); + describe('getCommentDataFromConstructorComment', () => { it('should be empty for an empty comment', () => { expect(CommentLoader.getCommentDataFromConstructorComment( @@ -132,6 +347,52 @@ describe('CommentLoader', () => { }, }); }); + + it('should return data for a param with defaultNested', async() => { + expect(CommentLoader.getCommentDataFromConstructorComment( + `/** + * @param fieldA - @defaultNested {<#bus> a } args_bus +*/`, + clazz, + )).toEqual({ + fieldA: { + defaultNested: [ + { + paramPath: [ 'fieldA', 'args', 'bus' ], + value: { + type: 'iri', + value: '#bus', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + ], + }, + }); + }); + + it('should return data for a param with defaultNested with @', async() => { + expect(CommentLoader.getCommentDataFromConstructorComment( + `/** + * @param fieldA - @defaultNested {<#bus@abc> a } args_bus +*/`, + clazz, + )).toEqual({ + fieldA: { + defaultNested: [ + { + paramPath: [ 'fieldA', 'args', 'bus' ], + value: { + type: 'iri', + value: '#bus@abc', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + ], + }, + }); + }); }); describe('getCommentDataFromComment', () => { @@ -175,7 +436,28 @@ describe('CommentLoader', () => { '/**\n * @default {true}\n */', clazz, )).toEqual({ - default: 'true', + defaults: [{ + type: 'raw', + value: 'true', + }], + }); + }); + + it('should retrieve multiple default tags', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @default {true} \n @default {false}\n */', + clazz, + )).toEqual({ + defaults: [ + { + type: 'raw', + value: 'true', + }, + { + type: 'raw', + value: 'false', + }, + ], }); }); @@ -186,6 +468,46 @@ describe('CommentLoader', () => { )).toThrow(new Error('Missing @default value {something} on a field in class A at file')); }); + it('should retrieve a default iri tag', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @default {}\n */', + clazz, + )).toEqual({ + defaults: [{ + type: 'iri', + value: 'ex:abc', + baseComponent: clazz, + }], + }); + }); + + it('should retrieve a default iri and type tag', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @default { a }\n */', + clazz, + )).toEqual({ + defaults: [{ + type: 'iri', + value: 'ex:abc', + typeIri: 'ex:Type', + baseComponent: clazz, + }], + }); + }); + + it('should retrieve a default type tag', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @default {a }\n */', + clazz, + )).toEqual({ + defaults: [{ + type: 'iri', + typeIri: 'ex:abc', + baseComponent: clazz, + }], + }); + }); + it('should retrieve an ignored tag', async() => { expect(CommentLoader.getCommentDataFromComment( '/**\n * @ignored\n */', @@ -228,18 +550,126 @@ describe('CommentLoader', () => { }, }); }); + + it('should retrieve a defaultNested tag with id and type', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @defaultNested {<#bus> a } args_bus\n */', + clazz, + )).toEqual({ + defaultNested: [ + { + paramPath: [ 'args', 'bus' ], + value: { + type: 'iri', + value: '#bus', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + ], + }); + }); + + it('should retrieve a defaultNested tag with id and without type', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @defaultNested {<#bus>} args_bus\n */', + clazz, + )).toEqual({ + defaultNested: [ + { + paramPath: [ 'args', 'bus' ], + value: { + type: 'iri', + value: '#bus', + baseComponent: clazz, + }, + }, + ], + }); + }); + + it('should retrieve a defaultNested tag without id and with type', async() => { + expect(CommentLoader.getCommentDataFromComment( + '/**\n * @defaultNested {a } args_bus\n */', + clazz, + )).toEqual({ + defaultNested: [ + { + paramPath: [ 'args', 'bus' ], + value: { + type: 'iri', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + ], + }); + }); + + it('should retrieve multiple defaultNested tags with id and type', async() => { + expect(CommentLoader.getCommentDataFromComment( + `/**\n * @defaultNested {<#bus> a } args_bus\n @defaultNested {<#bus2> a } args_bus2\n */`, + clazz, + )).toEqual({ + defaultNested: [ + { + paramPath: [ 'args', 'bus' ], + value: { + type: 'iri', + value: '#bus', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + { + paramPath: [ 'args', 'bus2' ], + value: { + type: 'iri', + value: '#bus2', + typeIri: 'cc:lib/Bus#Bus', + baseComponent: clazz, + }, + }, + ], + }); + }); + + it('should throw on a defaultNested with empty value', async() => { + expect(() => CommentLoader.getCommentDataFromComment( + '/**\n * @defaultNested {} args_bus\n */', + clazz, + )).toThrow(`Invalid @defaultNested syntax on a field in class A at file: expected @defaultNested { a } path_to_param`); + }); + + it('should throw on a defaultNested with empty path', async() => { + expect(() => CommentLoader.getCommentDataFromComment( + '/**\n * @defaultNested {<#bus> a }\n */', + clazz, + )).toThrow(`Invalid @defaultNested syntax on a field in class A at file: expected @defaultNested { a } path_to_param`); + }); }); - describe('getCommentRaw', () => { - async function createLoader() { - const classLoader = new ClassLoader({ resolutionContext, logger }); - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const constructorLoader = new ConstructorLoader(); - const field = ( constructorLoader.getConstructor(classLoaded)).value.params[0]; + describe('getIriValue', () => { + it('should handle valid IRIs', async() => { + expect(CommentLoader.getIriValue('')).toBe('ex:abc'); + }); - const loader = new CommentLoader({ classLoaded }); + it('should return undefined for invalid IRIs', async() => { + expect(CommentLoader.getIriValue('ex:abc>')).toBeUndefined(); + expect(CommentLoader.getIriValue(' { + async function createLoader() { + const loader = new CommentLoader(); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader: loader }); + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const parameterLoader = new ParameterLoader({ commentLoader: loader, hardErrorUnsupported: true, logger }); + const constructorLoader = new ConstructorLoader({ parameterLoader }); + const field = (constructorLoader.getConstructor({ value: classLoaded })!.constructor).value.params[0]; + return { loader, field, classLoaded }; } it('should be undefined for no comment', async() => { @@ -248,8 +678,8 @@ describe('CommentLoader', () => { constructor(fieldA: boolean) {} }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentRaw(field)).toBeUndefined(); + const { loader, field, classLoaded } = await createLoader(); + expect(loader.getCommentRaw(classLoaded, field)).toBeUndefined(); }); it('should be undefined for an unrelated comment', async() => { @@ -262,16 +692,15 @@ describe('CommentLoader', () => { constructor(fieldA: boolean) {} }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentRaw(field)).toBeUndefined(); + const { loader, field, classLoaded } = await createLoader(); + expect(loader.getCommentRaw(classLoaded, field)).toBeUndefined(); }); it('should be undefined for no comments in ast', async() => { - expect(new CommentLoader( { - classLoaded: { - ast: {}, - }, - }).getCommentRaw( { loc: { start: { line: 0 }}})).toBeUndefined(); + expect(new CommentLoader().getCommentRaw( + { ast: {}}, + { loc: { start: { line: 0 }}}, + )).toBeUndefined(); }); it('should be defined for a constructor comment', async() => { @@ -283,8 +712,8 @@ describe('CommentLoader', () => { constructor(fieldA: boolean) {} }`, }; - const { loader, field } = await createLoader(); - expect(loader.getCommentRaw(field)).toEqual('/**\n * This is a comment!\n */'); + const { loader, field, classLoaded } = await createLoader(); + expect(loader.getCommentRaw(classLoaded, field)).toBe('/**\n * This is a comment!\n */'); }); }); }); diff --git a/test/parse/ConstructorLoader.test.ts b/test/parse/ConstructorLoader.test.ts index b65ad14..261c198 100644 --- a/test/parse/ConstructorLoader.test.ts +++ b/test/parse/ConstructorLoader.test.ts @@ -2,21 +2,26 @@ import { ClassFinder } from '../../lib/parse/ClassFinder'; import type { ClassLoaded } from '../../lib/parse/ClassIndex'; import { ClassIndexer } from '../../lib/parse/ClassIndexer'; import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; import { ConstructorLoader } from '../../lib/parse/ConstructorLoader'; +import { ParameterLoader } from '../../lib/parse/ParameterLoader'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ConstructorLoader', () => { const resolutionContext = new ResolutionContextMocked({}); let logger: any; + let commentLoader: CommentLoader; let parser: ConstructorLoader; let classIndexer: ClassIndexer; beforeEach(() => { - parser = new ConstructorLoader(); + commentLoader = new CommentLoader(); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + parser = new ConstructorLoader({ parameterLoader }); logger = { debug: jest.fn(), }; - const classLoader = new ClassLoader({ resolutionContext, logger }); + const classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); classIndexer = new ClassIndexer({ classLoader, classFinder: new ClassFinder({ classLoader }), @@ -30,24 +35,38 @@ describe('ConstructorLoader', () => { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{}`, }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); expect(parser.getConstructors({ - A: await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), + A, })).toEqual({ A: { parameters: [], + classLoaded: A, }, }); }); - it('should return for a single interface/', async() => { + it('should return for a single interface', async() => { resolutionContext.contentsOverrides = { 'file.d.ts': `export interface A{}`, }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); expect(parser.getConstructors({ - A: await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), + A, })).toEqual({ A: { parameters: [], + classLoaded: A, }, }); }); @@ -73,9 +92,21 @@ export class B{ } `, }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }); + const B = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'B', + fileName: 'B', + fileNameReferenced: 'fileReferenced', + }); expect(parser.getConstructors({ - A: await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'A' }), - B: await classIndexer.loadClassChain({ packageName: 'p', localName: 'B', fileName: 'B' }), + A, + B, })).toEqual({ A: { parameters: [ @@ -87,21 +118,29 @@ export class B{ type: 'override', value: 'float', }, - required: true, - unique: true, }, { type: 'field', comment: 'This is B', name: 'fieldB', range: { - type: 'override', - value: 'float', + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'override', + value: 'float', + }, + }, + { + type: 'undefined', + }, + ], }, - required: false, - unique: false, }, ], + classLoaded: A, }, B: { parameters: [ @@ -113,10 +152,74 @@ export class B{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ], + classLoaded: B, + }, + }); + }); + + it('should return for a class with constructor extending another class with constructor', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +export class A extends B{ + /** + * @param fieldA - This is a great field! @range {float} + * @param fieldB This is B @range {float} + * @param fieldC This is C @ignored + */ + constructor(fieldA: string, fieldB?: number[], fieldC?: string[]) {} +} + +export class B{ + /** + * @param fieldA - This is a great field! @default {ABC} + */ + constructor(fieldA: string) {} +} +`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getConstructors({ + A, + })).toEqual({ + A: { + parameters: [ + { + type: 'field', + comment: 'This is a great field!', + name: 'fieldA', + range: { + type: 'override', + value: 'float', + }, + defaults: [{ type: 'raw', value: 'ABC' }], + defaultNested: [], + }, + { + type: 'field', + comment: 'This is B', + name: 'fieldB', + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { type: 'override', value: 'float' }, + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + classLoaded: A, }, }); }); @@ -127,9 +230,14 @@ export class B{ resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{}`, }; - expect(parser.getConstructor( - await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), - )).toBeUndefined(); + expect(parser.getConstructor({ + value: await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }), + })).toBeUndefined(); }); it('should return undefined on a class chain without constructors', async() => { @@ -144,9 +252,14 @@ export class B extends C{} `, 'C.d.ts': `export class C{}`, }; - expect(parser.getConstructor( - await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), - )).toBeUndefined(); + expect(parser.getConstructor({ + value: await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }), + })).toBeUndefined(); }); it('should return on a class with a direct constructor', async() => { @@ -156,28 +269,37 @@ class A{ constructor() {} }`, }; - expect(parser.getConstructor( - await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), - )).toMatchObject({ - computed: false, - key: { - name: 'constructor', - type: 'Identifier', - }, - kind: 'constructor', - static: false, - type: 'MethodDefinition', - value: { - async: false, - body: { - body: [], - type: 'BlockStatement', + const classLoaded = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getConstructor({ + value: classLoaded, + })).toMatchObject({ + classLoaded: { value: classLoaded }, + constructor: { + computed: false, + key: { + name: 'constructor', + type: 'Identifier', + }, + kind: 'constructor', + static: false, + type: 'MethodDefinition', + value: { + async: false, + body: { + body: [], + type: 'BlockStatement', + }, + expression: false, + generator: false, + id: null, + params: [], + type: 'FunctionExpression', }, - expression: false, - generator: false, - id: null, - params: [], - type: 'FunctionExpression', }, }); }); @@ -198,28 +320,41 @@ export class C{ } `, }; - expect(parser.getConstructor( - await classIndexer.loadClassChain({ packageName: 'p', localName: 'A', fileName: 'file' }), - )).toMatchObject({ - computed: false, - key: { - name: 'constructor', - type: 'Identifier', + const classLoaded = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getConstructor({ + value: classLoaded, + })).toMatchObject({ + classLoaded: { + value: { + localName: 'C', + }, }, - kind: 'constructor', - static: false, - type: 'MethodDefinition', - value: { - async: false, - body: { - body: [], - type: 'BlockStatement', + constructor: { + computed: false, + key: { + name: 'constructor', + type: 'Identifier', + }, + kind: 'constructor', + static: false, + type: 'MethodDefinition', + value: { + async: false, + body: { + body: [], + type: 'BlockStatement', + }, + expression: false, + generator: false, + id: null, + params: [], + type: 'FunctionExpression', }, - expression: false, - generator: false, - id: null, - params: [], - type: 'FunctionExpression', }, }); }); @@ -286,9 +421,7 @@ class A{ resolutionContext.contentsOverrides = { 'file.d.ts': ``, }; - await expect(async() => parser.getClass('A', - await resolutionContext.parseTypescriptFile('file'), - 'file')).rejects + await expect(async() => parser.getClass('A', await resolutionContext.parseTypescriptFile('file'), 'file')).rejects .toThrow(new Error('Could not find class A in file')); }); @@ -296,9 +429,7 @@ class A{ resolutionContext.contentsOverrides = { 'file.d.ts': `export const foo = "a";`, }; - await expect(async() => parser.getClass('A', - await resolutionContext.parseTypescriptFile('file'), - 'file')).rejects + await expect(async() => parser.getClass('A', await resolutionContext.parseTypescriptFile('file'), 'file')).rejects .toThrow(new Error('Could not find class A in file')); }); @@ -306,9 +437,7 @@ class A{ resolutionContext.contentsOverrides = { 'file.d.ts': `class A{}`, }; - expect(parser.getClass('A', - await resolutionContext.parseTypescriptFile('file'), - 'file')).toMatchObject({ + expect(parser.getClass('A', await resolutionContext.parseTypescriptFile('file'), 'file')).toMatchObject({ body: { body: [], type: 'ClassBody', @@ -326,9 +455,7 @@ class A{ resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{}`, }; - expect(parser.getClass('A', - await resolutionContext.parseTypescriptFile('file'), - 'file')).toMatchObject({ + expect(parser.getClass('A', await resolutionContext.parseTypescriptFile('file'), 'file')).toMatchObject({ body: { body: [], type: 'ClassBody', diff --git a/test/parse/GenericsLoader.test.ts b/test/parse/GenericsLoader.test.ts new file mode 100644 index 0000000..0fd4255 --- /dev/null +++ b/test/parse/GenericsLoader.test.ts @@ -0,0 +1,160 @@ +import { ClassFinder } from '../../lib/parse/ClassFinder'; + +import { ClassIndexer } from '../../lib/parse/ClassIndexer'; +import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; +import { GenericsLoader } from '../../lib/parse/GenericsLoader'; +import { ParameterLoader } from '../../lib/parse/ParameterLoader'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('GenericsLoader', () => { + const resolutionContext = new ResolutionContextMocked({}); + let logger: any; + let commentLoader: CommentLoader; + let parser: GenericsLoader; + let classLoader: ClassLoader; + let classIndexer: ClassIndexer; + + beforeEach(() => { + commentLoader = new CommentLoader(); + parser = new GenericsLoader({ + parameterLoader: new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }), + }); + logger = { + debug: jest.fn(), + }; + classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); + classIndexer = new ClassIndexer({ + classLoader, + classFinder: new ClassFinder({ classLoader }), + ignoreClasses: {}, + logger, + }); + }); + + describe('getGenerics', () => { + it('should return for a single class without generics', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{}`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getGenerics({ + A, + })).toEqual({ + A: { + genericTypeParameters: [], + classLoaded: A, + }, + }); + }); + + it('should ignore an enum', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export enum A{}`, + }; + const A = await classLoader + .loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, true); + expect(parser.getGenerics({ + A, + })).toEqual({}); + }); + + it('should return for a single class with generic types', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A>{ + constructor(){} +}`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getGenerics({ + A, + })).toEqual({ + A: { + genericTypeParameters: [ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + }, + { + name: 'C', + range: { + type: 'interface', + value: 'Class', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'B', + }, + { + type: 'raw', + value: 'string', + }, + ], + origin: expect.anything(), + }, + }, + ], + classLoaded: A, + }, + }); + }); + + it('should return for a single class with default generic types', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{ + constructor(){} +}`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getGenerics({ + A, + })).toEqual({ + A: { + genericTypeParameters: [ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + default: { + type: 'literal', + value: 3, + }, + }, + ], + classLoaded: A, + }, + }); + }); + }); +}); diff --git a/test/parse/MemberLoader.test.ts b/test/parse/MemberLoader.test.ts new file mode 100644 index 0000000..51034bf --- /dev/null +++ b/test/parse/MemberLoader.test.ts @@ -0,0 +1,222 @@ +import { ClassFinder } from '../../lib/parse/ClassFinder'; +import type { ClassReferenceLoadedClassOrInterface } from '../../lib/parse/ClassIndex'; +import { ClassIndexer } from '../../lib/parse/ClassIndexer'; +import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; +import { MemberLoader } from '../../lib/parse/MemberLoader'; +import { ParameterLoader } from '../../lib/parse/ParameterLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; + +describe('MemberLoader', () => { + const resolutionContext = new ResolutionContextMocked({}); + let logger: any; + let commentLoader: CommentLoader; + let parser: MemberLoader; + let classLoader: ClassLoader; + let classIndexer: ClassIndexer; + + beforeEach(() => { + commentLoader = new CommentLoader(); + parser = new MemberLoader({ + parameterLoader: new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }), + }); + logger = { + debug: jest.fn(), + }; + classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); + classIndexer = new ClassIndexer({ + classLoader, + classFinder: new ClassFinder({ classLoader }), + ignoreClasses: {}, + logger, + }); + }); + + describe('getMembers', () => { + it('should return for a single class without members', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{}`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getMembers({ + A, + })).toEqual({ + A: { + members: [], + classLoaded: A, + }, + }); + }); + + it('should ignore an enum', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export enum A{}`, + }; + const A = await classLoader + .loadClassDeclaration({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }, true, true); + expect(parser.getMembers({ + A, + })).toEqual({}); + }); + + it('should return for a single class with members', async() => { + resolutionContext.contentsOverrides = { + 'file.d.ts': `export class A{ + fieldA: string; + fieldB: number; +}`, + }; + const A = await classIndexer.loadClassChain({ + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }); + expect(parser.getMembers({ + A, + })).toEqual({ + A: { + members: [ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'string', + }, + }, + { + name: 'fieldB', + range: { + type: 'raw', + value: 'number', + }, + }, + ], + classLoaded: A, + }, + }); + }); + }); + + describe('collectClassFields', () => { + const fileName = normalizeFilePath('dir/file'); + + function getClassBody(contents: string): ClassReferenceLoadedClassOrInterface { + const body = classLoader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`declare class A{${contents}}`)).declaredClasses.A.body; + return { + generics: {}, + declaration: { body }, + }; + } + + function getInterfaceBody(contents: string): ClassReferenceLoadedClassOrInterface { + const body = classLoader.getClassElements('package', fileName, resolutionContext.parseTypescriptContents(`declare interface A{${contents}}`)).declaredInterfaces.A.body; + return { + generics: {}, + declaration: { body }, + }; + } + + describe('for classes', () => { + it('for an empty class', async() => { + expect(parser.collectClassFields(getClassBody(``))).toEqual([]); + }); + + it('for simple fields', async() => { + expect(parser.collectClassFields(getClassBody(` +fieldA: string; +fieldB: MyClass; +`))).toMatchObject([ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'string', + }, + }, + { + name: 'fieldB', + range: { + type: 'interface', + value: 'MyClass', + }, + }, + ]); + }); + + it('for computed fields', async() => { + expect(parser.collectClassFields(getClassBody(` +[A.fieldA]: string; +fieldB: MyClass; +`))).toMatchObject([ + { + name: 'fieldB', + range: { + type: 'interface', + value: 'MyClass', + }, + }, + ]); + }); + + it('for simple methods', async() => { + expect(parser.collectClassFields(getClassBody(` +public functionA(): string{} +private functionB(): string{} +`))).toMatchObject([ + { + name: 'functionA', + }, + { + name: 'functionB', + }, + ]); + }); + + it('for simple fields without type annotation', async() => { + expect(parser.collectClassFields(getClassBody(` +fieldA; +fieldB; +`))).toMatchObject([ + { + name: 'fieldA', + }, + { + name: 'fieldB', + }, + ]); + }); + }); + + describe('for interfaces', () => { + it('for an empty interface', async() => { + expect(parser.collectClassFields(getInterfaceBody(``))).toEqual([]); + }); + + it('for simple fields', async() => { + expect(parser.collectClassFields(getInterfaceBody(` +fieldA: string; +fieldB: MyClass; +`))).toMatchObject([ + { + name: 'fieldA', + }, + { + name: 'fieldB', + }, + ]); + }); + }); + }); +}); diff --git a/test/parse/PackageMetadataLoader.test.ts b/test/parse/PackageMetadataLoader.test.ts index fbabd6b..3f1489d 100644 --- a/test/parse/PackageMetadataLoader.test.ts +++ b/test/parse/PackageMetadataLoader.test.ts @@ -1,5 +1,5 @@ -import * as Path from 'path'; import { PackageMetadataLoader } from '../../lib/parse/PackageMetadataLoader'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('PackageMetadataLoader', () => { @@ -14,12 +14,12 @@ describe('PackageMetadataLoader', () => { it('should error on a non-existing package.json', async() => { resolutionContext.contentsOverrides = {}; await expect(loader.load('/')).rejects - .toThrow(new Error(`Could not find mocked path for ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Could not find mocked path for ${normalizeFilePath('/package.json')}`)); }); it('should return with all required entries', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "version": "1.2.3", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", @@ -34,8 +34,8 @@ describe('PackageMetadataLoader', () => { "types": "./index.d.ts" }`, }; - expect(await loader.load('/')).toEqual({ - componentsPath: Path.normalize('/components/components.jsonld'), + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), contexts: { 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld': 'components/context.jsonld', @@ -47,13 +47,13 @@ describe('PackageMetadataLoader', () => { moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', name: '@solid/community-server', version: '1.2.3', - typesPath: Path.normalize('/index'), + typesPath: normalizeFilePath('/index'), }); }); it('should return with all required entries, but using typings', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "version": "1.2.3", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", @@ -68,8 +68,8 @@ describe('PackageMetadataLoader', () => { "typings": "./index.d.ts" }`, }; - expect(await loader.load('/')).toEqual({ - componentsPath: Path.normalize('/components/components.jsonld'), + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), contexts: { 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld': 'components/context.jsonld', @@ -81,13 +81,13 @@ describe('PackageMetadataLoader', () => { moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', name: '@solid/community-server', version: '1.2.3', - typesPath: Path.normalize('/index'), + typesPath: normalizeFilePath('/index'), }); }); it('should return with all required entries, but using typings without extension', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "version": "1.2.3", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", @@ -102,8 +102,8 @@ describe('PackageMetadataLoader', () => { "typings": "./index" }`, }; - expect(await loader.load('/')).toEqual({ - componentsPath: Path.normalize('/components/components.jsonld'), + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), contexts: { 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld': 'components/context.jsonld', @@ -115,21 +115,21 @@ describe('PackageMetadataLoader', () => { moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', name: '@solid/community-server', version: '1.2.3', - typesPath: Path.normalize('/index'), + typesPath: normalizeFilePath('/index'), }); }); it('should return with all required entries with lsd:module true', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "version": "1.2.3", "lsd:module": true, "types": "./index.d.ts" }`, }; - expect(await loader.load('/')).toEqual({ - componentsPath: Path.normalize('/components/components.jsonld'), + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), contexts: { 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld': 'components/context.jsonld', @@ -142,13 +142,13 @@ describe('PackageMetadataLoader', () => { moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', name: '@solid/community-server', version: '1.2.3', - typesPath: Path.normalize('/index'), + typesPath: normalizeFilePath('/index'), }); }); it('should return with all required entries with lsd:module true and lsd:basePath', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "version": "1.2.3", "lsd:module": true, @@ -156,8 +156,8 @@ describe('PackageMetadataLoader', () => { "types": "./index.d.ts" }`, }; - expect(await loader.load('/')).toEqual({ - componentsPath: Path.normalize('/dist/components/components.jsonld'), + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/dist/components/components.jsonld'), contexts: { 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld': 'dist/components/context.jsonld', @@ -170,21 +170,26 @@ describe('PackageMetadataLoader', () => { moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', name: '@solid/community-server', version: '1.2.3', - typesPath: Path.normalize('/index'), + typesPath: normalizeFilePath('/index'), }); }); it('should error on invalid JSON', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{`, + [normalizeFilePath('/package.json')]: `{`, }; - await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Syntax error in ${Path.normalize('/package.json')}: Unexpected end of JSON input`)); + await expect(loader.load('/')).rejects.toMatchObject({ + name: 'Error', + message: expect.stringMatching( + /* eslint-disable max-len */ + /Invalid package: Syntax error in .*\/package.json: (Unexpected end of JSON input|Expected property name or '\}')/u, + ), + }); }); it('should error when lsd:module is missing', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "lsd:components": "components/components.jsonld", "lsd:contexts": { @@ -193,12 +198,12 @@ describe('PackageMetadataLoader', () => { }`, }; await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Missing 'lsd:module' IRI in ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Invalid package: Missing 'lsd:module' IRI in ${normalizeFilePath('/package.json')}`)); }); it('should error when lsd:components is missing', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", "lsd:contexts": { @@ -207,24 +212,24 @@ describe('PackageMetadataLoader', () => { }`, }; await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Missing 'lsd:components' in ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Invalid package: Missing 'lsd:components' in ${normalizeFilePath('/package.json')}`)); }); it('should error when lsd:contexts is missing', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", "lsd:components": "components/components.jsonld" }`, }; await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Missing 'lsd:contexts' in ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Invalid package: Missing 'lsd:contexts' in ${normalizeFilePath('/package.json')}`)); }); it('should error when lsd:importPaths is missing', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", "lsd:components": "components/components.jsonld", @@ -237,12 +242,12 @@ describe('PackageMetadataLoader', () => { }`, }; await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Missing 'lsd:importPaths' in ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Invalid package: Missing 'lsd:importPaths' in ${normalizeFilePath('/package.json')}`)); }); it('should error when types and typings is missing', async() => { resolutionContext.contentsOverrides = { - [Path.normalize('/package.json')]: `{ + [normalizeFilePath('/package.json')]: `{ "name": "@solid/community-server", "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", "lsd:components": "components/components.jsonld", @@ -256,7 +261,95 @@ describe('PackageMetadataLoader', () => { }`, }; await expect(loader.load('/')).rejects - .toThrow(new Error(`Invalid package: Missing 'types' or 'typings' in ${Path.normalize('/package.json')}`)); + .toThrow(new Error(`Invalid package: Missing 'types' or 'typings' in ${normalizeFilePath('/package.json')}`)); + }); + + describe('for a given prefix', () => { + beforeEach(() => { + loader = new PackageMetadataLoader({ resolutionContext, prefixes: 'PRE' }); + }); + + it('should return with all required entries', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('/package.json')]: `{ + "name": "@solid/community-server", + "version": "1.2.3", + "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", + "lsd:components": "components/components.jsonld", + "lsd:contexts": { + "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld": "components/context.jsonld" + }, + "lsd:importPaths": { + "https://example.org/bundles/npm/@solid/community-server/^1.0.0/components/": "components/", + "https://example.org/bundles/npm/@solid/community-server/^1.0.0/config/": "config/" + }, + "types": "./index.d.ts" +}`, + }; + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), + contexts: { + [`https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld`]: + 'components/context.jsonld', + }, + importPaths: { + 'https://example.org/bundles/npm/@solid/community-server/^1.0.0/components/': 'components/', + 'https://example.org/bundles/npm/@solid/community-server/^1.0.0/config/': 'config/', + }, + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', + name: '@solid/community-server', + version: '1.2.3', + typesPath: normalizeFilePath('/index'), + prefix: 'PRE', + }); + }); + }); + + describe('for a given prefixes', () => { + beforeEach(() => { + loader = new PackageMetadataLoader({ + resolutionContext, + prefixes: { + '@solid/community-server': 'css', + '@comunica/actor-init-sparql': 'cais', + }, + }); + }); + + it('should return with all required entries', async() => { + resolutionContext.contentsOverrides = { + [normalizeFilePath('/package.json')]: `{ + "name": "@solid/community-server", + "version": "1.2.3", + "lsd:module": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server", + "lsd:components": "components/components.jsonld", + "lsd:contexts": { + "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld": "components/context.jsonld" + }, + "lsd:importPaths": { + "https://example.org/bundles/npm/@solid/community-server/^1.0.0/components/": "components/", + "https://example.org/bundles/npm/@solid/community-server/^1.0.0/config/": "config/" + }, + "types": "./index.d.ts" +}`, + }; + await expect(loader.load('/')).resolves.toEqual({ + componentsPath: normalizeFilePath('/components/components.jsonld'), + contexts: { + [`https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld`]: + 'components/context.jsonld', + }, + importPaths: { + 'https://example.org/bundles/npm/@solid/community-server/^1.0.0/components/': 'components/', + 'https://example.org/bundles/npm/@solid/community-server/^1.0.0/config/': 'config/', + }, + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server', + name: '@solid/community-server', + version: '1.2.3', + typesPath: normalizeFilePath('/index'), + prefix: 'css', + }); + }); }); }); }); diff --git a/test/parse/ParameterLoader.test.ts b/test/parse/ParameterLoader.test.ts index 23dfbe7..09f0a2e 100644 --- a/test/parse/ParameterLoader.test.ts +++ b/test/parse/ParameterLoader.test.ts @@ -1,9 +1,11 @@ -import type { MethodDefinition, TSTypeLiteral, Identifier, TSIndexSignature, - TSTypeAnnotation, TypeNode, TSTypeReference } from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; -import type { ClassReference, InterfaceLoaded } from '../../lib/parse/ClassIndex'; +import { ClassFinder } from '../../lib/parse/ClassFinder'; +import type { ClassLoaded, ClassReference, ClassReferenceLoaded, InterfaceLoaded } from '../../lib/parse/ClassIndex'; +import { ClassIndexer } from '../../lib/parse/ClassIndexer'; import { ClassLoader } from '../../lib/parse/ClassLoader'; import type { CommentData } from '../../lib/parse/CommentLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; import { ConstructorLoader } from '../../lib/parse/ConstructorLoader'; import type { ParameterRangeUnresolved } from '../../lib/parse/ParameterLoader'; import { ParameterLoader } from '../../lib/parse/ParameterLoader'; @@ -12,50 +14,280 @@ import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ParameterLoader', () => { const resolutionContext = new ResolutionContextMocked({}); let logger: any; + let commentLoader: CommentLoader; let classLoader: ClassLoader; let loader: ParameterLoader; + let classLoadedDummy: ClassLoaded; let constructorLoader: ConstructorLoader; beforeEach(() => { logger = { debug: jest.fn(), + error: jest.fn(), }; - classLoader = new ClassLoader({ resolutionContext, logger }); - loader = new ParameterLoader({ classLoaded: { localName: 'A', fileName: 'file' }}); - constructorLoader = new ConstructorLoader(); + commentLoader = new CommentLoader(); + classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); + classLoadedDummy = { localName: 'A', fileName: 'file' }; + loader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + constructorLoader = new ConstructorLoader({ parameterLoader: loader }); + }); + + describe('loadAllExtensionData', () => { + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; + + async function getClass(definition: string) { + resolutionContext.contentsOverrides = { + 'file.d.ts': definition, + }; + const classLoaded = await classLoader.loadClassDeclaration(clazz, true, true); + return classLoaded.type === 'type' ? + classLoaded : + await new ClassIndexer({ + classLoader, + classFinder: new ClassFinder({ classLoader }), + ignoreClasses: {}, + logger, + }).loadClassChain(classLoaded); + } + + it('should be empty for empty index', async() => { + expect(loader.loadAllExtensionData({})).toEqual({}); + }); + + it('should handle a non-emty index', async() => { + expect(loader.loadAllExtensionData({ + A: await getClass(`export class A extends SuperA {} +export class SuperA {}`), + B: await getClass(`export type A = number`), + C: await getClass(`export interface A {}`), + })).toEqual({ + A: expect.anything(), + C: expect.anything(), + }); + }); + }); + + describe('loadExtensionData', () => { + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; + + async function getClass(definition: string) { + resolutionContext.contentsOverrides = { + 'file.d.ts': definition, + }; + const classLoaded = await classLoader.loadClassDeclaration(clazz, true, false); + return await new ClassIndexer({ + classLoader, + classFinder: new ClassFinder({ classLoader }), + ignoreClasses: {}, + logger, + }).loadClassChain(classLoaded); + } + + it('should be empty for no extensions', async() => { + const classLoaded = await getClass(` +export class A{}`); + expect(loader.loadExtensionData(classLoaded)).toEqual([]); + }); + + it('should be empty for no extensions and interfaces', async() => { + const classLoaded = await getClass(` +export class A{}`); + delete ( classLoaded).implementsInterfaces; + expect(loader.loadExtensionData(classLoaded)).toEqual([]); + }); + + it('should handle a class extension', async() => { + const classLoaded = await getClass(` +export class A extends SuperA {} +export class SuperA {}`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'SuperA', + }, + genericTypeInstantiations: [], + }, + ]); + }); + + it('should handle interface extensions', async() => { + const classLoaded = await getClass(` +export class A implements IFace1, IFace2{}; +export interface IFace1 {}; +export interface IFace2 {};`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'IFace1', + }, + genericTypeInstantiations: [], + }, + { + classLoaded: { + localName: 'IFace2', + }, + genericTypeInstantiations: [], + }, + ]); + }); + + it('should handle interface supers', async() => { + const classLoaded = await getClass(` +export interface A extends IFace1, IFace2{}; +export interface IFace1 {}; +export interface IFace2 {};`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'IFace1', + }, + genericTypeInstantiations: [], + }, + { + classLoaded: { + localName: 'IFace2', + }, + genericTypeInstantiations: [], + }, + ]); + }); + + it('should handle interface without supers', async() => { + const classLoaded = await getClass(` +export interface A{};`); + delete ( classLoaded).superInterfaces; + expect(loader.loadExtensionData(classLoaded)).toMatchObject([]); + }); + + it('should handle a class extension with generics', async() => { + const classLoaded = await getClass(` +export class A extends SuperA {}; +export class SuperA{};`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'SuperA', + }, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + ]); + }); + + it('should handle interface extensions with generics', async() => { + const classLoaded = await getClass(` +export class A implements IFace1, IFace2 {} +export interface IFace1{}; +export interface IFace2{};`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'IFace1', + }, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: { + localName: 'IFace2', + }, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ]); + }); + + it('should handle interface supers with generics', async() => { + const classLoaded = await getClass(` +export interface A extends IFace1, IFace2 {} +export interface IFace1{}; +export interface IFace2{};`); + expect(loader.loadExtensionData(classLoaded)).toMatchObject([ + { + classLoaded: { + localName: 'IFace1', + }, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: { + localName: 'IFace2', + }, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ]); + }); }); describe('loadConstructorFields', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; - async function getConstructor(definition: string): - Promise<{ constructor: MethodDefinition; parameterLoader: ParameterLoader }> { + async function getConstructor(definition: string) { resolutionContext.contentsOverrides = { 'file.d.ts': definition, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const constructor = ( constructorLoader.getConstructor(classLoaded)); - const parameterLoader = new ParameterLoader({ classLoaded }); + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const constructorChain = constructorLoader.getConstructorChain({ value: classLoaded }); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); - return { constructor, parameterLoader }; + return { constructorChain, parameterLoader, classLoaded }; } it('should be empty for an empty constructor', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor() {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [], }); }); it('should handle a single field without comment', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -64,22 +296,21 @@ export class A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ], }); }); it('should handle a single field with comment', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ /** * @param fieldA - This is a great field! @range {float} */ constructor(fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -89,28 +320,27 @@ export class A{ type: 'override', value: 'float', }, - required: true, - unique: true, }, ], }); }); it('should handle a single ignored field', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ /** * @param fieldA - This is a great field! @ignored */ constructor(fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [], }); }); it('should handle a multiple fields', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ /** * @param fieldA - This is a great field! @range {float} @@ -119,7 +349,8 @@ export class A{ */ constructor(fieldA: string, fieldB?: number[], fieldC?: string[]) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -129,39 +360,47 @@ export class A{ type: 'override', value: 'float', }, - required: true, - unique: true, }, { type: 'field', comment: 'This is B', name: 'fieldB', range: { - type: 'override', - value: 'float', + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'override', + value: 'float', + }, + }, + { + type: 'undefined', + }, + ], }, - required: false, - unique: false, }, ], }); }); it('should error on an unknown field type', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader } = await getConstructor(` export class A{ constructor(fieldA = 'true') {} }`); - expect(() => parameterLoader.loadConstructorFields(constructor)) + expect(() => parameterLoader.loadConstructorFields(constructorChain)) .toThrow(new Error('Could not understand constructor parameter type AssignmentPattern in A at file')); }); it('should handle a hash field', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(fieldA: { a: string }) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toMatchObject({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toMatchObject({ + classLoaded, parameters: [ { name: 'fieldA', @@ -179,20 +418,19 @@ export class A{ type: 'TSTypeLiteral', }, }, - required: true, type: 'field', - unique: true, }, ], }); }); it('should handle a hash field with indexed element', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(fieldA: { [key: string]: string }) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toMatchObject({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toMatchObject({ + classLoaded, parameters: [ { name: 'fieldA', @@ -202,20 +440,19 @@ export class A{ type: 'TSTypeLiteral', }, }, - required: false, type: 'field', - unique: false, }, ], }); }); it('should handle a public field', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(public fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -224,19 +461,18 @@ export class A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ], }); }); it('should handle a protected field', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(protected fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -245,19 +481,18 @@ export class A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ], }); }); it('should handle a private field', async() => { - const { constructor, parameterLoader } = await getConstructor(` + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` export class A{ constructor(private fieldA: string) {} }`); - expect(parameterLoader.loadConstructorFields(constructor)).toEqual({ + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, parameters: [ { type: 'field', @@ -266,226 +501,706 @@ export class A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ], }); }); - }); - - describe('loadInterfaceFields', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; - - async function getInterface(definition: string): - Promise<{ iface: InterfaceLoaded; parameterLoader: ParameterLoader }> { - resolutionContext.contentsOverrides = { - 'file.d.ts': definition, - }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, true); - const parameterLoader = new ParameterLoader({ classLoaded }); - - return { iface: classLoaded, parameterLoader }; - } - it('should be empty for an empty interface', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ + it('should handle a public array field', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA: string[]) {} }`); - expect(parameterLoader.loadInterfaceFields(iface)).toEqual([]); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'array', + value: { + type: 'raw', + value: 'string', + }, + }, + }, + ], + }); }); - it('should error for an interface with methods', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ - a(): void; - b(): void; + it('should handle a public optional field', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA?: string) {} }`); - expect(() => parameterLoader.loadInterfaceFields(iface)) - .toThrow(new Error('Unsupported field type TSMethodSignature in A in file')); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); }); - it('should handle a simple field without comment', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ - fieldA: boolean; + it('should handle a public optional union field', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA?: string | number) {} }`); - expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ - { - type: 'field', - name: 'fieldA', - range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, - }, - ]); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); }); - it('should handle a field that should be ignored', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ - /** - * @ignored - */ - fieldA: boolean; + it('should handle a public optional field as union type', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA?: string | undefined) {} }`); - expect(parameterLoader.loadInterfaceFields(iface)).toEqual([]); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); }); - it('should handle a simple field with comment', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ - /** - * Hi - * @range {number} - * @default: {3} - */ - fieldA?: boolean[]; + it('should handle a public required field as union type', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA: string | undefined) {} }`); - expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ - { - type: 'field', - name: 'fieldA', - comment: 'Hi', - range: { type: 'override', value: 'number' }, - required: false, - unique: false, - }, - ]); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); }); - it('should handle an interface field', async() => { - const { iface, parameterLoader } = await getInterface(` -export interface A{ - fieldA: MyClass; + it('should handle a public optional array field', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA?: string[]) {} }`); - expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ - { - type: 'field', - name: 'fieldA', - range: { type: 'interface', value: 'MyClass' }, - required: true, - unique: true, - }, - ]); - }); - }); - - describe('loadHashFields', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; - - async function getHash(definition: string): - Promise<{ hash: TSTypeLiteral; parameterLoader: ParameterLoader }> { + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'raw', + value: 'string', + }, + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); + }); + + it('should handle a public optional array field as union type', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA?: string[] | undefined) {} +}`); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'raw', + value: 'string', + }, + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); + }); + + it('should handle a public required array field as union type', async() => { + const { constructorChain, parameterLoader, classLoaded } = await getConstructor(` +export class A{ + constructor(public fieldA: string[] | undefined) {} +}`); + expect(parameterLoader.loadConstructorFields(constructorChain)).toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'raw', + value: 'string', + }, + }, + { + type: 'undefined', + }, + ], + }, + }, + ], + }); + }); + }); + + describe('loadClassGenerics', () => { + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; + + async function getGenerics(definition: string) { + resolutionContext.contentsOverrides = { + 'file.d.ts': definition, + }; + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + + return { parameterLoader, classLoaded }; + } + + it('should be empty for a class without generics', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A{}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [], + }); + }); + + it('should handle a single untyped generic', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + }, + ], + }); + }); + + it('should handle a single typed generic', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + range: { type: 'raw', value: 'string' }, + }, + ], + }); + }); + + it('should handle a single union typed generic', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + range: { + type: 'union', + elements: [ + { type: 'raw', value: 'string' }, + { type: 'raw', value: 'number' }, + ], + }, + }, + ], + }); + }); + + it('should handle a multiple typed generic', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + range: { type: 'raw', value: 'string' }, + }, + { + name: 'U', + range: { type: 'raw', value: 'number' }, + }, + ], + }); + }); + + it('should handle a single typed generic with sub-generic', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A>{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + range: { + type: 'interface', + value: 'Class', + genericTypeParameterInstantiations: [ + { + type: 'interface', + value: 'U', + origin: classLoaded, + }, + ], + origin: classLoaded, + }, + }, + ], + }); + }); + + it('should handle a multiple typed generic with linked sub-generics', async() => { + const { parameterLoader, classLoaded } = await getGenerics(` +export class A, U extends number>{ + constructor() {} +}`); + expect(parameterLoader.loadClassGenerics(classLoaded)).toEqual({ + classLoaded, + genericTypeParameters: [ + { + name: 'T', + range: { + type: 'interface', + value: 'Class', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'U', + }, + ], + origin: classLoaded, + }, + }, + { + name: 'U', + range: { type: 'raw', value: 'number' }, + }, + ], + }); + }); + }); + + describe('loadInterfaceFields', () => { + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; + + async function getInterface(definition: string): + Promise<{ iface: InterfaceLoaded; parameterLoader: ParameterLoader }> { + resolutionContext.contentsOverrides = { + 'file.d.ts': definition, + }; + const classLoaded = await classLoader.loadClassDeclaration(clazz, true, false); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + + return { iface: classLoaded, parameterLoader }; + } + + it('should be empty for an empty interface', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ +}`); + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([]); + }); + + it('should error for an interface with methods', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + a(): void; + b(): void; +}`); + expect(() => parameterLoader.loadInterfaceFields(iface)) + .toThrow(new Error('Unsupported field type TSMethodSignature in A in file')); + }); + + it('should handle a simple field without comment', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + fieldA: boolean; +}`); + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ + { + type: 'field', + name: 'fieldA', + range: { type: 'raw', value: 'boolean' }, + }, + ]); + }); + + it('should handle a field that should be ignored', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + /** + * @ignored + */ + fieldA: boolean; +}`); + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([]); + }); + + it('should handle a simple field with comment', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + /** + * Hi + * @range {number} + * @default {3} + */ + fieldA?: boolean[]; +}`); + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ + { + type: 'field', + name: 'fieldA', + comment: 'Hi', + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'override', + value: 'number', + }, + }, + { type: 'undefined' }, + ], + }, + defaults: [{ type: 'raw', value: '3' }], + }, + ]); + }); + + it('should handle an interface field', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + fieldA: MyClass; +}`); + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ + { + type: 'field', + name: 'fieldA', + range: { type: 'interface', value: 'MyClass', origin: iface }, + }, + ]); + }); + + it('should handle an interface that extends another interface', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + fieldA: MyClass1; +}`); + const ifaceSuper = (await getInterface(` +export interface A{ + fieldB: MyClass2; +}`)).iface; + iface.superInterfaces = [ + { value: ifaceSuper }, + ]; + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ + { + type: 'field', + name: 'fieldA', + range: { type: 'interface', value: 'MyClass1', origin: iface }, + }, + { + type: 'field', + name: 'fieldB', + range: { type: 'interface', value: 'MyClass2', origin: ifaceSuper }, + }, + ]); + }); + + it('should handle an interface that extends two other interfaces', async() => { + const { iface, parameterLoader } = await getInterface(` +export interface A{ + fieldA: MyClass1; +}`); + const ifaceSuper1 = (await getInterface(` +export interface A{ + fieldB: MyClass2; +}`)).iface; + const ifaceSuper2 = (await getInterface(` +export interface A{ + fieldC: MyClass3; + fieldD: MyClass4; +}`)).iface; + iface.superInterfaces = [ + { value: ifaceSuper1 }, + { value: ifaceSuper2 }, + ]; + expect(parameterLoader.loadInterfaceFields(iface)).toEqual([ + { + type: 'field', + name: 'fieldA', + range: { type: 'interface', value: 'MyClass1', origin: iface }, + }, + { + type: 'field', + name: 'fieldB', + range: { type: 'interface', value: 'MyClass2', origin: ifaceSuper1 }, + }, + { + type: 'field', + name: 'fieldC', + range: { type: 'interface', value: 'MyClass3', origin: ifaceSuper2 }, + }, + { + type: 'field', + name: 'fieldD', + range: { type: 'interface', value: 'MyClass4', origin: ifaceSuper2 }, + }, + ]); + }); + }); + + describe('loadHashFields', () => { + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; + + async function getHash(definition: string): + Promise<{ hash: TSESTree.TSTypeLiteral; parameterLoader: ParameterLoader; classLoaded: ClassReferenceLoaded }> { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{ constructor(fieldA: ${definition}) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const hash: TSTypeLiteral = ( ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const hash: TSESTree.TSTypeLiteral = ( constructorLoader.getConstructor({ value: classLoaded })!.constructor .value.params[0]).typeAnnotation.typeAnnotation; - const parameterLoader = new ParameterLoader({ classLoaded }); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); - return { hash, parameterLoader }; + return { hash, parameterLoader, classLoaded }; } it('should be empty for an empty hash', async() => { - const { hash, parameterLoader } = await getHash(`{}`); - expect(parameterLoader.loadHashFields(hash)).toEqual([]); + const { hash, parameterLoader, classLoaded } = await getHash(`{}`); + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([]); }); it('should error for an hash with methods', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { a(): void; b(): void; }`); - expect(() => parameterLoader.loadHashFields(hash)) + expect(() => parameterLoader.loadHashFields(classLoaded, hash)) .toThrow(new Error('Unsupported field type TSMethodSignature in A in file')); }); it('should handle a simple field without comment', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { fieldA: boolean; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, }, ]); }); it('should handle a field that should be ignored', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { /** * @ignored */ fieldA: boolean; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([]); + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([]); }); it('should handle an index signature that should be ignored', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { /** * @ignored */ [key: string]: boolean; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([]); + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([]); }); it('should handle a simple field with comment', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { /** * Hi * @range {number} - * @default: {3} + * @default {3} */ fieldA?: boolean[]; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'field', name: 'fieldA', comment: 'Hi', - range: { type: 'override', value: 'number' }, - required: false, - unique: false, + defaults: [{ type: 'raw', value: '3' }], + range: { + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'override', + value: 'number', + }, + }, + { type: 'undefined' }, + ], + }, }, ]); }); it('should handle an interface field', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { fieldA: MyClass; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'field', name: 'fieldA', - range: { type: 'interface', value: 'MyClass' }, - required: true, - unique: true, + range: { type: 'interface', value: 'MyClass', origin: classLoaded }, }, ]); }); it('should handle a string index signature with raw value', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { [key: string]: string; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'index', domain: 'string', @@ -495,11 +1210,11 @@ export interface A{ }); it('should handle a number index signature with raw value', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { [key: number]: string; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'index', domain: 'number', @@ -509,26 +1224,26 @@ export interface A{ }); it('should handle a number index signature with interface value', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { [key: number]: MyClass; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'index', domain: 'number', - range: { type: 'interface', value: 'MyClass' }, + range: { type: 'interface', value: 'MyClass', origin: classLoaded }, }, ]); }); it('should handle a string index signature, and raw field', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { [key: string]: string; something: string; }`); - expect(parameterLoader.loadHashFields(hash)).toEqual([ + expect(parameterLoader.loadHashFields(classLoaded, hash)).toEqual([ { type: 'index', domain: 'string', @@ -538,34 +1253,32 @@ export interface A{ type: 'field', name: 'something', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, }, ]); }); it('should error on no index signature', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { []: string; }`); - expect(() => parameterLoader.loadHashFields(hash)) + expect(() => parameterLoader.loadHashFields(classLoaded, hash)) .toThrow(new Error('Expected exactly one key in index signature in A at file')); }); it('should error on multiple index signatures', async() => { - const { hash, parameterLoader } = await getHash(` + const { hash, parameterLoader, classLoaded } = await getHash(` { [key1: string, key2: string]: string; }`); - expect(() => parameterLoader.loadHashFields(hash)) + expect(() => parameterLoader.loadHashFields(classLoaded, hash)) .toThrow(new Error('Expected exactly one key in index signature in A at file')); }); }); describe('loadField', () => { it('should get required data', () => { - expect(loader.loadField( { + expect(loader.loadField(classLoadedDummy, { name: 'fieldA', typeAnnotation: { typeAnnotation: { @@ -583,17 +1296,48 @@ export interface A{ }, {})).toEqual({ type: 'field', name: 'fieldA', - unique: false, - required: false, range: { - type: 'raw', - value: 'boolean', + type: 'union', + elements: [ + { + type: 'array', + value: { type: 'raw', value: 'boolean' }, + }, + { + type: 'undefined', + }, + ], }, }); }); - it('should also get optional data', () => { - expect(loader.loadField( { + it('should get optional data', () => { + expect(loader.loadField(classLoadedDummy, { + name: 'fieldA', + typeAnnotation: { + typeAnnotation: { + type: AST_NODE_TYPES.TSArrayType, + elementType: { + type: AST_NODE_TYPES.TSTypeReference, + typeName: { + type: AST_NODE_TYPES.Identifier, + name: 'Boolean', + }, + }, + }, + }, + }, {})).toEqual({ + type: 'field', + name: 'fieldA', + range: { + type: 'array', + value: { type: 'raw', value: 'boolean' }, + }, + }); + }); + + it('should get optional data with override', () => { + expect(loader.loadField(classLoadedDummy, { name: 'fieldA', typeAnnotation: { typeAnnotation: { @@ -613,18 +1357,47 @@ export interface A{ type: 'override', value: 'float', }, - default: '1.0', + defaults: [{ type: 'raw', value: '1.0' }], + defaultNested: [ + { + paramPath: [ 'a', 'b' ], + value: { type: 'raw', value: 'A' }, + }, + { + paramPath: [ 'c' ], + value: { type: 'raw', value: 'B' }, + }, + ], description: 'Hi', })).toEqual({ type: 'field', name: 'fieldA', - unique: false, - required: false, range: { - type: 'override', - value: 'float', + type: 'union', + elements: [ + { + type: 'array', + value: { + type: 'override', + value: 'float', + }, + }, + { + type: 'undefined', + }, + ], }, - default: '1.0', + defaults: [{ type: 'raw', value: '1.0' }], + defaultNested: [ + { + paramPath: [ 'a', 'b' ], + value: { type: 'raw', value: 'A' }, + }, + { + paramPath: [ 'c' ], + value: { type: 'raw', value: 'B' }, + }, + ], comment: 'Hi', }); }); @@ -632,20 +1405,17 @@ export interface A{ describe('loadIndex', () => { it('should get required data', () => { - expect(loader.loadIndex( { + expect(loader.loadIndex(classLoadedDummy, { type: AST_NODE_TYPES.TSIndexSignature, parameters: [{ type: AST_NODE_TYPES.Identifier, name: 'key', typeAnnotation: { typeAnnotation: { - type: AST_NODE_TYPES.TSArrayType, - elementType: { - type: AST_NODE_TYPES.TSTypeReference, - typeName: { - type: AST_NODE_TYPES.Identifier, - name: 'String', - }, + type: AST_NODE_TYPES.TSTypeReference, + typeName: { + type: AST_NODE_TYPES.Identifier, + name: 'String', }, }, }, @@ -666,27 +1436,27 @@ export interface A{ type: 'index', domain: 'string', range: { - type: 'raw', - value: 'boolean', + type: 'array', + value: { + type: 'raw', + value: 'boolean', + }, }, }); }); it('should also get optional data', () => { - expect(loader.loadIndex( { + expect(loader.loadIndex(classLoadedDummy, { type: AST_NODE_TYPES.TSIndexSignature, parameters: [{ type: AST_NODE_TYPES.Identifier, name: 'key', typeAnnotation: { typeAnnotation: { - type: AST_NODE_TYPES.TSArrayType, - elementType: { - type: AST_NODE_TYPES.TSTypeReference, - typeName: { - type: AST_NODE_TYPES.Identifier, - name: 'String', - }, + type: AST_NODE_TYPES.TSTypeReference, + typeName: { + type: AST_NODE_TYPES.Identifier, + name: 'String', }, }, }, @@ -708,7 +1478,7 @@ export interface A{ type: 'override', value: 'string', }, - default: '1.0', + defaults: [{ type: 'raw', value: '1.0' }], description: 'Hi', })).toEqual({ type: 'index', @@ -717,7 +1487,7 @@ export interface A{ type: 'override', value: 'string', }, - default: '1.0', + defaults: [{ type: 'raw', value: '1.0' }], comment: 'Hi', }); }); @@ -725,22 +1495,22 @@ export interface A{ describe('getFieldName', () => { it('should get the field name of an Identifier', () => { - expect(loader.getFieldName( { + expect(loader.getFieldName(classLoadedDummy, { name: 'fieldA', - })).toEqual('fieldA'); + })).toBe('fieldA'); }); it('should get the field name of a TSPropertySignature', () => { - expect(loader.getFieldName( { + expect(loader.getFieldName(classLoadedDummy, { key: { type: AST_NODE_TYPES.Identifier, name: 'fieldA', }, - })).toEqual('fieldA'); + })).toBe('fieldA'); }); it('should error on getting the field name of an unknown type', () => { - expect(() => loader.getFieldName( { + expect(() => loader.getFieldName(classLoadedDummy, { key: { type: 'unknown', name: 'fieldA', @@ -749,181 +1519,85 @@ export interface A{ }); }); - describe('isFieldUnique', () => { - it('should return true when there is no type annotation', () => { - expect(loader.isFieldUnique( {})).toEqual(true); - }); - - it('should return true when the type annotation is not array', () => { - expect(loader.isFieldUnique( { - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSAnyKeyword, - }, - }, - })).toEqual(true); - }); - - it('should return false when the type annotation is array', () => { - expect(loader.isFieldUnique( { - name: 'fieldA', - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSArrayType, - }, - }, - })).toEqual(false); - }); - - it('should return false when the type annotation is an indexed hash', () => { - expect(loader.isFieldUnique( { - name: 'fieldA', - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSTypeLiteral, - members: [ - { type: AST_NODE_TYPES.TSIndexSignature }, - ], - }, - }, - })).toEqual(false); - }); - - it('should return true when the type annotation is a hash without index', () => { - expect(loader.isFieldUnique( { - name: 'fieldA', - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSTypeLiteral, - members: [ - { type: 'bla' }, - ], - }, - }, - })).toEqual(true); - }); - }); - - describe('isFieldRequired', () => { - it('should be true without optional field', () => { - expect(loader.isFieldRequired( {})).toEqual(true); - }); - - it('should be true with a falsy optional field', () => { - expect(loader.isFieldRequired( { - optional: false, - })).toEqual(true); - }); - - it('should be false with a truthy optional field', () => { - expect(loader.isFieldRequired( { - optional: true, - })).toEqual(false); - }); - - it('should return false when the type annotation is an indexed hash', () => { - expect(loader.isFieldRequired( { - name: 'fieldA', - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSTypeLiteral, - members: [ - { type: AST_NODE_TYPES.TSIndexSignature }, - ], - }, - }, - })).toEqual(false); - }); - - it('should return true when the type annotation is a hash without index', () => { - expect(loader.isFieldRequired( { - name: 'fieldA', - typeAnnotation: { - typeAnnotation: { - type: AST_NODE_TYPES.TSTypeLiteral, - members: [ - { type: 'bla' }, - ], - }, - }, - })).toEqual(true); - }); - }); - describe('getFieldRange', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; - async function getFieldRange(fieldDeclaration: string, commentData: CommentData): + async function getFieldRange(fieldDeclaration: string, commentData: CommentData, hardErrorUnsupported = true): Promise { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{ constructor(${fieldDeclaration}) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: Identifier = ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: TSESTree.Identifier = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); - return parameterLoader.getFieldRange(field, commentData); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported, logger }); + return parameterLoader.getFieldRange(classLoaded, field, commentData); } it('should get the range of a raw Boolean field type and ignore empty comment data', async() => { - expect(await getFieldRange('fieldA: Boolean', {})) + await expect(getFieldRange('fieldA: Boolean', {})).resolves .toEqual({ type: 'raw', value: 'boolean' }); }); it('should get the range of the comment data', async() => { - expect(await getFieldRange('fieldA: Boolean', { + await expect(getFieldRange('fieldA: Boolean', { range: { type: 'override', value: 'number', }, - })).toEqual({ type: 'override', value: 'number' }); + })).resolves.toEqual({ type: 'override', value: 'number' }); }); it('should get the range of a raw Boolean field type', async() => { - expect(await getFieldRange('fieldA: Boolean', {})) + await expect(getFieldRange('fieldA: Boolean', {})).resolves .toEqual({ type: 'raw', value: 'boolean' }); }); it('should get the range of a raw boolean field type', async() => { - expect(await getFieldRange('fieldA: boolean', {})) + await expect(getFieldRange('fieldA: boolean', {})).resolves .toEqual({ type: 'raw', value: 'boolean' }); }); it('should get the range of a raw Number field type', async() => { - expect(await getFieldRange('fieldA: Number', {})) + await expect(getFieldRange('fieldA: Number', {})).resolves .toEqual({ type: 'raw', value: 'number' }); }); it('should get the range of a raw number field type', async() => { - expect(await getFieldRange('fieldA: number', {})) + await expect(getFieldRange('fieldA: number', {})).resolves .toEqual({ type: 'raw', value: 'number' }); }); it('should get the range of a raw String field type', async() => { - expect(await getFieldRange('fieldA: String', {})) + await expect(getFieldRange('fieldA: String', {})).resolves .toEqual({ type: 'raw', value: 'string' }); }); it('should get the range of a raw string field type', async() => { - expect(await getFieldRange('fieldA: string', {})) + await expect(getFieldRange('fieldA: string', {})).resolves .toEqual({ type: 'raw', value: 'string' }); }); it('should get the range of a string array field type', async() => { - expect(await getFieldRange('fieldA: string[]', {})) - .toEqual({ type: 'raw', value: 'string' }); + await expect(getFieldRange('fieldA: string[]', {})).resolves + .toEqual({ type: 'array', value: { type: 'raw', value: 'string' }}); }); it('should get the range of a String array field type', async() => { - expect(await getFieldRange('fieldA: String[]', {})) - .toEqual({ type: 'raw', value: 'string' }); + await expect(getFieldRange('fieldA: String[]', {})).resolves + .toEqual({ type: 'array', value: { type: 'raw', value: 'string' }}); }); it('should get the range of a string Array field type', async() => { - expect(await getFieldRange('fieldA: Array', {})) - .toEqual({ type: 'raw', value: 'string' }); + await expect(getFieldRange('fieldA: Array', {})).resolves + .toEqual({ type: 'array', value: { type: 'raw', value: 'string' }}); }); it('should error on an Array field type with no params', async() => { @@ -931,33 +1605,83 @@ export interface A{ .rejects.toThrow(new Error('Found invalid Array field type at field fieldA in A at file')); }); + it('should log on an Array field type with no params', async() => { + await expect(getFieldRange('fieldA: Array<>', {}, false)).resolves + .toEqual({ type: 'wildcard' }); + expect(logger.error).toHaveBeenCalledWith('Found invalid Array field type at field fieldA in A at file'); + }); + it('should error on an Array field type with too many params', async() => { await expect(async() => await getFieldRange('fieldA: Array', {})) .rejects.toThrow(new Error('Found invalid Array field type at field fieldA in A at file')); }); - it('should error on a nested array', async() => { - await expect(async() => await getFieldRange('fieldA: string[][]', {})) - .rejects.toThrow(new Error('Detected illegal nested array type for field fieldA in A at file')); + it('should log on an Array field type with too many params', async() => { + await expect(getFieldRange('fieldA: Array', {}, false)).resolves + .toEqual({ type: 'wildcard' }); + expect(logger.error).toHaveBeenCalledWith('Found invalid Array field type at field fieldA in A at file'); + }); + + it('should handle a nested array', async() => { + await expect(getFieldRange('fieldA: string[][]', {})).resolves + .toEqual({ type: 'array', value: { type: 'array', value: { type: 'raw', value: 'string' }}}); + }); + + it('should handle a nested Array', async() => { + await expect(getFieldRange('fieldA: Array>', {})).resolves + .toEqual({ type: 'array', value: { type: 'array', value: { type: 'raw', value: 'string' }}}); }); - it('should error on a nested Array', async() => { - await expect(async() => await getFieldRange('fieldA: Array>', {})) - .rejects.toThrow(new Error('Detected illegal nested array type for field fieldA in A at file')); + it('should get the range of a class', async() => { + await expect(getFieldRange('fieldA: MyClass', {})).resolves + .toEqual({ type: 'interface', value: 'MyClass', origin: expect.anything() }); + }); + + it('should get the range of a generic class', async() => { + await expect(getFieldRange('fieldA: MyClass', {})).resolves + .toEqual({ + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [ + { + type: 'interface', + value: 'T', + origin: expect.anything(), + }, + ], + origin: expect.anything(), + }); + }); + + it('should get the range of a qualified name with generic', async() => { + await expect(getFieldRange('fieldA: a.B', {})).resolves + .toEqual({ + type: 'interface', + value: 'B', + genericTypeParameterInstantiations: [ + { + type: 'interface', + value: 'T', + origin: expect.anything(), + }, + ], + qualifiedPath: [ 'a' ], + origin: expect.anything(), + }); }); - it('should get the range of a class', async() => { - expect(await getFieldRange('fieldA: MyClass', {})) - .toEqual({ type: 'interface', value: 'MyClass' }); + it('should error on a range with typeof this', async() => { + await expect(async() => await getFieldRange('fieldA: typeof this', {})) + .rejects.toThrow(new Error(`Could not understand parameter type TSTypeQuery of field fieldA in A at file`)); }); - it('should get the range of a generic class', async() => { - expect(await getFieldRange('fieldA: MyClass', {})) - .toEqual({ type: 'interface', value: 'MyClass' }); + it('should error on a range with typeof this.abc', async() => { + await expect(async() => await getFieldRange('fieldA: typeof this.abc', {})) + .rejects.toThrow(new Error(`Not implemented yet: AST_NODE_TYPES.ThisExpression case`)); }); it('should get the range of a hash', async() => { - expect(await getFieldRange('fieldA: { a: number }', {})) + await expect(getFieldRange('fieldA: { a: number }', {})).resolves .toMatchObject({ type: 'hash', value: { @@ -982,9 +1706,14 @@ export interface A{ }); }); - it('should error on a field with qualified name', async() => { - await expect(async() => await getFieldRange('fieldA: a.B', {})) - .rejects.toThrow(new Error('Could not understand parameter type TSTypeReference of field fieldA in A at file')); + it('should get the range of a qualified name', async() => { + await expect(getFieldRange('fieldA: a.B', {})).resolves + .toEqual({ type: 'interface', value: 'B', qualifiedPath: [ 'a' ], origin: expect.anything() }); + }); + + it('should get the range of a long qualified name', async() => { + await expect(getFieldRange('fieldA: a.b.c.D', {})).resolves + .toEqual({ type: 'interface', value: 'D', qualifiedPath: [ 'a', 'b', 'c' ], origin: expect.anything() }); }); it('should error on a field without type', async() => { @@ -992,19 +1721,25 @@ export interface A{ .rejects.toThrow(new Error('Missing field type on fieldA in A at file')); }); + it('should log on a field without type', async() => { + await expect(getFieldRange('fieldA', {}, false)).resolves + .toEqual({ type: 'wildcard' }); + expect(logger.error).toHaveBeenCalledWith('Missing field type on fieldA in A at file'); + }); + it('should get the range of a generic type', async() => { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{ constructor(fieldA: T) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: Identifier = ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: TSESTree.Identifier = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); - expect(parameterLoader.getFieldRange(field, {})) - .toEqual({ type: 'interface', value: 'MyClass' }); + expect(parameterLoader.getFieldRange(classLoaded, field, {})) + .toEqual({ type: 'genericTypeReference', value: 'T' }); }); it('should get the range of a generic raw type', async() => { @@ -1013,32 +1748,32 @@ export interface A{ constructor(fieldA: T) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: Identifier = ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: TSESTree.Identifier = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); - expect(parameterLoader.getFieldRange(field, {})) - .toEqual({ type: 'raw', value: 'string' }); + expect(parameterLoader.getFieldRange(classLoaded, field, {})) + .toEqual({ type: 'genericTypeReference', value: 'T' }); }); - it('should fail to get the range of an untyped generic type', async() => { + it('should get the range of an untyped generic type', async() => { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{ constructor(fieldA: T) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: Identifier = ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: TSESTree.Identifier = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); - expect(() => parameterLoader.getFieldRange(field, {})) - .toThrow(new Error('Found untyped generic field type at field fieldA in A at file')); + expect(parameterLoader.getFieldRange(classLoaded, field, {})) + .toEqual({ type: 'genericTypeReference', value: 'T' }); }); it('should get the range of a Record', async() => { - expect(await getFieldRange('fieldA: Record', {})) + await expect(getFieldRange('fieldA: Record', {})).resolves .toMatchObject({ type: 'hash', value: { @@ -1070,49 +1805,509 @@ export interface A{ }); }); - it('should get the range of an unknown type as undefined', async() => { - expect(await getFieldRange('fieldA: unknown', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of an unknown type as wildcard', async() => { + await expect(getFieldRange('fieldA: unknown', {})).resolves + .toEqual({ type: 'wildcard' }); }); it('should get the range of an undefined type as undefined', async() => { - expect(await getFieldRange('fieldA: undefined', {})) + await expect(getFieldRange('fieldA: undefined', {})).resolves .toEqual({ type: 'undefined' }); }); - it('should get the range of an any type as undefined', async() => { - expect(await getFieldRange('fieldA: any', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of an any type as wildcard', async() => { + await expect(getFieldRange('fieldA: any', {})).resolves + .toEqual({ type: 'wildcard' }); }); - it('should get the range of an void type as undefined', async() => { - expect(await getFieldRange('fieldA: void', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of an void type as wildcard', async() => { + await expect(getFieldRange('fieldA: void', {})).resolves + .toEqual({ type: 'wildcard' }); }); - it('should get the range of a null type as undefined', async() => { - expect(await getFieldRange('fieldA: null', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of a null type as wildcard', async() => { + await expect(getFieldRange('fieldA: null', {})).resolves + .toEqual({ type: 'wildcard' }); }); - it('should get the range of a union type as undefined', async() => { - expect(await getFieldRange('fieldA: number | string', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of unsupported types as wildcard', async() => { + await expect(getFieldRange('fieldA: () => void', {})).resolves + .toEqual({ type: 'wildcard' }); + await expect(getFieldRange('fieldA: never', {})).resolves + .toEqual({ type: 'wildcard' }); }); - it('should get the range of a tuple type as undefined', async() => { - expect(await getFieldRange('fieldA: [ number, string ]', {})) - .toEqual({ type: 'undefined' }); + it('should get the range of a union type of two raw types', async() => { + await expect(getFieldRange('fieldA: number | string', {})).resolves + .toEqual({ + type: 'union', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'raw', value: 'string' }, + ], + }); + }); + + it('should get the range of a union type of a raw type and undefined', async() => { + await expect(getFieldRange('fieldA: number | undefined', {})).resolves + .toEqual({ + type: 'union', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'undefined' }, + ], + }); + }); + + it('should get the range of a union type of two raw types and undefined', async() => { + await expect(getFieldRange('fieldA: number | string | undefined', {})).resolves + .toEqual({ + type: 'union', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'raw', value: 'string' }, + { type: 'undefined' }, + ], + }); + }); + + it('should get the range of a union type of three classes', async() => { + await expect(getFieldRange('fieldA: MyClass1 | MyClass2 | MyClass3', {})).resolves + .toEqual({ + type: 'union', + elements: [ + { type: 'interface', value: 'MyClass1', origin: expect.anything() }, + { type: 'interface', value: 'MyClass2', origin: expect.anything() }, + { type: 'interface', value: 'MyClass3', origin: expect.anything() }, + ], + }); + }); + + it('should get the range of an intersection type of two raw types', async() => { + await expect(getFieldRange('fieldA: number & string', {})).resolves + .toEqual({ + type: 'intersection', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'raw', value: 'string' }, + ], + }); + }); + + it('should get the range of a intersection type of three classes', async() => { + await expect(getFieldRange('fieldA: MyClass1 & MyClass2 & MyClass3', {})).resolves + .toEqual({ + type: 'intersection', + elements: [ + { type: 'interface', value: 'MyClass1', origin: expect.anything() }, + { type: 'interface', value: 'MyClass2', origin: expect.anything() }, + { type: 'interface', value: 'MyClass3', origin: expect.anything() }, + ], + }); + }); + + it('should get the range of nested union and types', async() => { + await expect(getFieldRange('fieldA: (MyClass1 | MyClass2) & MyClass3', {})).resolves + .toEqual({ + type: 'intersection', + elements: [ + { + type: 'union', + elements: [ + { type: 'interface', value: 'MyClass1', origin: expect.anything() }, + { type: 'interface', value: 'MyClass2', origin: expect.anything() }, + ], + }, + { type: 'interface', value: 'MyClass3', origin: expect.anything() }, + ], + }); + }); + + it('should get the range of a tuple type of fixed length', async() => { + await expect(getFieldRange('fieldA: [ number, string ]', {})).resolves + .toEqual({ + type: 'tuple', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'raw', value: 'string' }, + ], + }); + }); + + it('should get the range of a tuple type with rest types', async() => { + await expect(getFieldRange('fieldA: [ number, ...string, ...number, ...(boolean | string) ]', {})).resolves + .toEqual({ + type: 'tuple', + elements: [ + { type: 'raw', value: 'number' }, + { type: 'rest', value: { type: 'raw', value: 'string' }}, + { type: 'rest', value: { type: 'raw', value: 'number' }}, + { + type: 'rest', + value: { + type: 'union', + elements: [ + { type: 'raw', value: 'boolean' }, + { type: 'raw', value: 'string' }, + ], + }, + }, + ], + }); + }); + + it('should get the range of a literal number field type', async() => { + await expect(getFieldRange('fieldA: 123', {})).resolves + .toEqual({ type: 'literal', value: 123 }); + }); + + it('should get the range of a literal string field type', async() => { + await expect(getFieldRange('fieldA: "abc"', {})).resolves + .toEqual({ type: 'literal', value: 'abc' }); + }); + + it('should get the range of a literal boolean field type', async() => { + await expect(getFieldRange('fieldA: true', {})).resolves + .toEqual({ type: 'literal', value: true }); + }); + + it('should error on a literal of unsupported type', async() => { + await expect(async() => await getFieldRange('fieldA: 100n', {})) + .rejects.toThrow(new Error(`Could not understand parameter type TSLiteralType of field fieldA in A at file`)); + }); + + it('should log on a literal of unsupported type', async() => { + await expect(getFieldRange('fieldA: 100n', {}, false)).resolves + .toEqual({ type: 'wildcard' }); + expect(logger.error).toHaveBeenCalledWith(`Could not understand parameter type TSLiteralType of field fieldA in A at file`); + }); + + it('should get the range of a keyof field type', async() => { + await expect(getFieldRange('fieldA: keyof MyClass', {})).resolves + .toEqual({ + type: 'keyof', + value: { type: 'interface', value: 'MyClass', origin: expect.anything() }, + }); + }); + + it('should error on a readonly type', async() => { + await expect(async() => await getFieldRange('fieldA: readonly ABC', {})) + .rejects.toThrow(new Error(`Could not understand parameter type TSTypeOperator of field fieldA in A at file`)); + }); + + it('should get the range of a typeof field type', async() => { + await expect(getFieldRange('fieldA: typeof MyClass', {})).resolves + .toEqual({ + type: 'typeof', + value: 'MyClass', + origin: expect.anything(), + }); + }); + + it('should get the range of a typeof field type with qualified path', async() => { + await expect(getFieldRange('fieldA: typeof A.B.MyClass', {})).resolves + .toEqual({ + type: 'typeof', + value: 'MyClass', + qualifiedPath: [ 'A', 'B' ], + origin: expect.anything(), + }); + }); + + it('should get the range of a static indexed access field type', async() => { + await expect(getFieldRange('fieldA: MyClass["field"]', {})).resolves + .toEqual({ + type: 'indexed', + object: { type: 'interface', value: 'MyClass', origin: expect.anything() }, + index: { type: 'literal', value: 'field' }, + }); + }); + + it('should get the range of a dynamic indexed access field type', async() => { + await expect(getFieldRange('fieldA: MyClass["fieldA" | "fieldB"]', {})).resolves + .toEqual({ + type: 'indexed', + object: { type: 'interface', value: 'MyClass', origin: expect.anything() }, + index: { + type: 'union', + elements: [ + { type: 'literal', value: 'fieldA' }, + { type: 'literal', value: 'fieldB' }, + ], + }, + }); }); }); - describe('getFieldDefault', () => { - it('should be undefined without default', () => { - expect(loader.getFieldDefault({})).toBeUndefined(); + describe('overrideRawRange', () => { + it('should override a raw range', () => { + expect(loader.overrideRawRange( + { + type: 'raw', + value: 'string', + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should not override an undefined range', () => { + expect(loader.overrideRawRange( + { + type: 'undefined', + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'undefined', + }); + }); + + it('should not override an override range', () => { + expect(loader.overrideRawRange( + { + type: 'override', + value: 'bla', + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'override', + value: 'bla', + }); + }); + + it('should not override an interface range', () => { + expect(loader.overrideRawRange( + { + type: 'interface', + value: 'bla', + genericTypeParameterInstantiations: [], + origin: classLoadedDummy, + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should override a genericTypeReference range', () => { + expect(loader.overrideRawRange( + { + type: 'genericTypeReference', + value: 'T', + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should override a typeof range', () => { + expect(loader.overrideRawRange( + { + type: 'typeof', + value: 'T', + origin: classLoadedDummy, + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should override an indexed range', () => { + expect(loader.overrideRawRange( + { + type: 'indexed', + object: {}, + index: {}, + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should override a hash range', () => { + expect(loader.overrideRawRange( + { + type: 'hash', + value: 'bla', + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should recursively override a union range', () => { + expect(loader.overrideRawRange( + { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'union', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'undefined', + }, + ], + }); + }); + + it('should recursively override an intersection range', () => { + expect(loader.overrideRawRange( + { + type: 'intersection', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'intersection', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'undefined', + }, + ], + }); + }); + + it('should recursively override a tuple range', () => { + expect(loader.overrideRawRange( + { + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'undefined', + }, + ], + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'undefined', + }, + ], + }); + }); + + it('should recursively override a rest range', () => { + expect(loader.overrideRawRange( + { + type: 'rest', + value: { + type: 'raw', + value: 'string', + }, + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'rest', + value: { + type: 'raw', + value: 'boolean', + }, + }); }); - it('should be defined with default', () => { - expect(loader.getFieldDefault({ default: 'abc' })).toEqual('abc'); + it('should recursively override an array range', () => { + expect(loader.overrideRawRange( + { + type: 'array', + value: { + type: 'raw', + value: 'string', + }, + }, + { + type: 'raw', + value: 'boolean', + }, + )).toEqual({ + type: 'array', + value: { + type: 'raw', + value: 'boolean', + }, + }); }); }); @@ -1122,12 +2317,17 @@ export interface A{ }); it('should be defined with description', () => { - expect(loader.getFieldComment({ description: 'abc' })).toEqual('abc'); + expect(loader.getFieldComment({ description: 'abc' })).toBe('abc'); }); }); describe('getIndexDomain', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; let parameterLoader: ParameterLoader; async function getIndexDomain(fieldDeclaration: string): @@ -1137,17 +2337,17 @@ export interface A{ constructor(field: ${fieldDeclaration}) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: any = (constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: any = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const indexSignature: TSIndexSignature = field.typeAnnotation.typeAnnotation.members[0]; - parameterLoader = new ParameterLoader({ classLoaded }); - return parameterLoader.getIndexDomain(indexSignature); + const indexSignature: TSESTree.TSIndexSignature = field.typeAnnotation.typeAnnotation.members[0]; + parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + return parameterLoader.getIndexDomain(classLoaded, indexSignature); } it('should get the domain of a raw Boolean', async() => { - expect(await getIndexDomain('{[k: Boolean]: string}')) - .toEqual('boolean'); + await expect(getIndexDomain('{[k: Boolean]: string}')).resolves + .toBe('boolean'); }); it('should error on missing parameters', async() => { @@ -1166,7 +2366,7 @@ export interface A{ }); it('should error on missing key type', async() => { - await expect(async() => parameterLoader.getIndexDomain( { + await expect(async() => parameterLoader.getIndexDomain(classLoadedDummy, { type: AST_NODE_TYPES.TSIndexSignature, parameters: [{ type: AST_NODE_TYPES.Identifier, @@ -1183,45 +2383,61 @@ export interface A{ }); describe('getIndexRange', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; - async function getIndexRange(fieldDeclaration: string, commentData: CommentData): + async function getIndexRange(fieldDeclaration: string, commentData: CommentData, hardErrorUnsupported = true): Promise { resolutionContext.contentsOverrides = { 'file.d.ts': `export class A{ constructor(field: ${fieldDeclaration}) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: any = (constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: any = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const indexSignature: TSIndexSignature = field.typeAnnotation.typeAnnotation.members[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); - return parameterLoader.getIndexRange(indexSignature, commentData); + const indexSignature: TSESTree.TSIndexSignature = field.typeAnnotation.typeAnnotation.members[0]; + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported, logger }); + return parameterLoader.getIndexRange(classLoaded, indexSignature, commentData); } it('should get the range of a raw Boolean field type and ignore empty comment data', async() => { - expect(await getIndexRange('{[k: string]: Boolean}', {})) + await expect(getIndexRange('{[k: string]: Boolean}', {})).resolves .toEqual({ type: 'raw', value: 'boolean' }); }); it('should get the range of the comment data', async() => { - expect(await getIndexRange('{[k: string]: Boolean}', { + await expect(getIndexRange('{[k: string]: Boolean}', { range: { type: 'override', value: 'number', }, - })).toEqual({ type: 'override', value: 'number' }); + })).resolves.toEqual({ type: 'override', value: 'number' }); }); it('should error on a missing range', async() => { await expect(async() => await getIndexRange('{[k: string]}', {})) .rejects.toThrow(new Error('Missing field type on an index signature in A at file')); }); + + it('should log on a missing range', async() => { + await expect(getIndexRange('{[k: string]}', {}, false)).resolves + .toEqual({ type: 'wildcard' }); + expect(logger.error).toHaveBeenCalledWith('Missing field type on an index signature in A at file'); + }); }); describe('handleTypeOverride', () => { - const clazz: ClassReference = { packageName: 'p', localName: 'A', fileName: 'file' }; + const clazz: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; async function handleTypeOverride(type: string): Promise { resolutionContext.contentsOverrides = { @@ -1229,20 +2445,20 @@ export interface A{ constructor(a: ${type}) {} }`, }; - const classLoaded = await classLoader.loadClassDeclaration(clazz, false); - const field: Identifier = ( constructorLoader.getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(clazz, false, false); + const field: TSESTree.Identifier = (constructorLoader.getConstructor({ value: classLoaded })!.constructor) .value.params[0]; - const parameterLoader = new ParameterLoader({ classLoaded }); - const typeNode: TypeNode = ( field.typeAnnotation).typeAnnotation; - return parameterLoader.handleTypeOverride( typeNode); + const parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + const typeNode: TSESTree.TSTypeReference = field.typeAnnotation!.typeAnnotation; + return parameterLoader.handleTypeOverride(typeNode); } it('should do nothing on an unsupported type', async() => { - expect(await handleTypeOverride('String')).toBeUndefined(); + await expect(handleTypeOverride('String')).resolves.toBeUndefined(); }); it('handle a Record type alias', async() => { - expect(await handleTypeOverride('Record')).toMatchObject({ + await expect(handleTypeOverride('Record')).resolves.toMatchObject({ type: 'hash', value: { members: [ diff --git a/test/parse/ParameterResolver.test.ts b/test/parse/ParameterResolver.test.ts index def5fe7..11c889b 100644 --- a/test/parse/ParameterResolver.test.ts +++ b/test/parse/ParameterResolver.test.ts @@ -1,13 +1,18 @@ -import type { TSTypeLiteral, MethodDefinition } from '@typescript-eslint/types/dist/ts-estree'; +import type { TSESTree } from '@typescript-eslint/typescript-estree'; +import { AST_NODE_TYPES } from '@typescript-eslint/typescript-estree'; import type { ClassLoaded, ClassReference, ClassReferenceLoaded, InterfaceLoaded } from '../../lib/parse/ClassIndex'; import { ClassLoader } from '../../lib/parse/ClassLoader'; +import { CommentLoader } from '../../lib/parse/CommentLoader'; import { ConstructorLoader } from '../../lib/parse/ConstructorLoader'; +import { ParameterLoader } from '../../lib/parse/ParameterLoader'; import { ParameterResolver } from '../../lib/parse/ParameterResolver'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ParameterResolver', () => { const resolutionContext = new ResolutionContextMocked({}); let logger: any; + let commentLoader: CommentLoader; + let parameterLoader: ParameterLoader; let classLoader: ClassLoader; let ignoreClasses: Record; let loader: ParameterResolver; @@ -16,26 +21,27 @@ describe('ParameterResolver', () => { logger = { debug: jest.fn(), }; - classLoader = new ClassLoader({ resolutionContext, logger }); + commentLoader = new CommentLoader(); + classLoader = new ClassLoader({ resolutionContext, logger, commentLoader }); ignoreClasses = {}; - loader = new ParameterResolver({ classLoader, ignoreClasses }); + parameterLoader = new ParameterLoader({ commentLoader, hardErrorUnsupported: true, logger }); + loader = new ParameterResolver({ classLoader, ignoreClasses, parameterLoader }); }); describe('resolveAllConstructorParameters', () => { it('should handle an empty index', async() => { - expect(await loader.resolveAllConstructorParameters({}, {})) + await expect(loader.resolveAllConstructorParameters({})).resolves .toEqual({}); }); it('should handle a non-empty simple index', async() => { - expect(await loader.resolveAllConstructorParameters({ + await expect(loader.resolveAllConstructorParameters({ A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, parameters: [ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', @@ -43,16 +49,13 @@ describe('ParameterResolver', () => { }, ], }, - }, { - A: { type: 'class', localName: 'A', fileName: 'A' }, - })).toEqual({ + })).resolves.toEqual({ A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, parameters: [ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', @@ -64,14 +67,13 @@ describe('ParameterResolver', () => { }); it('should ignore interfaces', async() => { - expect(await loader.resolveAllConstructorParameters({ + await expect(loader.resolveAllConstructorParameters({ A: { + classLoaded: { type: 'interface', localName: 'A', fileName: 'A' }, parameters: [ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', @@ -79,45 +81,368 @@ describe('ParameterResolver', () => { }, ], }, - }, { - A: { type: 'interface', localName: 'A', fileName: 'A' }, - })).toEqual({}); + })).resolves.toEqual({}); }); }); describe('resolveConstructorParameters', () => { - const classReference: ClassLoaded = { localName: 'A', fileName: 'A' }; + const classLoaded: ClassLoaded = { localName: 'A', fileName: 'A' }; it('should handle an empty array', async() => { - expect(await loader.resolveConstructorParameters({ parameters: []}, classReference)) - .toEqual({ parameters: []}); + await expect(loader.resolveConstructorParameters({ + classLoaded, + parameters: [], + })).resolves.toEqual({ + classLoaded, + parameters: [], + }); }); it('should handle a raw parameter', async() => { - expect(await loader.resolveConstructorParameters({ parameters: [ - { - type: 'field', - name: 'fieldA', - unique: true, - required: true, - range: { - type: 'raw', - value: 'boolean', - }, - }, - ]}, classReference)) - .toEqual({ parameters: [ + await expect(loader.resolveConstructorParameters({ + classLoaded, + parameters: [ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', }, }, - ]}); + ], + })).resolves + .toEqual({ + classLoaded, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'raw', + value: 'boolean', + }, + }, + ], + }); + }); + }); + + describe('resolveAllGenericTypeParameterData', () => { + it('should handle an empty index', async() => { + await expect(loader.resolveAllGenericTypeParameterData({})).resolves + .toEqual({}); + }); + + it('should handle a non-empty simple index', async() => { + await expect(loader.resolveAllGenericTypeParameterData({ + A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, + genericTypeParameters: [ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'boolean', + }, + }, + ], + }, + })).resolves.toEqual({ + A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, + genericTypeParameters: [ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'boolean', + }, + }, + ], + }, + }); + }); + }); + + describe('resolveGenericTypeParameterData', () => { + const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; + + it('should handle an empty array', async() => { + await expect(loader.resolveGenericTypeParameterData([], classReference, {})).resolves.toEqual([]); + }); + + it('should handle raw generic type parameters', async() => { + await expect(loader.resolveGenericTypeParameterData([ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + }, + { + name: 'C', + default: { + type: 'literal', + value: 3, + }, + }, + ], classReference, {})).resolves.toEqual([ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + }, + { + name: 'C', + default: { + type: 'literal', + value: 3, + }, + }, + ]); + }); + + it('should handle a generic type parameter with class value', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + await expect(loader.resolveGenericTypeParameterData([ + { + name: 'A', + range: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + }, + ], classReference, {})).resolves.toMatchObject([ + { + name: 'A', + range: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + }, + ]); + }); + + it('should handle a generic type parameter with class value with sub-generics', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + await expect(loader.resolveGenericTypeParameterData([ + { + name: 'A', + range: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'B', + }, + { + type: 'raw', + value: 'number', + }, + ], + origin: classReference, + }, + }, + { + name: 'B', + }, + ], classReference, {})).resolves.toMatchObject([ + { + name: 'A', + range: { + type: 'class', + value: { + type: 'class', + localName: 'MyClass', + }, + genericTypeParameterInstances: [ + { + type: 'genericTypeReference', + value: 'B', + }, + { + type: 'raw', + value: 'number', + }, + ], + }, + }, + { + name: 'B', + }, + ]); + }); + + // TODO: also test with generic type instantiation of raw number + }); + + describe('resolveAllMemberParameterData', () => { + it('should handle an empty index', async() => { + await expect(loader.resolveAllMemberParameterData({})).resolves + .toEqual({}); + }); + + it('should handle a non-empty simple index', async() => { + await expect(loader.resolveAllMemberParameterData({ + A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, + members: [ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'boolean', + }, + }, + ], + }, + })).resolves.toEqual({ + A: { + classLoaded: { type: 'class', localName: 'A', fileName: 'A' }, + members: [ + { + name: 'fieldA', + range: { + type: 'raw', + value: 'boolean', + }, + }, + ], + }, + }); + }); + }); + + describe('resolveMemberParameterData', () => { + const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; + + it('should handle an empty array', async() => { + await expect(loader.resolveMemberParameterData([], classReference, {})).resolves.toEqual([]); + }); + + it('should handle raw members', async() => { + await expect(loader.resolveMemberParameterData([ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + }, + ], classReference, {})).resolves.toEqual([ + { + name: 'A', + }, + { + name: 'B', + range: { + type: 'raw', + value: 'number', + }, + }, + ]); + }); + + it('should handle a member with class value', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + await expect(loader.resolveMemberParameterData([ + { + name: 'A', + range: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + }, + ], classReference, {})).resolves.toMatchObject([ + { + name: 'A', + range: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + }, + ]); + }); + + it('should handle a member with class value with sub-generics', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + await expect(loader.resolveMemberParameterData([ + { + name: 'A', + range: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'B', + }, + { + type: 'raw', + value: 'number', + }, + ], + origin: classReference, + }, + }, + { + name: 'B', + }, + ], classReference, {})).resolves.toMatchObject([ + { + name: 'A', + range: { + type: 'class', + value: { + type: 'class', + localName: 'MyClass', + }, + genericTypeParameterInstances: [ + { + type: 'genericTypeReference', + value: 'B', + }, + { + type: 'raw', + value: 'number', + }, + ], + }, + }, + { + name: 'B', + }, + ]); }); }); @@ -125,16 +450,14 @@ describe('ParameterResolver', () => { const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; it('should handle an empty array', async() => { - expect(await loader.resolveParameterData([], classReference)).toEqual([]); + await expect(loader.resolveParameterData([], classReference, {}, new Set())).resolves.toEqual([]); }); it('should handle raw field parameters', async() => { - expect(await loader.resolveParameterData([ + await expect(loader.resolveParameterData([ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', @@ -143,19 +466,15 @@ describe('ParameterResolver', () => { { type: 'field', name: 'fieldB', - unique: true, - required: true, range: { type: 'raw', value: 'number', }, }, - ], classReference)).toEqual([ + ], classReference, {}, new Set())).resolves.toEqual([ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'raw', value: 'boolean', @@ -164,8 +483,6 @@ describe('ParameterResolver', () => { { type: 'field', name: 'fieldB', - unique: true, - required: true, range: { type: 'raw', value: 'number', @@ -175,7 +492,7 @@ describe('ParameterResolver', () => { }); it('should handle a raw index parameters', async() => { - expect(await loader.resolveParameterData([ + await expect(loader.resolveParameterData([ { type: 'index', domain: 'string', @@ -184,7 +501,7 @@ describe('ParameterResolver', () => { value: 'boolean', }, }, - ], classReference)).toEqual([ + ], classReference, {}, new Set())).resolves.toEqual([ { type: 'index', domain: 'string', @@ -201,23 +518,21 @@ describe('ParameterResolver', () => { 'A.d.ts': `export * from './MyClass'`, 'MyClass.d.ts': `export class MyClass{}`, }; - expect(await loader.resolveParameterData([ + await expect(loader.resolveParameterData([ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'interface', value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, }, }, - ], classReference)).toMatchObject([ + ], classReference, {}, new Set())).resolves.toMatchObject([ { type: 'field', name: 'fieldA', - unique: true, - required: true, range: { type: 'class', value: { localName: 'MyClass', fileName: 'MyClass' }, @@ -231,16 +546,18 @@ describe('ParameterResolver', () => { 'A.d.ts': `export * from './MyClass'`, 'MyClass.d.ts': `export class MyClass{}`, }; - expect(await loader.resolveParameterData([ + await expect(loader.resolveParameterData([ { type: 'index', domain: 'string', range: { type: 'interface', value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, }, }, - ], classReference)).toMatchObject([ + ], classReference, {}, new Set())).resolves.toMatchObject([ { type: 'index', domain: 'string', @@ -253,27 +570,302 @@ describe('ParameterResolver', () => { }); }); - describe('resolveRange', () => { - const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; - - it('should not modify a raw range', async() => { - expect(await loader.resolveRange({ - type: 'raw', - value: 'boolean', - }, classReference)).toEqual({ - type: 'raw', - value: 'boolean', - }); + describe('resolveAllExtensionData', () => { + it('should handle an empty index', async() => { + await expect(loader.resolveAllExtensionData({}, {})).resolves + .toEqual({}); }); - it('should not modify an override range', async() => { - expect(await loader.resolveRange({ - type: 'override', - value: 'boolean', - }, classReference)).toEqual({ - type: 'override', - value: 'boolean', - }); + it('should handle a non-empty simple index', async() => { + const iface1 = {}; + const iface2 = {}; + await expect(loader.resolveAllExtensionData({ + A: [ + { + classLoaded: iface1, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ], + }, { + A: { type: 'class', localName: 'A', fileName: 'A' }, + })).resolves.toEqual({ + A: [ + { + classLoaded: iface1, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ], + }); + }); + }); + + describe('resolveExtensionData', () => { + const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; + + it('should handle an empty array', async() => { + await expect(loader.resolveExtensionData([], classReference, {})).resolves.toEqual([]); + }); + + it('should handle empty generic type instantiations', async() => { + const iface1 = {}; + const iface2 = {}; + await expect(loader.resolveExtensionData([ + { + classLoaded: iface1, + genericTypeInstantiations: [], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [], + }, + ], classReference, {})).resolves.toEqual([ + { + classLoaded: iface1, + genericTypeInstantiations: [], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [], + }, + ]); + }); + + it('should handle raw generic type instantiations', async() => { + const iface1 = {}; + const iface2 = {}; + await expect(loader.resolveExtensionData([ + { + classLoaded: iface1, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ], classReference, {})).resolves.toEqual([ + { + classLoaded: iface1, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'string', + }, + ], + }, + { + classLoaded: iface2, + genericTypeInstantiations: [ + { + type: 'raw', + value: 'number', + }, + ], + }, + ]); + }); + }); + + describe('hashParameterRangeUnresolved', () => { + it('should hash undefined', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'undefined' })) + .toBe('undefined'); + }); + + it('should hash wildcard', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'wildcard' })) + .toBe('wildcard'); + }); + + it('should hash interface', () => { + expect(loader.hashParameterRangeUnresolved( { type: 'interface', value: 'IFACE' })) + .toBe('interface:IFACE'); + }); + + it('should hash genericTypeReference', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'genericTypeReference', value: 'val' })) + .toBe('genericTypeReference:val'); + }); + + it('should hash raw', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'raw', value: 'boolean' })) + .toBe('raw:boolean'); + }); + + it('should hash literal', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'literal', value: 'val' })) + .toBe('literal:val'); + }); + + it('should hash override', () => { + expect(loader.hashParameterRangeUnresolved({ type: 'override', value: 'val' })) + .toBe('override:val'); + }); + + it('should hash union', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'union', + elements: [ + { type: 'raw', value: 'boolean' }, + { type: 'raw', value: 'number' }, + ], + })) + .toBe('union:[raw:boolean,raw:number]'); + }); + + it('should hash intersection', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'intersection', + elements: [ + { type: 'raw', value: 'boolean' }, + { type: 'raw', value: 'number' }, + ], + })) + .toBe('intersection:[raw:boolean,raw:number]'); + }); + + it('should hash tuple', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'tuple', + elements: [ + { type: 'raw', value: 'boolean' }, + { type: 'raw', value: 'number' }, + ], + })) + .toBe('tuple:[raw:boolean,raw:number]'); + }); + + it('should hash rest', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'rest', + value: { type: 'raw', value: 'boolean' }, + })) + .toBe('rest:[raw:boolean]'); + }); + + it('should hash array', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'array', + value: { type: 'raw', value: 'boolean' }, + })) + .toBe('array:[raw:boolean]'); + }); + + it('should hash keyof', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'keyof', + value: { type: 'raw', value: 'boolean' }, + })) + .toBe('keyof:[raw:boolean]'); + }); + + it('should hash typeof', () => { + expect(loader.hashParameterRangeUnresolved( { + type: 'typeof', + value: 'CLASS', + })) + .toBe('typeof:CLASS'); + }); + + it('should hash hash', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'hash', + value: { a: 'b' }, + })) + .toBe('hash:{"a":"b"}'); + }); + + it('should hash index', () => { + expect(loader.hashParameterRangeUnresolved({ + type: 'indexed', + object: { type: 'raw', value: 'boolean' }, + index: { type: 'raw', value: 'string' }, + })) + .toBe('indexed:[raw:boolean;raw:string]'); + }); + }); + + describe('resolveRange', () => { + const classReference: ClassReferenceLoaded = { localName: 'A', fileName: 'A' }; + + it('should not modify a raw range', async() => { + await expect(loader.resolveRange({ + type: 'raw', + value: 'boolean', + }, classReference, {}, true, new Set())).resolves.toEqual({ + type: 'raw', + value: 'boolean', + }); + }); + + it('should not modify an override range', async() => { + await expect(loader.resolveRange({ + type: 'override', + value: 'boolean', + }, classReference, {}, true, new Set())).resolves.toEqual({ + type: 'override', + value: 'boolean', + }); + }); + + it('should not modify a literal range', async() => { + await expect(loader.resolveRange({ + type: 'literal', + value: 'abc', + }, classReference, {}, true, new Set())).resolves.toEqual({ + type: 'literal', + value: 'abc', + }); + }); + + it('should handle a hash range', async() => { + await expect(loader.resolveRange({ + type: 'hash', + value: { + type: AST_NODE_TYPES.TSTypeLiteral, + members: [], + }, + }, classReference, {}, true, new Set())).resolves.toEqual({ + type: 'nested', + value: [], + }); }); it('should handle an interface range pointing to a class', async() => { @@ -281,103 +873,805 @@ describe('ParameterResolver', () => { 'A.d.ts': `export * from './MyClass'`, 'MyClass.d.ts': `export class MyClass{}`, }; - expect(await loader.resolveRange({ + await expect(loader.resolveRange({ type: 'interface', value: 'MyClass', - }, classReference)).toMatchObject({ + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ type: 'class', value: { localName: 'MyClass', fileName: 'MyClass' }, }); }); + it('should handle an interface range pointing to a class with another origin', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + 'OtherClass.d.ts': `export class OtherClass{}`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'OtherClass', + genericTypeParameterInstantiations: [], + origin: { localName: 'OtherClass', fileName: 'OtherClass' }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'class', + value: { localName: 'OtherClass', fileName: 'OtherClass' }, + }); + }); + it('should handle an ignored interface range pointing to a class', async() => { ignoreClasses.MyClass = true; resolutionContext.contentsOverrides = { 'A.d.ts': `export * from './MyClass'`, 'MyClass.d.ts': `export class MyClass{}`, }; - expect(await loader.resolveRange({ + await expect(loader.resolveRange({ + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'wildcard', + }); + }); + + it('should handle an ignored interface range pointing to a class with qualified path', async() => { + ignoreClasses['a.MyClass'] = true; + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'MyClass', + qualifiedPath: [ 'a' ], + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'wildcard', + }); + }); + + it('should handle an interface range pointing to an implicit class', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export interface MyClass{ + constructor(); +}`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }); + }); + + it('should handle an interface range pointing to an interface', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyInterface'`, + 'MyInterface.d.ts': `export interface MyInterface{ + fieldA: string; +}`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'MyInterface', + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [ + { + name: 'fieldA', + range: { type: 'raw', value: 'string' }, + }, + ], + }); + }); + + it('should handle an interface range pointing to a extended interface that is ignored', async() => { + ignoreClasses.IgnoredInterface = true; + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyInterface'`, + 'MyInterface.d.ts': ` +export interface MyInterface extends IgnoredInterface{}; +`, + }; + await expect(loader.resolveRange({ type: 'interface', + value: 'MyInterface', + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [], + }); + }); + + it('should handle a wildcard range', async() => { + await expect(loader.resolveRange({ + type: 'wildcard', + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'wildcard', + }); + }); + + it('should handle an undefined range', async() => { + await expect(loader.resolveRange({ + type: 'undefined', + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'undefined', + }); + }); + + it('should handle a union range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'union', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + ], + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'union', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + ], + }); + }); + + it('should handle an intersection range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'intersection', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + ], + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'intersection', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + ], + }); + }); + + it('should handle a tuple range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + ], + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'raw', + value: 'number', + }, + { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + ], + }); + }); + + it('should handle a tuple range with rest type', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'rest', + value: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + }, + ], + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'tuple', + elements: [ + { + type: 'raw', + value: 'boolean', + }, + { + type: 'rest', + value: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + }, + ], + }); + }); + + it('should handle an array range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'array', + value: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'array', + value: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + }); + }); + + it('should handle a genericTypeReference range', async() => { + await expect(loader.resolveRange({ + type: 'genericTypeReference', + value: 'T', + }, classReference, {}, true, new Set())).resolves.toEqual({ + type: 'genericTypeReference', + value: 'T', + origin: classReference, + }); + }); + + it('should handle a generic range within an interface and remap generic types', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +interface IFace { + fieldA: AInner; + fieldB: BInner; +} +`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'IFace', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'AOuter', + }, + { + type: 'genericTypeReference', + value: 'BOuter', + }, + ], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'genericTypeReference', + value: 'AOuter', + origin: classReference, + }, + }, + { + type: 'field', + name: 'fieldB', + range: { + type: 'genericTypeReference', + value: 'BOuter', + origin: classReference, + }, + }, + ], + }); + }); + + it('should handle a generic range within a nested interface and remap generic types', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +interface IFace1 { + fieldA: IFace2; +} +interface IFace2 { + fieldB: AInner2; +} +`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'IFace1', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'AOuter', + }, + ], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldB', + range: { + type: 'genericTypeReference', + value: 'AOuter', + origin: classReference, + }, + }, + ], + }, + }, + ], + }); + }); + + it('should handle a generic range within a simple type alias', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +type Type = IFaceA; +interface IFaceA { + fieldA: AInner; +} +`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'Type', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'AOuter', + }, + ], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'genericTypeReference', + value: 'AOuter', + origin: classReference, + }, + }, + ], + }); + }); + + it('should handle a generic range within a type alias to union type', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +type Type = IFaceA | IFaceB; +interface IFaceA { + fieldA: AInner; +} +interface IFaceB { + fieldB: AInner; +} +`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'Type', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'AOuter', + }, + ], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'union', + elements: [ + { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'genericTypeReference', + value: 'AOuter', + origin: { + localName: 'Type', + }, + }, + }, + ], + }, + { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldB', + range: { + type: 'genericTypeReference', + value: 'AOuter', + origin: { + localName: 'Type', + }, + }, + }, + ], + }, + ], + }); + }); + + it('should handle a generic range within a class and remap generic types', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +class MyInnerClass { + constructor(fieldA: AInner, fieldB: BInner){} +} +`, + }; + await expect(loader.resolveRange({ + type: 'interface', + value: 'MyInnerClass', + genericTypeParameterInstantiations: [ + { + type: 'genericTypeReference', + value: 'AOuter', + }, + { + type: 'genericTypeReference', + value: 'BOuter', + }, + ], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'class', + value: { localName: 'MyInnerClass', fileName: 'A' }, + genericTypeParameterInstances: [ + { + type: 'genericTypeReference', + value: 'AOuter', + origin: classReference, + }, + { + type: 'genericTypeReference', + value: 'BOuter', + origin: classReference, + }, + ], + }); + }); + + it('should handle a genericTypeReference range with recursive remapping to itself', async() => { + await expect(loader.resolveRange({ + type: 'genericTypeReference', + value: 'T', + }, classReference, { + T: { + type: 'genericTypeReference', + value: 'T', + }, + }, true, new Set())).resolves.toEqual({ + type: 'genericTypeReference', + value: 'T', + origin: classReference, + }); + }); + + it('should handle a keyof range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'keyof', + value: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'keyof', + value: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + }); + }); + + it('should handle a keyof range over a typeof over an enum', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyEnum'`, + 'MyEnum.d.ts': `export enum MyEnum { + keya = 'valuea', + 'keyb' = 'valueb', +}`, + }; + + await expect(loader.resolveRange({ + type: 'keyof', + value: { + type: 'typeof', + value: 'MyEnum', + origin: classReference, + }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'union', + elements: [ + { type: 'literal', value: 'keya' }, + { type: 'literal', value: 'keyb' }, + ], + }); + }); + + it('should throw on a keyof range over a typeof over a non-enum', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass {}`, + }; + + await expect(loader.resolveRange({ + type: 'keyof', + value: { + type: 'typeof', + value: 'MyClass', + origin: classReference, + }, + }, classReference, {}, true, new Set())).rejects + .toThrow(`Detected typeof of unsupported value MyClass in A`); + }); + + it('should throw on a typeof range', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'typeof', value: 'MyClass', - }, classReference)).toMatchObject({ - type: 'undefined', - }); + origin: classReference, + }, classReference, {}, true, new Set())).rejects + .toThrow(`Detected typeof of unsupported value MyClass in A`); }); - it('should handle an interface range pointing to an implicit class', async() => { + it('should handle an interface recursively pointing to itself', async() => { resolutionContext.contentsOverrides = { - 'A.d.ts': `export * from './MyClass'`, - 'MyClass.d.ts': `export interface MyClass{ - constructor(); -}`, + 'A.d.ts': `export interface MyInterface { field: MyInterface; }`, }; - expect(await loader.resolveRange({ + await expect(loader.resolveRange({ type: 'interface', - value: 'MyClass', - }, classReference)).toMatchObject({ - type: 'class', - value: { localName: 'MyClass', fileName: 'MyClass' }, + value: 'MyInterface', + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'nested', + value: [ + { + type: 'field', + name: 'field', + range: { + type: 'class', + value: { localName: 'MyInterface', fileName: 'A' }, + }, + }, + ], }); }); - it('should handle an interface range pointing to an interface', async() => { + it('should handle an interface recursively pointing to itself indirectly', async() => { resolutionContext.contentsOverrides = { - 'A.d.ts': `export * from './MyInterface'`, - 'MyInterface.d.ts': `export interface MyInterface{ - fieldA: string; -}`, + 'A.d.ts': `export interface MyInterface { field: string | MyInterface[]; }`, }; - expect(await loader.resolveRange({ + await expect(loader.resolveRange({ type: 'interface', value: 'MyInterface', - }, classReference)).toMatchObject({ + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ type: 'nested', value: [ { - name: 'fieldA', - range: { type: 'raw', value: 'string' }, - required: true, - unique: true, + type: 'field', + name: 'field', + range: { + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'array', + value: { + type: 'class', + value: { localName: 'MyInterface', fileName: 'A' }, + }, + }, + ], + }, }, ], }); }); - it('should handle an interface range pointing to a extended interface that is ignored', async() => { - ignoreClasses.IgnoredInterface = true; + it('should error on an interface containing a recursive type', async() => { resolutionContext.contentsOverrides = { - 'A.d.ts': `export * from './MyInterface'`, - 'MyInterface.d.ts': ` -export interface MyInterface extends IgnoredInterface{}; -`, + 'A.d.ts': `export interface MyInterface { field: MyType[]; }; +export type MyType = string | MyType[];`, }; - expect(await loader.resolveRange({ + await expect(loader.resolveRange({ type: 'interface', value: 'MyInterface', - }, classReference)).toMatchObject({ - type: 'nested', - value: [], + genericTypeParameterInstantiations: [], + origin: classReference, + }, classReference, {}, true, new Set())).rejects + .toThrow(`Detected unsupported recursive type definition on MyType`); + }); + + it('should handle an indexed range over a generic', async() => { + await expect(loader.resolveRange({ + type: 'indexed', + object: { + type: 'genericTypeReference', + value: 'AOuter', + }, + index: { type: 'literal', value: 'keya' }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'indexed', + object: { + type: 'genericTypeReference', + value: 'AOuter', + }, + index: { type: 'literal', value: 'keya' }, }); }); - it('should handle an undefined range', async() => { - expect(await loader.resolveRange({ - type: 'undefined', - }, classReference)).toMatchObject({ - type: 'undefined', + it('should handle an indexed range over a class', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': `export * from './MyClass'`, + 'MyClass.d.ts': `export class MyClass{}`, + }; + + await expect(loader.resolveRange({ + type: 'indexed', + object: { + type: 'interface', + value: 'MyClass', + genericTypeParameterInstantiations: [], + origin: classReference, + }, + index: { type: 'literal', value: 'keya' }, + }, classReference, {}, true, new Set())).resolves.toMatchObject({ + type: 'indexed', + object: { + type: 'class', + value: { localName: 'MyClass', fileName: 'MyClass' }, + }, + index: { type: 'literal', value: 'keya' }, }); }); }); describe('resolveRangeInterface', () => { - const classReference: ClassReferenceLoaded = { packageName: 'P', localName: 'A', fileName: 'A' }; + const classReference: ClassReferenceLoaded = { + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }; it('should error on a non-existing interface', async() => { resolutionContext.contentsOverrides = { 'A.d.ts': ``, }; - await expect(loader.resolveRangeInterface('IFaceA', classReference)) - .rejects.toThrow(new Error('Could not load class or interface IFaceA from A')); + await expect(loader + .resolveRangeInterface('IFaceA', undefined, undefined, classReference, classReference, {}, true, new Set())) + .rejects.toThrow(new Error('Could not load class or interface or other type IFaceA from A')); }); it('should resolve an empty interface', async() => { @@ -386,7 +1680,17 @@ export interface MyInterface extends IgnoredInterface{}; interface IFaceA {} `, }; - expect(await loader.resolveRangeInterface('IFaceA', classReference)) + await expect(loader + .resolveRangeInterface( + 'IFaceA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves .toEqual({ type: 'nested', value: [], @@ -399,13 +1703,74 @@ interface IFaceA {} class ClassA {} `, }; - expect(await loader.resolveRangeInterface('ClassA', classReference)) + await expect(loader + .resolveRangeInterface( + 'ClassA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves .toMatchObject({ type: 'class', value: { localName: 'ClassA', fileName: 'A' }, }); }); + it('should resolve a class multiple times via cache', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +class ClassA {} +`, + }; + const first = await loader + .resolveRangeInterface( + 'ClassA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + ); + const second = await loader + .resolveRangeInterface( + 'ClassA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + ); + expect(first).toBe(second); + expect([ ...(loader).cacheInterfaceRange.keys() ]).toEqual([ 'ClassA::::::A::true' ]); + }); + + it('should resolve a class multiple times with different generics without cache', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +class ClassA {} +`, + }; + const first = await loader + .resolveRangeInterface('ClassA', undefined, [ + { type: 'raw', value: 'boolean' }, + ], classReference, classReference, {}, true, new Set()); + const second = await loader + .resolveRangeInterface('ClassA', undefined, [ + { type: 'raw', value: 'number' }, + ], classReference, classReference, {}, true, new Set()); + expect(first).not.toBe(second); + expect([ ...( loader).cacheInterfaceRange.keys() ]) + .toEqual([ 'ClassA::::raw:number::A::true', 'ClassA::::raw:boolean::A::true' ]); + }); + it('should resolve an implicit class', async() => { resolutionContext.contentsOverrides = { 'A.d.ts': ` @@ -414,7 +1779,17 @@ interface ClassA { } `, }; - expect(await loader.resolveRangeInterface('ClassA', classReference)) + await expect(loader + .resolveRangeInterface( + 'ClassA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves .toMatchObject({ type: 'class', value: { localName: 'ClassA', fileName: 'A' }, @@ -430,7 +1805,17 @@ interface IFaceA { } `, }; - expect(await loader.resolveRangeInterface('IFaceA', classReference)) + await expect(loader + .resolveRangeInterface( + 'IFaceA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves .toEqual({ type: 'nested', value: [ @@ -441,8 +1826,6 @@ interface IFaceA { type: 'raw', value: 'string', }, - required: true, - unique: true, }, { type: 'field', @@ -451,13 +1834,37 @@ interface IFaceA { type: 'raw', value: 'number', }, - required: true, - unique: true, }, ], }); }); + it('should resolve an interface with raw fields with getNestedFields false', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +interface IFaceA { + fieldA: string; + fieldB: number; +} +`, + }; + await expect(loader + .resolveRangeInterface( + 'IFaceA', + undefined, + undefined, + classReference, + classReference, + {}, + false, + new Set(), + )).resolves + .toMatchObject({ + type: 'class', + value: { localName: 'IFaceA', fileName: 'A' }, + }); + }); + it('should resolve a nested interface', async() => { resolutionContext.contentsOverrides = { 'A.d.ts': ` @@ -469,7 +1876,17 @@ interface IFaceB { } `, }; - expect(await loader.resolveRangeInterface('IFaceA', classReference)) + await expect(loader + .resolveRangeInterface( + 'IFaceA', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves .toEqual({ type: 'nested', value: [ @@ -486,21 +1903,138 @@ interface IFaceB { type: 'raw', value: 'number', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ], }); }); + + it('should resolve a type alias', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +type Type = string | boolean; +`, + }; + await expect(loader + .resolveRangeInterface( + 'Type', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves + .toEqual({ + type: 'union', + elements: [ + { + type: 'raw', + value: 'string', + }, + { + type: 'raw', + value: 'boolean', + }, + ], + }); + }); + + it('should resolve an enum', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +enum Enum { + a = 'A', + b = 'B', +} +`, + }; + await expect(loader + .resolveRangeInterface( + 'Enum', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves + .toEqual({ + type: 'union', + elements: [ + { + type: 'literal', + value: 'A', + }, + { + type: 'literal', + value: 'B', + }, + ], + }); + }); + + it('should resolve an enum value', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +enum Enum { + a = 'A', + b = 'B', +} +`, + }; + await expect(loader + .resolveRangeInterface( + 'a', + [ 'Enum' ], + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )).resolves + .toEqual({ + type: 'literal', + value: 'A', + }); + }); + + it('should throw on an enum without expression', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +enum Enum { + a = 'A', + b, +} +`, + }; + await expect(loader + .resolveRangeInterface( + 'Enum', + undefined, + undefined, + classReference, + classReference, + {}, + true, + new Set(), + )) + .rejects.toThrow(`Detected enum Enum having an unsupported member (member 1) in A`); + }); }); describe('isInterfaceImplicitClass', () => { - const classReference: ClassReference = { packageName: 'P', localName: 'A', fileName: 'A' }; + const classReference: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }; it('should be false on an empty interface', async() => { resolutionContext.contentsOverrides = { @@ -563,21 +2097,26 @@ export interface A{ }); describe('loadClassOrInterfacesChain', () => { - const classReference: ClassReference = { packageName: 'P', localName: 'A', fileName: 'A' }; + const classReference: ClassReference = { + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }; it('should error on a non-existing interface', async() => { resolutionContext.contentsOverrides = { 'A.d.ts': ``, }; await expect(loader.loadClassOrInterfacesChain(classReference)) - .rejects.toThrow(new Error('Could not load class or interface A from A')); + .rejects.toThrow(new Error('Could not load class or interface or other type A from A')); }); it('should load a class', async() => { resolutionContext.contentsOverrides = { 'A.d.ts': `export class A{}`, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', @@ -589,7 +2128,7 @@ export interface A{ resolutionContext.contentsOverrides = { 'A.d.ts': `export interface A{}`, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', @@ -606,21 +2145,71 @@ export interface B{} declare interface C{} `, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', type: 'interface', superInterfaces: [ { - fileName: 'A', - localName: 'B', - type: 'interface', + value: { + fileName: 'A', + localName: 'B', + type: 'interface', + }, }, { - fileName: 'A', - localName: 'C', - type: 'interface', + value: { + fileName: 'A', + localName: 'C', + type: 'interface', + }, + }, + ], + }); + }); + + it('should load an interface with supers with generics', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +export interface A extends B, C{} +export interface B{} +declare interface C{} +`, + }; + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves + .toMatchObject({ + fileName: 'A', + localName: 'A', + type: 'interface', + superInterfaces: [ + { + value: { + fileName: 'A', + localName: 'B', + type: 'interface', + }, + genericTypeInstantiations: { + params: [ + { + type: 'TSStringKeyword', + }, + ], + }, + }, + { + value: { + fileName: 'A', + localName: 'C', + type: 'interface', + }, + genericTypeInstantiations: { + params: [ + { + type: 'TSNumberKeyword', + }, + ], + }, }, ], }); @@ -635,16 +2224,18 @@ export interface B{} declare interface C{} `, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', type: 'interface', superInterfaces: [ { - fileName: 'A', - localName: 'B', - type: 'interface', + value: { + fileName: 'A', + localName: 'B', + type: 'interface', + }, }, ], }); @@ -660,21 +2251,25 @@ export interface A extends B, C{} 'B.d.ts': `export interface B{}`, 'C.d.ts': `export interface C{}`, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', type: 'interface', superInterfaces: [ { - fileName: 'B', - localName: 'B', - type: 'interface', + value: { + fileName: 'B', + localName: 'B', + type: 'interface', + }, }, { - fileName: 'C', - localName: 'C', - type: 'interface', + value: { + fileName: 'C', + localName: 'C', + type: 'interface', + }, }, ], }); @@ -692,23 +2287,70 @@ export interface B extends C{} `, 'C.d.ts': `export interface C{}`, }; - expect(await loader.loadClassOrInterfacesChain(classReference)) + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves .toMatchObject({ fileName: 'A', localName: 'A', type: 'interface', superInterfaces: [ { - fileName: 'B', - localName: 'B', - type: 'interface', - superInterfaces: [ - { - fileName: 'C', - localName: 'C', - type: 'interface', - }, - ], + value: { + fileName: 'B', + localName: 'B', + type: 'interface', + superInterfaces: [ + { + value: { + fileName: 'C', + localName: 'C', + type: 'interface', + }, + }, + ], + }, + }, + ], + }); + }); + + it('should load an interface with super over different files via a qualified path', async() => { + resolutionContext.contentsOverrides = { + 'index.d.ts': ` +import * as a from './A'; +`, + 'A.d.ts': ` +import { B } from './B'; +export interface A extends B {} +`, + 'B.d.ts': ` +import { C } from './C'; +export interface B extends C {} +`, + 'C.d.ts': `export interface C{}`, + }; + await expect(loader.loadClassOrInterfacesChain( + { ...classReference, fileName: 'index', qualifiedPath: [ 'a' ]}, + )).resolves + .toMatchObject({ + fileName: 'A', + localName: 'A', + type: 'interface', + superInterfaces: [ + { + value: { + fileName: 'B', + localName: 'B', + type: 'interface', + superInterfaces: [ + { + value: { + fileName: 'C', + localName: 'C', + type: 'interface', + }, + }, + ], + }, }, ], }); @@ -722,12 +2364,62 @@ export class B{} `, }; await expect(loader.loadClassOrInterfacesChain(classReference)) - .rejects.toThrow(new Error('Detected interface A extending from a class B in A')); + .rejects.toThrow(new Error('Detected interface A extending from a non-interface B in A')); + }); + + it('should load an interface with supers via a type alias', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +export interface A extends B_A, C_A{} +export type B_A = B; +export type C_A = C; +export interface B{} +declare interface C{} +`, + }; + await expect(loader.loadClassOrInterfacesChain(classReference)).resolves + .toMatchObject({ + fileName: 'A', + localName: 'A', + type: 'interface', + superInterfaces: [ + { + value: { + fileName: 'A', + localName: 'B', + type: 'interface', + }, + }, + { + value: { + fileName: 'A', + localName: 'C', + type: 'interface', + }, + }, + ], + }); + }); + + it('should error on an interface extending from a type alias that does not refer to an interface', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +export interface A extends B{} +export type B = number; +`, + }; + await expect(loader.loadClassOrInterfacesChain(classReference)) + .rejects.toThrow(new Error('Detected interface A extending from a non-interface B in A')); }); }); describe('getNestedFieldsFromInterface', () => { - const classReference: ClassReference = { packageName: 'P', localName: 'A', fileName: 'A' }; + const classReference: ClassReferenceLoaded = { + packageName: 'p', + localName: 'A', + fileName: 'A', + fileNameReferenced: 'fileReferenced', + }; it('should handle an empty interface', async() => { resolutionContext.contentsOverrides = { @@ -736,7 +2428,7 @@ export interface A{} `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toEqual([]); }); @@ -749,7 +2441,7 @@ export interface A{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toEqual([ { type: 'field', @@ -758,8 +2450,6 @@ export interface A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ]); }); @@ -776,7 +2466,7 @@ export interface A{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toEqual([ { type: 'field', @@ -785,8 +2475,6 @@ export interface A{ type: 'override', value: 'boolean', }, - required: true, - unique: true, }, ]); }); @@ -802,7 +2490,7 @@ export interface A{ 'B.d.ts': `export class B{}`, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -811,8 +2499,6 @@ export interface A{ type: 'class', value: { localName: 'B', fileName: 'B' }, }, - required: true, - unique: true, }, ]); }); @@ -826,8 +2512,8 @@ export interface A{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - await expect(loader.getNestedFieldsFromInterface(iface)) - .rejects.toThrow(new Error('Could not load class or interface B from A')); + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())) + .rejects.toThrow(new Error('Could not load class or interface or other type B from A')); }); it('should error on an interface with a non-existing class field', async() => { @@ -841,8 +2527,8 @@ export interface A{ 'B.d.ts': `export class X{}`, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - await expect(loader.getNestedFieldsFromInterface(iface)) - .rejects.toThrow(new Error('Could not load class or interface B from B')); + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())) + .rejects.toThrow(new Error('Could not load class or interface or other type B from B')); }); it('should handle an interface with an empty interface field', async() => { @@ -856,7 +2542,7 @@ export interface A{ 'B.d.ts': `export interface B{}`, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -865,8 +2551,6 @@ export interface A{ type: 'nested', value: [], }, - required: true, - unique: true, }, ]); }); @@ -886,7 +2570,7 @@ export interface B{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -900,13 +2584,9 @@ export interface B{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); @@ -923,7 +2603,7 @@ export interface B{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -937,13 +2617,9 @@ export interface B{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); @@ -970,7 +2646,7 @@ export interface C{ `, }; const iface = await loader.loadClassOrInterfacesChain(classReference); - expect(await loader.getNestedFieldsFromInterface(iface)) + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -991,8 +2667,6 @@ export interface C{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, { type: 'field', @@ -1001,35 +2675,58 @@ export interface C{ type: 'raw', value: 'number', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, + }, + ]); + }); + + it('should handle an interface with a generic type reference', async() => { + resolutionContext.contentsOverrides = { + 'A.d.ts': ` +export interface A{ + fieldA: T; +} +`, + }; + const iface = await loader.loadClassOrInterfacesChain(classReference); + await expect(loader.getNestedFieldsFromInterface(iface, classReference, {}, new Set())).resolves + .toEqual([ + { + type: 'field', + name: 'fieldA', + range: { + type: 'genericTypeReference', + value: 'T', + origin: classReference, + }, }, ]); }); }); describe('getNestedFieldsFromHash', () => { - const classReference: ClassReference = { packageName: 'P', localName: 'A', fileName: 'file' }; + const classReference: ClassReference = { + packageName: 'P', + localName: 'A', + fileName: 'file', + fileNameReferenced: 'fileReferenced', + }; async function getHash(definition: string, prefix = ''): - Promise<{ hash: TSTypeLiteral; owningClass: ClassReferenceLoaded }> { + Promise<{ hash: TSESTree.TSTypeLiteral; owningClass: ClassReferenceLoaded }> { resolutionContext.contentsOverrides['file.d.ts'] = ` ${prefix} export class A{ constructor(fieldA: ${definition}) {} }`; - const classLoaded = await classLoader.loadClassDeclaration(classReference, false); - const hash: TSTypeLiteral = ( ( new ConstructorLoader().getConstructor(classLoaded)) + const classLoaded = await classLoader.loadClassDeclaration(classReference, false, false); + const hash: TSESTree.TSTypeLiteral = ( (new ConstructorLoader({ parameterLoader }) + .getConstructor({ value: classLoaded })!.constructor) .value.params[0]).typeAnnotation.typeAnnotation; return { hash, owningClass: classLoaded }; @@ -1037,7 +2734,7 @@ export class A{ it('should handle an empty hash', async() => { const { hash, owningClass } = await getHash(`{}`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toEqual([]); }); @@ -1045,7 +2742,7 @@ export class A{ const { hash, owningClass } = await getHash(`{ fieldA: string; }`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toEqual([ { type: 'field', @@ -1054,8 +2751,6 @@ export class A{ type: 'raw', value: 'string', }, - required: true, - unique: true, }, ]); }); @@ -1067,7 +2762,7 @@ export class A{ */ fieldA: string; }`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toEqual([ { type: 'field', @@ -1076,8 +2771,6 @@ export class A{ type: 'override', value: 'boolean', }, - required: true, - unique: true, }, ]); }); @@ -1089,7 +2782,7 @@ export class A{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`, `import {B} from './B';`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1098,8 +2791,6 @@ export class A{ type: 'class', value: { localName: 'B', fileName: 'B' }, }, - required: true, - unique: true, }, ]); }); @@ -1108,8 +2799,8 @@ export class A{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`); - await expect(loader.getNestedFieldsFromHash(hash, owningClass)) - .rejects.toThrow(new Error('Could not load class or interface B from file')); + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())) + .rejects.toThrow(new Error('Could not load class or interface or other type B from file')); }); it('should error on a hash with a non-existing class field', async() => { @@ -1119,8 +2810,8 @@ export class A{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`, `import {B} from './B';`); - await expect(loader.getNestedFieldsFromHash(hash, owningClass)) - .rejects.toThrow(new Error('Could not load class or interface B from B')); + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())) + .rejects.toThrow(new Error('Could not load class or interface or other type B from B')); }); it('should handle a hash with an empty interface field', async() => { @@ -1130,7 +2821,7 @@ export class A{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`, `import {B} from './B';`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1139,8 +2830,6 @@ export class A{ type: 'nested', value: [], }, - required: true, - unique: true, }, ]); }); @@ -1156,7 +2845,7 @@ export interface B{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`, `import {B} from './B';`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1170,13 +2859,9 @@ export interface B{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); @@ -1187,7 +2872,7 @@ export interface B{ }`, `export interface B{ fieldB: boolean; }`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1201,13 +2886,9 @@ export interface B{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); @@ -1230,7 +2911,7 @@ export interface C{ const { hash, owningClass } = await getHash(`{ fieldA: B; }`, `import {B} from './B';`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1251,8 +2932,6 @@ export interface C{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, { type: 'field', @@ -1261,18 +2940,12 @@ export interface C{ type: 'raw', value: 'number', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); @@ -1286,7 +2959,7 @@ export interface C{ }, }, }`); - expect(await loader.getNestedFieldsFromHash(hash, owningClass)) + await expect(loader.getNestedFieldsFromHash(hash, owningClass, {}, new Set())).resolves .toMatchObject([ { type: 'field', @@ -1307,8 +2980,6 @@ export interface C{ type: 'raw', value: 'boolean', }, - required: true, - unique: true, }, { type: 'field', @@ -1317,18 +2988,12 @@ export interface C{ type: 'raw', value: 'number', }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ], }, - required: true, - unique: true, }, ]); }); diff --git a/test/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.test.ts b/test/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.test.ts index 49642c7..6c35660 100644 --- a/test/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.test.ts +++ b/test/parse/typereferenceoverride/TypeReferenceOverrideAliasRecord.test.ts @@ -55,7 +55,7 @@ describe('TypeReferenceOverrideAliasRecord', () => { type: AST_NODE_TYPES.Identifier, name: 'Record', }, - typeParameters: { + typeArguments: { params: [ 'TYPE0', 'TYPE1', diff --git a/test/resolution/ExternalModulesLoader.test.ts b/test/resolution/ExternalModulesLoader.test.ts index e03e008..2f4ab80 100644 --- a/test/resolution/ExternalModulesLoader.test.ts +++ b/test/resolution/ExternalModulesLoader.test.ts @@ -1,34 +1,28 @@ import type { RdfObjectLoader, Resource } from 'rdf-object'; - import type { ClassIndex, ClassLoaded } from '../../lib/parse/ClassIndex'; import type { ConstructorData } from '../../lib/parse/ConstructorLoader'; import type { ParameterRangeResolved } from '../../lib/parse/ParameterLoader'; +import type { PackageMetadataScope } from '../../lib/resolution/ExternalModulesLoader'; import { ExternalModulesLoader } from '../../lib/resolution/ExternalModulesLoader'; +import { ResolutionContextMocked } from '../ResolutionContextMocked'; +let packageJsons: Record = {}; let loadComponentResources: (componentResources: Record, objectLoader: RdfObjectLoader) => void; -jest.mock('componentsjs', () => ({ - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - ...jest.requireActual('componentsjs'), +// eslint-disable-next-line ts/no-unnecessary-type-assertion +jest.mock('componentsjs', () => ({ + ...jest.requireActual('componentsjs'), ModuleStateBuilder: jest.fn().mockImplementation(() => ({ buildNodeModuleImportPaths: () => [ '/path/1/', '/path/2/' ], - buildPackageJsons: () => ({ - package1: { - name: 'package1', - 'lsd:contexts': { - 'http://example.org/context1': true, - }, - }, - package2: { - name: 'package2', - 'lsd:contexts': { - 'http://example.org/context2': true, - }, - }, - }), + buildPackageJsons(nodeModulePaths: string[]) { + return Object.fromEntries(Object.entries(packageJsons) + .filter(([ key, value ]) => nodeModulePaths.includes(value.path))); + }, preprocessPackageJsons: jest.fn(), - buildComponentModules: () => ({ - type: 'componentModules', - }), + buildComponentModules(packageJsonsArg: Record) { + return Object.fromEntries(Object.entries(packageJsonsArg) + .filter(([ key, value ]) => value['lsd:module']) + .map(([ key, value ]) => [ value['lsd:module'], value ])); + }, buildComponentContexts: () => ({ type: 'contexts', }), @@ -46,14 +40,36 @@ jest.mock('componentsjs', () => ({ describe('ExternalModulesLoader', () => { let logger: any; + let resolutionContext: ResolutionContextMocked; + let packagesBeingGenerated: Record; let loader: ExternalModulesLoader; let req: any; beforeEach(() => { + packageJsons = { + package1: { + name: 'package1', + path: '/path/1/package1', + 'lsd:module': 'urn:package1', + 'lsd:contexts': { + 'http://example.org/context1': true, + }, + }, + package2: { + name: 'package2', + path: '/path/1/package2', + 'lsd:module': 'urn:package2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + }; logger = { info: jest.fn(), warn: jest.fn(), }; + resolutionContext = new ResolutionContextMocked({}); + packagesBeingGenerated = {}; loader = new ExternalModulesLoader({ pathDestination: { packageRootDirectory: '/', @@ -69,10 +85,16 @@ describe('ExternalModulesLoader', () => { importPaths: {}, typesPath: '', }, + packagesBeingGenerated, + resolutionContext, + debugState: false, logger, }); req = { resolve(id: string, { paths }: any) { + if (id.includes('invalid')) { + throw new Error('invalid package'); + } return paths[0] + id; }, }; @@ -144,9 +166,11 @@ describe('ExternalModulesLoader', () => { localName: 'Class1', packageName: 'package1', superClass: { - type: 'class', - localName: 'Class2', - packageName: 'package2', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, }, }, Class3: { @@ -154,9 +178,11 @@ describe('ExternalModulesLoader', () => { localName: 'Class1', packageName: 'package2', superClass: { - type: 'class', - localName: 'Class4', - packageName: 'my-package', + value: { + type: 'class', + localName: 'Class4', + packageName: 'my-package', + }, }, }, }; @@ -175,9 +201,11 @@ describe('ExternalModulesLoader', () => { packageName: 'package1', implementsInterfaces: [ { - type: 'interface', - localName: 'Interface2', - packageName: 'package2', + value: { + type: 'interface', + localName: 'Interface2', + packageName: 'package2', + }, }, ], }, @@ -187,9 +215,11 @@ describe('ExternalModulesLoader', () => { packageName: 'package2', implementsInterfaces: [ { - type: 'interface', - localName: 'Interface4', - packageName: 'my-package', + value: { + type: 'interface', + localName: 'Interface4', + packageName: 'my-package', + }, }, ], }, @@ -252,6 +282,40 @@ describe('ExternalModulesLoader', () => { .toEqual([]); }); + it('should ignore wildcard constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'wildcard', + value: 'ignored', + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([]); + }); + + it('should ignore genericTypeReference constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'genericTypeReference', + value: 'T', + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([]); + }); + it('should handle class constructor parameters', () => { const constructors: ClassIndex> = { Class1: { @@ -320,14 +384,255 @@ describe('ExternalModulesLoader', () => { expect(loader.findExternalPackages({}, constructors)) .toEqual([ 'package1', 'package2' ]); }); + + it('should handle union constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'union', + elements: [ + { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + { + type: 'class', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + }, + ], + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1', 'package2' ]); + }); + + it('should handle intersection constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'intersection', + elements: [ + { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + { + type: 'class', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + }, + ], + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1', 'package2' ]); + }); + + it('should handle tuple constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'tuple', + elements: [ + { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + { + type: 'class', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + }, + ], + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1', 'package2' ]); + }); + + it('should handle tuple constructor parameters with rest type', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'tuple', + elements: [ + { + type: 'rest', + value: { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + }, + { + type: 'class', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + }, + ], + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1', 'package2' ]); + }); + + it('should ignore components in packages that are being generated', () => { + const classIndex: ClassIndex = { + Class1: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + Class2: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + Class3: { + type: 'class', + localName: 'Class3', + packageName: 'package3', + }, + Class4: { + type: 'class', + localName: 'Class4', + packageName: 'my-package', + }, + }; + packagesBeingGenerated.package1 = true; + packagesBeingGenerated.package3 = true; + expect(loader.findExternalPackages(classIndex, {})) + .toEqual([ + 'package2', + ]); + }); + + it('should handle array constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'array', + value: { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1' ]); + }); + + it('should handle indexed constructor parameters', () => { + const constructors: ClassIndex> = { + Class1: { + parameters: [ + { + range: { + type: 'indexed', + object: { + type: 'class', + value: { + type: 'class', + localName: 'Class1', + packageName: 'package1', + }, + }, + index: { + type: 'class', + value: { + type: 'class', + localName: 'Class2', + packageName: 'package2', + }, + }, + }, + }, + ], + }, + }; + expect(loader.findExternalPackages({}, constructors)) + .toEqual([ 'package1', 'package2' ]); + }); }); describe('buildModuleStateSelective', () => { it('should create a module state', async() => { - expect(await loader.buildModuleStateSelective(req, [ 'package1', 'package2' ])) + await expect(loader.buildModuleStateSelective(req, [ 'package1', 'package2' ])).resolves .toEqual({ componentModules: { - type: 'componentModules', + 'urn:package1': { + name: 'package1', + path: '/path/1/package1', + 'lsd:module': 'urn:package1', + 'lsd:contexts': { + 'http://example.org/context1': true, + }, + }, + 'urn:package2': { + name: 'package2', + path: '/path/1/package2', + 'lsd:module': 'urn:package2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, }, contexts: { type: 'contexts', @@ -344,19 +649,291 @@ describe('ExternalModulesLoader', () => { '/path/1/package1', '/path/1/package2', ], + packageJsons, + }); + }); + + it('should create a module state for nested dependencies', async() => { + packageJsons = { + package1: { + name: 'package1', + path: '/path/1/package1', + 'lsd:module': 'urn:package1', + 'lsd:contexts': { + 'http://example.org/context1': true, + }, + }, + package2: { + name: 'package2', + path: '/path/1/package2', + 'lsd:module': 'urn:package2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + package3: { + name: 'package3', + path: '/path/1/package3', + 'lsd:module': 'urn:package3', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + dependencies: { + 'package3-1': 'ANY', + 'package3-2': 'ANY', + 'package3-3': 'ANY', + }, + }, + 'package3-1': { + name: 'package3-1', + path: '/path/1/package3-1', + 'lsd:module': 'urn:package3-1', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-2': { + name: 'package3-2', + path: '/path/1/package3-2', + 'lsd:module': 'urn:package3-2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + dependencies: { + 'package3-2-1': 'ANY', + 'package3-2-2': 'ANY', + 'package3-2-3': 'ANY', + }, + }, + 'package3-3': { + name: 'package3-3', + path: '/path/1/package3-3', + 'lsd:module': 'urn:package3-3', + dependencies: { + 'package3-3-ignored': 'ANY', + }, + }, + 'package3-2-1': { + name: 'package3-2-1', + path: '/path/1/package3-2-1', + 'lsd:module': 'urn:package3-2-1', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-2-2': { + name: 'package3-2-2', + path: '/path/1/package3-2-2', + 'lsd:module': 'urn:package3-2-2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-2-3': { + name: 'package3-2-3', + path: '/path/1/package3-2-3', + 'lsd:module': 'urn:package3-2-3', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-3-ignored': { + name: 'package3-3-ignored', + path: '/path/1/package3-3-ignored', + dependencies: { + 'package3-3-ignored-1': 'ANY', + }, + }, + 'package3-3-ignored-1': { + name: 'package3-3-ignored-1', + path: '/path/1/package3-3-ignored-1', + }, + }; + + await expect(loader.buildModuleStateSelective(req, [ 'package1', 'package3' ])).resolves + .toEqual({ + componentModules: { + 'urn:package1': { + 'lsd:contexts': { + 'http://example.org/context1': true, + }, + 'lsd:module': 'urn:package1', + name: 'package1', + path: '/path/1/package1', + }, + 'urn:package3': { + dependencies: { + 'package3-1': 'ANY', + 'package3-2': 'ANY', + 'package3-3': 'ANY', + }, + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3', + name: 'package3', + path: '/path/1/package3', + }, + 'urn:package3-1': { + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3-1', + name: 'package3-1', + path: '/path/1/package3-1', + }, + 'urn:package3-2': { + dependencies: { + 'package3-2-1': 'ANY', + 'package3-2-2': 'ANY', + 'package3-2-3': 'ANY', + }, + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3-2', + name: 'package3-2', + path: '/path/1/package3-2', + }, + 'urn:package3-2-1': { + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3-2-1', + name: 'package3-2-1', + path: '/path/1/package3-2-1', + }, + 'urn:package3-2-2': { + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3-2-2', + name: 'package3-2-2', + path: '/path/1/package3-2-2', + }, + 'urn:package3-2-3': { + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + 'lsd:module': 'urn:package3-2-3', + name: 'package3-2-3', + path: '/path/1/package3-2-3', + }, + 'urn:package3-3': { + 'lsd:module': 'urn:package3-3', + name: 'package3-3', + path: '/path/1/package3-3', + dependencies: { + 'package3-3-ignored': 'ANY', + }, + }, + }, + contexts: { + type: 'contexts', + }, + importPaths: { + type: 'importPaths', + }, + mainModulePath: '/', + nodeModuleImportPaths: [ + '/path/1/', + '/path/2/', + ], + nodeModulePaths: [ + '/path/1/package1', + '/path/1/package3', + '/path/1/package3-1', + '/path/1/package3-2', + '/path/1/package3-3', + '/path/1/package3-2-1', + '/path/1/package3-2-2', + '/path/1/package3-2-3', + '/path/1/package3-3-ignored', + ], packageJsons: { package1: { name: 'package1', + path: '/path/1/package1', + 'lsd:module': 'urn:package1', 'lsd:contexts': { 'http://example.org/context1': true, }, }, - package2: { - name: 'package2', + // No package2 + package3: { + name: 'package3', + path: '/path/1/package3', + 'lsd:module': 'urn:package3', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + dependencies: { + 'package3-1': 'ANY', + 'package3-2': 'ANY', + 'package3-3': 'ANY', + }, + }, + 'package3-1': { + name: 'package3-1', + path: '/path/1/package3-1', + 'lsd:module': 'urn:package3-1', 'lsd:contexts': { 'http://example.org/context2': true, }, }, + 'package3-2': { + name: 'package3-2', + path: '/path/1/package3-2', + 'lsd:module': 'urn:package3-2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + dependencies: { + 'package3-2-1': 'ANY', + 'package3-2-2': 'ANY', + 'package3-2-3': 'ANY', + }, + }, + 'package3-3': { + name: 'package3-3', + path: '/path/1/package3-3', + 'lsd:module': 'urn:package3-3', + dependencies: { + 'package3-3-ignored': 'ANY', + }, + }, + 'package3-2-1': { + name: 'package3-2-1', + path: '/path/1/package3-2-1', + 'lsd:module': 'urn:package3-2-1', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-2-2': { + name: 'package3-2-2', + path: '/path/1/package3-2-2', + 'lsd:module': 'urn:package3-2-2', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-2-3': { + name: 'package3-2-3', + path: '/path/1/package3-2-3', + 'lsd:module': 'urn:package3-2-3', + 'lsd:contexts': { + 'http://example.org/context2': true, + }, + }, + 'package3-3-ignored': { + name: 'package3-3-ignored', + path: '/path/1/package3-3-ignored', + dependencies: { + 'package3-3-ignored-1': 'ANY', + }, + }, + // No 'package3-3-ignored-1' }, }); }); @@ -370,11 +947,20 @@ describe('ExternalModulesLoader', () => { '/path/to/package2', ]); }); + + it('should ignore invalid packages', () => { + expect(loader.buildNodeModulePathsSelective(req, [ '/path/to/' ], [ 'package1', 'invalid' ])) + .toEqual([ + '/path/to/package1', + ]); + expect(logger.warn).toHaveBeenCalledTimes(1); + expect(logger.warn).toHaveBeenLastCalledWith(`Ignoring invalid package "invalid": invalid package`); + }); }); describe('loadExternalComponents', () => { it('should load external components', async() => { - expect(await loader.loadExternalComponents(req, [ 'package1', 'package2' ])) + await expect(loader.loadExternalComponents(req, [ 'package1', 'package2' ])).resolves .toEqual({ components: { package1: { @@ -396,8 +982,49 @@ describe('ExternalModulesLoader', () => { }, }, moduleState: expect.anything(), + packagesBeingGenerated, + }); + expect(logger.warn).not.toHaveBeenCalled(); + expect(resolutionContext.contentsOverrides).toEqual({}); + }); + + it('should load handle components with multiple modules', async() => { + loadComponentResources = (componentResources, objectLoader) => { + componentResources.Component1 = objectLoader.createCompactedResource({ + '@id': 'urn:Component1', + module: [ + { requireName: '"package1"' }, + { requireName: '"package2"' }, + ], + requireElement: '"Component1"', + }); + }; + + await expect(loader.loadExternalComponents(req, [ 'package1', 'package2' ])).resolves + .toEqual({ + components: { + package1: { + contextIris: [ + 'http://example.org/context1', + ], + componentNamesToIris: { + Component1: 'urn:Component1', + }, + }, + package2: { + contextIris: [ + 'http://example.org/context2', + ], + componentNamesToIris: { + Component1: 'urn:Component1', + }, + }, + }, + moduleState: expect.anything(), + packagesBeingGenerated, }); expect(logger.warn).not.toHaveBeenCalled(); + expect(resolutionContext.contentsOverrides).toEqual({}); }); it('should warn on components without a package.json', async() => { @@ -410,12 +1037,66 @@ describe('ExternalModulesLoader', () => { requireElement: '"Component1"', }); }; - expect(await loader.loadExternalComponents(req, [ 'package3' ])) + await expect(loader.loadExternalComponents(req, [ 'package3' ])).resolves .toEqual({ components: {}, moduleState: expect.anything(), + packagesBeingGenerated, }); expect(logger.warn).toHaveBeenCalledWith('Could not find a package.json for \'package3\''); + expect(resolutionContext.contentsOverrides).toEqual({}); + }); + + it('should dump the state when debugState is true', async() => { + loader = new ExternalModulesLoader({ + pathDestination: { + packageRootDirectory: '/', + originalPath: '/src', + replacementPath: '/components', + }, + packageMetadata: { + name: 'my-package', + version: '2.3.4', + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/', + componentsPath: 'components', + contexts: {}, + importPaths: {}, + typesPath: '', + }, + packagesBeingGenerated, + resolutionContext, + debugState: true, + logger, + }); + + await expect(loader.loadExternalComponents(req, [ 'package1', 'package2' ])).resolves + .toEqual({ + components: { + package1: { + contextIris: [ + 'http://example.org/context1', + ], + componentNamesToIris: { + Component1: 'urn:Component1', + }, + }, + package2: { + contextIris: [ + 'http://example.org/context2', + ], + componentNamesToIris: { + Component2: 'urn:Component2', + Component3: 'urn:Component3', + }, + }, + }, + moduleState: expect.anything(), + packagesBeingGenerated, + }); + expect(logger.warn).not.toHaveBeenCalled(); + expect(resolutionContext.contentsOverrides).toEqual({ + 'componentsjs-generator-debug-state.json': `{\n "externalPackages": [\n "package1",\n "package2"\n ],\n "moduleState": {\n "mainModulePath": "/",\n "componentModules": {\n "urn:package1": {\n "name": "package1",\n "path": "/path/1/package1",\n "lsd:module": "urn:package1",\n "lsd:contexts": {\n "http://example.org/context1": true\n }\n },\n "urn:package2": {\n "name": "package2",\n "path": "/path/1/package2",\n "lsd:module": "urn:package2",\n "lsd:contexts": {\n "http://example.org/context2": true\n }\n }\n },\n "importPaths": {\n "type": "importPaths"\n },\n "contexts": {\n "type": "contexts"\n },\n "nodeModuleImportPaths": [\n "/path/1/",\n "/path/2/"\n ],\n "nodeModulePaths": [\n "/path/1/package1",\n "/path/1/package2"\n ]\n }\n}`, + }); }); }); }); diff --git a/test/resolution/ResolutionContext.test.ts b/test/resolution/ResolutionContext.test.ts index a98cb53..72792d3 100644 --- a/test/resolution/ResolutionContext.test.ts +++ b/test/resolution/ResolutionContext.test.ts @@ -1,6 +1,6 @@ -import * as fs from 'fs'; -import * as Path from 'path'; +import * as fs from 'node:fs'; import { ResolutionContext } from '../../lib/resolution/ResolutionContext'; +import { joinFilePath, normalizeFilePath } from '../../lib/util/PathUtil'; describe('ResolutionContext', () => { let resolutionContext: ResolutionContext; @@ -11,12 +11,13 @@ describe('ResolutionContext', () => { describe('getFileContent', () => { it('Should read file contents', async() => { - expect(await resolutionContext.getFileContent(`${__dirname}/../data/file.d.ts`)) - .toEqual(`export class MyClass {}\n`); + await expect(resolutionContext.getFileContent(`${__dirname}/../data/file.d.ts`)).resolves + .toBe(`export class MyClass {}\n`); }); it('Should error on a non-existing file', async() => { - await expect(resolutionContext.getFileContent(`${__dirname}/../data/file-not-exist.d.ts`)).rejects.toThrow(); + await expect(resolutionContext.getFileContent(`${__dirname}/../data/file-not-exist.d.ts`)) + .rejects.toThrow('no such file or directory'); }); }); @@ -24,7 +25,7 @@ describe('ResolutionContext', () => { it('Should write file contents in an existing directory', async() => { const path = `${__dirname}/../data/file-new.json`; await resolutionContext.writeFileContent(path, `{}`); - expect(await resolutionContext.getFileContent(path)).toEqual(`{}`); + await expect(resolutionContext.getFileContent(path)).resolves.toBe(`{}`); // Remove created file again fs.unlinkSync(path); @@ -33,7 +34,7 @@ describe('ResolutionContext', () => { it('Should write file contents in a non-existing directory', async() => { const path = `${__dirname}/../data/a/b/c/file-new.json`; await resolutionContext.writeFileContent(path, `{}`); - expect(await resolutionContext.getFileContent(path)).toEqual(`{}`); + await expect(resolutionContext.getFileContent(path)).resolves.toBe(`{}`); // Remove created file and folders again fs.unlinkSync(path); @@ -59,14 +60,14 @@ describe('ResolutionContext', () => { describe('getTypeScriptFileContent', () => { it('Should read file contents', async() => { - expect(await resolutionContext.getTypeScriptFileContent(`${__dirname}/../data/file`)) - .toEqual(`export class MyClass {}\n`); + await expect(resolutionContext.getTypeScriptFileContent(`${__dirname}/../data/file`)).resolves + .toBe(`export class MyClass {}\n`); }); }); describe('parseTypescriptFile', () => { it('Should parse a valid class definition', async() => { - expect(await resolutionContext.parseTypescriptFile(`${__dirname}/../data/file`)) + await expect(resolutionContext.parseTypescriptFile(`${__dirname}/../data/file`)).resolves .toMatchObject({ body: [ { @@ -94,8 +95,8 @@ describe('ResolutionContext', () => { }); it('Should error on an invalid typescript file', async() => { - await expect(resolutionContext.parseTypescriptFile(`${__dirname}/../data/file-invalid`)).rejects - .toThrow(); + await expect(resolutionContext.parseTypescriptFile(`${__dirname}/../data/file-invalid`)) + .rejects.toThrow('Could not parse file'); }); it('Should cache the same file', async() => { @@ -110,9 +111,74 @@ describe('ResolutionContext', () => { }); describe('resolvePackageIndex', () => { - it('Should resolve from the currentFilePath', async() => { - expect(resolutionContext.resolvePackageIndex('lru-cache', Path.join(__dirname, '../../'))) - .toEqual(Path.join(__dirname, '../../node_modules/lru-cache/index.js')); + it('Should resolve from the currentFilePath for a package without separate typings', async() => { + expect(resolutionContext.resolvePackageIndex('asynciterator', joinFilePath(__dirname, '../../'))) + .toEqual(joinFilePath(__dirname, '../../node_modules/asynciterator/dist/asynciterator.d.ts')); + }); + + it('Should resolve from the currentFilePath for a package with separate typings', async() => { + expect(resolutionContext.resolvePackageIndex('lru-cache', joinFilePath(__dirname, '../../'))) + .toEqual(joinFilePath(__dirname, '../../node_modules/@types/node/lru-cache.d.ts')); + }); + + it('Should resolve from the currentFilePath for a package without separate typings without extension', async() => { + expect(resolutionContext.resolvePackageIndex('@comunica/bus-rdf-parse', joinFilePath(__dirname, '../../'))) + .toEqual(joinFilePath(__dirname, '../../node_modules/@comunica/bus-rdf-parse/lib/index.d.ts')); + }); + + it('Should resolve from the currentFilePath for a built-in package', async() => { + expect(resolutionContext.resolvePackageIndex('stream', joinFilePath(__dirname, '../../'))) + .toEqual(joinFilePath(__dirname, '../../node_modules/@types/node/stream.d.ts')); + }); + }); + + describe('resolvePackageIndexInner', () => { + it('Should handle package.json with types field', async() => { + const req: any = () => ({ + types: 'abc.d.ts', + }); + req.resolve = () => '/root/a/'; + expect(resolutionContext.resolvePackageIndexInner(req, 'asynciterator', '')) + .toEqual(normalizeFilePath('/root/abc.d.ts')); + }); + + it('Should handle package.json with typings field', async() => { + const req: any = () => ({ + typings: 'abc.d.ts', + }); + req.resolve = () => '/root/a/'; + expect(resolutionContext.resolvePackageIndexInner(req, 'asynciterator', '')) + .toEqual(normalizeFilePath('/root/abc.d.ts')); + }); + + it('Should handle package.json with implicit types field', async() => { + const req: any = () => ({ + main: 'abc.js', + }); + req.resolve = () => '/root/a/'; + expect(resolutionContext.resolvePackageIndexInner(req, 'asynciterator', '')) + .toEqual(normalizeFilePath('/root/abc.d.ts')); + }); + + it('Should handle package.json with types field without extension', async() => { + const req: any = () => ({ + types: 'abc', + }); + req.resolve = () => '/root/a/'; + expect(resolutionContext.resolvePackageIndexInner(req, 'asynciterator', '')) + .toEqual(normalizeFilePath('/root/abc.d.ts')); + }); + }); + + describe('resolveTypesPath', () => { + it('Should resolve a types path of a directory', async() => { + await expect(resolutionContext.resolveTypesPath(`${__dirname}/../data/directory`)).resolves + .toEqual(normalizeFilePath(`${__dirname}/../data/directory/index`)); + }); + + it('Should resolve a types path of a file', async() => { + await expect(resolutionContext.resolveTypesPath(`${__dirname}/../data/file`)).resolves + .toBe(`${__dirname}/../data/file`); }); }); }); diff --git a/test/serialize/ComponentConstructor.test.ts b/test/serialize/ComponentConstructor.test.ts index 8fab10f..4a8b97c 100644 --- a/test/serialize/ComponentConstructor.test.ts +++ b/test/serialize/ComponentConstructor.test.ts @@ -1,41 +1,49 @@ -import * as Path from 'path'; import { PrefetchedDocumentLoader } from 'componentsjs/lib/rdf/PrefetchedDocumentLoader'; import type { JsonLdContextNormalized } from 'jsonld-context-parser'; import { ContextParser } from 'jsonld-context-parser'; import type { ClassIndex, ClassLoaded, - ClassReferenceLoaded, - InterfaceLoaded, + ClassReferenceLoadedClassOrInterface, } from '../../lib/parse/ClassIndex'; import type { ConstructorData } from '../../lib/parse/ConstructorLoader'; -import type { ParameterData, ParameterRangeResolved } from '../../lib/parse/ParameterLoader'; +import type { MemberData } from '../../lib/parse/MemberLoader'; +import type { ParameterData, ParameterRangeResolved, ExtensionData } from '../../lib/parse/ParameterLoader'; + import type { ExternalComponents } from '../../lib/resolution/ExternalModulesLoader'; -import type { FieldScope, ExternalContextCallback } from '../../lib/serialize/ComponentConstructor'; +import type { + FieldScope, + ExternalContextCallback, + PathDestinationDefinition, +} from '../../lib/serialize/ComponentConstructor'; import { ComponentConstructor } from '../../lib/serialize/ComponentConstructor'; import type { ParameterDefinition } from '../../lib/serialize/ComponentDefinitions'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; import { ContextConstructorMocked } from '../ContextConstructorMocked'; describe('ComponentConstructor', () => { let ctor: ComponentConstructor; - let classReference: ClassReferenceLoaded; + let classReference: ClassReferenceLoadedClassOrInterface; let externalComponents: ExternalComponents; let context: JsonLdContextNormalized; let externalContextsCallback: ExternalContextCallback; let scope: FieldScope; + let pathDestination: PathDestinationDefinition; beforeEach(async() => { classReference = { type: 'class', packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/file-param'), + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + generics: {}, }; externalComponents = { moduleState: {}, components: {}, + packagesBeingGenerated: {}, }; const contextParser = new ContextParser({ @@ -64,17 +72,22 @@ describe('ComponentConstructor', () => { }, typesPath: '', }; - const contextConstructor = new ContextConstructorMocked({ packageMetadata, typeScopedContexts: false }); + const contextConstructor = new ContextConstructorMocked({ packageMetadata }); + pathDestination = { + packageRootDirectory: normalizeFilePath('/docs/package'), + originalPath: 'src', + replacementPath: 'components', + }; ctor = new ComponentConstructor({ packageMetadata, + fileExtension: 'jsonld', contextConstructor, - pathDestination: { - packageRootDirectory: Path.normalize('/docs/package'), - originalPath: 'src', - replacementPath: 'components', - }, + pathDestination, classAndInterfaceIndex: {}, classConstructors: {}, + classGenerics: {}, + classExtensions: {}, + classMembers: {}, externalComponents, contextParser, }); @@ -86,12 +99,13 @@ describe('ComponentConstructor', () => { scope = { parentFieldNames: [], fieldIdsHash: {}, + defaultNested: [], }; }); describe('constructComponents', () => { it('should handle an empty index', async() => { - expect(await ctor.constructComponents()).toEqual({}); + await expect(ctor.constructComponents()).resolves.toEqual({}); }); it('should handle a non-empty index for classes in the same file', async() => { @@ -100,78 +114,123 @@ describe('ComponentConstructor', () => { type: 'class', packageName: 'my-package', localName: 'MyClass1', - fileName: Path.normalize('/docs/package/src/b/file'), + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, }, MyClass2: { type: 'class', packageName: 'my-package', localName: 'MyClass2', - fileName: Path.normalize('/docs/package/src/b/file'), + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, }, }; ( ctor).classConstructors = >> { MyClass1: { type: 'class', + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + genericTypeParameters: [], parameters: [], }, MyClass2: { type: 'class', + classLoaded: ( ctor).classAndInterfaceIndex.MyClass2, + genericTypeParameters: [], parameters: [ { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, }; - expect(await ctor.constructComponents()).toEqual({ - [Path.normalize('/docs/package/components/b/file')]: { + ( ctor).classMembers = >> { + MyClass1: { + members: [ + { + name: 'field1_1', + range: { + type: 'raw', + value: 'boolean', + }, + }, + { + name: 'field1_2', + range: { + type: 'raw', + value: 'number', + }, + }, + ], + classLoaded: {}, + }, + MyClass2: { + members: [ + { + name: 'field2_1', + }, + ], + classLoaded: {}, + }, + }; + await expect(ctor.constructComponents()).resolves.toEqual({ + [normalizeFilePath('/docs/package/components/b/file')]: { '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', ], '@id': 'npmd:my-package', components: [ { - '@id': 'mp:b/file#MyClass1', + '@id': 'mp:components/b/file.jsonld#MyClass1', '@type': 'Class', constructorArguments: [], parameters: [], requireElement: 'MyClass1', + memberFields: [ + { + '@id': 'mp:components/b/file.jsonld#MyClass1__member_field1_1', + memberFieldName: 'field1_1', + range: 'xsd:boolean', + }, + { + '@id': 'mp:components/b/file.jsonld#MyClass1__member_field1_2', + memberFieldName: 'field1_2', + range: 'xsd:number', + }, + ], }, { - '@id': 'mp:b/file#MyClass2', + '@id': 'mp:components/b/file.jsonld#MyClass2', '@type': 'Class', requireElement: 'MyClass2', constructorArguments: [ - { '@id': 'mp:b/file#MyClass2_fieldA' }, - { '@id': 'mp:b/file#MyClass2_fieldB' }, + { '@id': 'mp:components/b/file.jsonld#MyClass2_fieldA' }, + { '@id': 'mp:components/b/file.jsonld#MyClass2_fieldB' }, ], parameters: [ { - '@id': 'mp:b/file#MyClass2_fieldA', + '@id': 'mp:components/b/file.jsonld#MyClass2_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:b/file#MyClass2_fieldB', + '@id': 'mp:components/b/file.jsonld#MyClass2_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, + }, + ], + memberFields: [ + { + '@id': 'mp:components/b/file.jsonld#MyClass2__member_field2_1', + memberFieldName: 'field2_1', }, ], }, @@ -186,49 +245,51 @@ describe('ComponentConstructor', () => { type: 'class', packageName: 'my-package', localName: 'MyClass1', - fileName: Path.normalize('/docs/package/src/file1'), + fileName: normalizeFilePath('/docs/package/src/file1'), + generics: {}, }, MyClass2: { type: 'class', packageName: 'my-package', localName: 'MyClass2', - fileName: Path.normalize('/docs/package/src/b/file2'), + fileName: normalizeFilePath('/docs/package/src/b/file2'), + generics: {}, }, }; ( ctor).classConstructors = >> { MyClass1: { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + genericTypeParameters: [], parameters: [], }, MyClass2: { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass2, + genericTypeParameters: [], parameters: [ { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, }; - expect(await ctor.constructComponents()).toEqual({ - [Path.normalize('/docs/package/components/file1')]: { + await expect(ctor.constructComponents()).resolves.toEqual({ + [normalizeFilePath('/docs/package/components/file1')]: { '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', ], '@id': 'npmd:my-package', components: [ { - '@id': 'mp:file1#MyClass1', + '@id': 'mp:components/file1.jsonld#MyClass1', '@type': 'Class', constructorArguments: [], parameters: [], @@ -236,34 +297,30 @@ describe('ComponentConstructor', () => { }, ], }, - [Path.normalize('/docs/package/components/b/file2')]: { + [normalizeFilePath('/docs/package/components/b/file2')]: { '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', ], '@id': 'npmd:my-package', components: [ { - '@id': 'mp:b/file2#MyClass2', + '@id': 'mp:components/b/file2.jsonld#MyClass2', '@type': 'Class', requireElement: 'MyClass2', constructorArguments: [ - { '@id': 'mp:b/file2#MyClass2_fieldA' }, - { '@id': 'mp:b/file2#MyClass2_fieldB' }, + { '@id': 'mp:components/b/file2.jsonld#MyClass2_fieldA' }, + { '@id': 'mp:components/b/file2.jsonld#MyClass2_fieldB' }, ], parameters: [ { - '@id': 'mp:b/file2#MyClass2_fieldA', + '@id': 'mp:components/b/file2.jsonld#MyClass2_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:b/file2#MyClass2_fieldB', + '@id': 'mp:components/b/file2.jsonld#MyClass2_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ], }, @@ -278,58 +335,72 @@ describe('ComponentConstructor', () => { type: 'class', packageName: 'my-package', localName: 'MyClass1', - fileName: Path.normalize('/docs/package/src/b/file'), - superClass: { - packageName: 'other-package', - localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/b/file'), - }, + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, }, MyClass2: { type: 'class', packageName: 'my-package', localName: 'MyClass2', - fileName: Path.normalize('/docs/package/src/b/file'), - superClass: { - packageName: 'other-package', - localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/b/file'), - }, + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, }, }; ( ctor).classConstructors = >> { MyClass1: { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + genericTypeParameters: [], parameters: [], }, MyClass2: { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass2, + genericTypeParameters: [], parameters: [ { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, }; + ( ctor).classExtensions = []>> { + MyClass1: [ + { + classLoaded: { + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/package/src/b/file'), + }, + genericTypeInstantiations: [], + }, + ], + MyClass2: [ + { + classLoaded: { + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/package/src/b/file'), + }, + genericTypeInstantiations: [], + }, + ], + }; externalComponents.components['other-package'] = { contextIris: [ 'http://example.org/context-other-package.jsonld' ], componentNamesToIris: { MyClass: 'http://example.org/other-package.ttl#MyClass', }, }; - expect(await ctor.constructComponents()).toEqual({ - [Path.normalize('/docs/package/components/b/file')]: { + await expect(ctor.constructComponents()).resolves.toEqual({ + [normalizeFilePath('/docs/package/components/b/file')]: { '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', 'http://example.org/context-other-package.jsonld', @@ -337,7 +408,7 @@ describe('ComponentConstructor', () => { '@id': 'npmd:my-package', components: [ { - '@id': 'mp:b/file#MyClass1', + '@id': 'mp:components/b/file.jsonld#MyClass1', '@type': 'Class', constructorArguments: [], extends: [ 'op:MyClass' ], @@ -345,28 +416,24 @@ describe('ComponentConstructor', () => { requireElement: 'MyClass1', }, { - '@id': 'mp:b/file#MyClass2', + '@id': 'mp:components/b/file.jsonld#MyClass2', '@type': 'Class', requireElement: 'MyClass2', constructorArguments: [ - { '@id': 'mp:b/file#MyClass2_fieldA' }, - { '@id': 'mp:b/file#MyClass2_fieldB' }, + { '@id': 'mp:components/b/file.jsonld#MyClass2_fieldA' }, + { '@id': 'mp:components/b/file.jsonld#MyClass2_fieldB' }, ], extends: [ 'op:MyClass' ], parameters: [ { - '@id': 'mp:b/file#MyClass2_fieldA', + '@id': 'mp:components/b/file.jsonld#MyClass2_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:b/file#MyClass2_fieldB', + '@id': 'mp:components/b/file.jsonld#MyClass2_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ], }, @@ -374,11 +441,99 @@ describe('ComponentConstructor', () => { }, }); }); + + it('should handle a non-empty index with a class from a different package', async() => { + ( ctor).classAndInterfaceIndex = { + MyClass1: { + type: 'class', + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/other-package/src/b/file'), + fileNameReferenced: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, + }, + }; + ( ctor).classConstructors = >> { + MyClass1: { + type: 'class', + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + genericTypeParameters: [], + parameters: [], + }, + }; + externalComponents.components['other-package'] = { + contextIris: [ 'http://example.org/context-other-package.jsonld' ], + componentNamesToIris: { + MyClass: 'http://example.org/other-package.ttl#MyClass', + }, + }; + await expect(ctor.constructComponents()).resolves.toEqual({ + [normalizeFilePath('/docs/package/components/b/file')]: { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + 'http://example.org/context-other-package.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'op:MyClass', + '@type': 'Class', + constructorArguments: [], + parameters: [], + requireElement: 'MyClass', + }, + ], + }, + }); + }); + + it('should handle components without constructors', async() => { + ( ctor).classAndInterfaceIndex = { + MyClass1: { + type: 'class', + packageName: 'my-package', + localName: 'MyClass1', + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, + }, + MyClass2: { + type: 'class', + packageName: 'my-package', + localName: 'MyClass2', + fileName: normalizeFilePath('/docs/package/src/b/file'), + generics: {}, + }, + }; + await expect(ctor.constructComponents()).resolves.toEqual({ + [normalizeFilePath('/docs/package/components/b/file')]: { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:components/b/file.jsonld#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [], + requireElement: 'MyClass1', + }, + { + '@id': 'mp:components/b/file.jsonld#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + }, + ], + }, + }); + }); }); describe('constructComponentsIndex', () => { it('should handle an empty index', async() => { - expect(await ctor.constructComponentsIndex({}, 'jsonld')).toEqual({ + await expect(ctor.constructComponentsIndex({})).resolves.toEqual({ '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', ], @@ -390,11 +545,11 @@ describe('ComponentConstructor', () => { }); it('should handle a non-empty index', async() => { - expect(await ctor.constructComponentsIndex( { - [Path.normalize('/docs/package/components/file1')]: true, - [Path.normalize('/docs/package/components/file2')]: true, - [Path.normalize('/docs/package/components/file/a/b/c')]: true, - }, 'jsonld')).toEqual({ + await expect(ctor.constructComponentsIndex( { + [normalizeFilePath('/docs/package/components/file1')]: true, + [normalizeFilePath('/docs/package/components/file2')]: true, + [normalizeFilePath('/docs/package/components/file/a/b/c')]: true, + })).resolves.toEqual({ '@context': [ 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', ], @@ -402,9 +557,9 @@ describe('ComponentConstructor', () => { '@type': 'Module', requireName: 'my-package', import: [ - 'files-mp:components/file1.jsonld', - 'files-mp:components/file2.jsonld', - 'files-mp:components/file/a/b/c.jsonld', + 'mp:components/file1.jsonld', + 'mp:components/file2.jsonld', + 'mp:components/file/a/b/c.jsonld', ], }); }); @@ -418,63 +573,57 @@ describe('ComponentConstructor', () => { it('should handle an applicable file, starting with a slash', () => { expect(ctor.getImportPathIri('/components/a/b')) - .toEqual('https://linkedsoftwaredependencies.org/bundles/npm/my-package/^1.0.0/components/a/b'); + .toBe('https://linkedsoftwaredependencies.org/bundles/npm/my-package/^1.0.0/components/a/b'); }); it('should handle an applicable file, not starting with a slash', () => { expect(ctor.getImportPathIri('components/a/b')) - .toEqual('https://linkedsoftwaredependencies.org/bundles/npm/my-package/^1.0.0/components/a/b'); + .toBe('https://linkedsoftwaredependencies.org/bundles/npm/my-package/^1.0.0/components/a/b'); }); }); describe('getPathRelative', () => { it('should error when source is outside package', () => { - expect(() => ctor.getPathRelative('not-in-package')) + expect(() => ComponentConstructor.getPathRelative(pathDestination, 'not-in-package')) .toThrow(new Error('Tried to reference a file outside the current package: not-in-package')); }); it('should handle a valid path', () => { - expect(ctor.getPathRelative(Path.normalize('/docs/package/src/a/b/myFile'))) - .toEqual('a/b/myFile'); - }); - - it('should generate the correct path for POSIX path implementations.', () => { - const sep = Path.sep; - ( Path).sep = Path.posix.sep; - ( ctor).pathDestination.packageRootDirectory = Path.posix.normalize('/docs/package'); - expect(ctor.getPathRelative(Path.posix.normalize('/docs/package/src/a/b/myFile'))) - .toEqual('a/b/myFile'); - ( Path).sep = sep; + expect(ComponentConstructor.getPathRelative(pathDestination, normalizeFilePath('/docs/package/src/a/b/myFile'))) + .toBe('a/b/myFile'); }); - it('should generate the correct path for win32 path implementations.', () => { - const sep = Path.sep; - ( Path).sep = Path.win32.sep; - ( ctor).pathDestination.packageRootDirectory = Path.win32.normalize('/docs/package'); - expect(ctor.getPathRelative(Path.win32.normalize('/docs/package/src/a/b/myFile'))) - .toEqual('a/b/myFile'); - ( Path).sep = sep; + it('should generate the correct path.', () => { + ( ctor).pathDestination.packageRootDirectory = normalizeFilePath('/docs/package'); + expect(ComponentConstructor.getPathRelative( + pathDestination, + normalizeFilePath('/docs/package/src/a/b/myFile'), + )).toBe('a/b/myFile'); }); }); describe('getPathDestination', () => { it('should error when source is outside package', () => { - expect(() => ctor.getPathDestination('not-in-package')) + expect(() => ComponentConstructor.getPathDestination(pathDestination, 'not-in-package')) .toThrow(new Error('Tried to reference a file outside the current package: not-in-package')); }); it('should handle a valid path', () => { - expect(ctor.getPathDestination(Path.normalize('/docs/package/src/myFile'))) - .toEqual(Path.normalize('/docs/package/components/myFile')); + expect(ComponentConstructor.getPathDestination(pathDestination, normalizeFilePath('/docs/package/src/myFile'))) + .toEqual(normalizeFilePath('/docs/package/components/myFile')); }); }); describe('constructComponent', () => { it('should handle a component with empty constructor', async() => { - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'Class', constructorArguments: [], parameters: [], @@ -483,46 +632,42 @@ describe('ComponentConstructor', () => { }); it('should handle a component with non-empty constructor', async() => { - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [ { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'Class', constructorArguments: [ - { '@id': 'mp:a/b/file-param#MyClass_fieldA' }, - { '@id': 'mp:a/b/file-param#MyClass_fieldB' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB' }, ], parameters: [ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ], requireElement: 'MyClass', @@ -531,10 +676,14 @@ describe('ComponentConstructor', () => { it('should handle a component with abstract class', async() => { ( classReference).abstract = true; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'AbstractClass', constructorArguments: [], parameters: [], @@ -543,91 +692,78 @@ describe('ComponentConstructor', () => { }); it('should handle a component with super class', async() => { - ( classReference).superClass = { - packageName: 'my-package', - localName: 'SuperClass', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile'), - }; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { - parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', - '@type': 'Class', - constructorArguments: [], + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [], - requireElement: 'MyClass', - extends: [ 'mp:a/b/SuperFile#SuperClass' ], - }); - }); - - it('should handle a component with implementing interfaces', async() => { - ( classReference).implementsInterfaces = [ - { - packageName: 'my-package', - localName: 'SuperInterface1', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile1'), - }, + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [ { - packageName: 'my-package', - localName: 'SuperInterface2', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile2'), + classLoaded: { + packageName: 'my-package', + localName: 'SuperClass', + fileName: normalizeFilePath('/docs/package/src/a/b/SuperFile'), + }, + genericTypeInstantiations: [], }, - ]; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { - parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + ], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'Class', constructorArguments: [], parameters: [], requireElement: 'MyClass', - extends: [ - 'mp:a/b/SuperFile1#SuperInterface1', - 'mp:a/b/SuperFile2#SuperInterface2', - ], + extends: [ 'mp:components/a/b/SuperFile.jsonld#SuperClass' ], }); }); - it('should handle a component with super class and implementing interfaces', async() => { - ( classReference).superClass = { - packageName: 'my-package', - localName: 'SuperClass', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile'), - }; - ( classReference).implementsInterfaces = [ + it('should handle a component with implementing interfaces', async() => { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + parameters: [], + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [ { - packageName: 'my-package', - localName: 'SuperInterface1', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile1'), + classLoaded: { + packageName: 'my-package', + localName: 'SuperInterface1', + fileName: normalizeFilePath('/docs/package/src/a/b/SuperFile1'), + }, + genericTypeInstantiations: [], }, { - packageName: 'my-package', - localName: 'SuperInterface2', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile2'), + classLoaded: { + packageName: 'my-package', + localName: 'SuperInterface2', + fileName: normalizeFilePath('/docs/package/src/a/b/SuperFile2'), + }, + genericTypeInstantiations: [], }, - ]; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { - parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + ], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'Class', constructorArguments: [], parameters: [], requireElement: 'MyClass', extends: [ - 'mp:a/b/SuperFile#SuperClass', - 'mp:a/b/SuperFile1#SuperInterface1', - 'mp:a/b/SuperFile2#SuperInterface2', + 'mp:components/a/b/SuperFile1.jsonld#SuperInterface1', + 'mp:components/a/b/SuperFile2.jsonld#SuperInterface2', ], }); }); it('should handle a component with comment', async() => { classReference.comment = 'Hi'; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'Class', constructorArguments: [], parameters: [], @@ -638,10 +774,14 @@ describe('ComponentConstructor', () => { it('should handle an interface component', async() => { classReference.type = 'interface'; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', + }, { + genericTypeParameters: [], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', '@type': 'AbstractClass', constructorArguments: [], parameters: [], @@ -649,32 +789,135 @@ describe('ComponentConstructor', () => { }); }); - it('should handle an interface component with super interfaces', async() => { - classReference.type = 'interface'; - ( classReference).superInterfaces = [ - { - packageName: 'my-package', - localName: 'SuperInterface1', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile1'), - }, - { - packageName: 'my-package', - localName: 'SuperInterface2', - fileName: Path.normalize('/docs/package/src/a/b/SuperFile2'), - }, - ]; - expect(await ctor.constructComponent(context, externalContextsCallback, classReference, { - parameters: [], - })).toEqual({ - '@id': 'mp:a/b/file-param#MyClass', - '@type': 'AbstractClass', - constructorArguments: [], - parameters: [], + it('should handle a component with generic types', async() => { + await expect(ctor.constructComponent(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + parameters: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'genericTypeReference', + value: 'U', + origin: classReference, + }, + comment: 'Hi1', + }, + { + type: 'field', + name: 'fieldB', + range: { + type: 'genericTypeReference', + value: 'V', + origin: classReference, + }, + comment: 'Hi2', + }, + ], + }, { + genericTypeParameters: [ + { + name: 'T', + }, + { + name: 'U', + range: { + type: 'raw', + value: 'number', + }, + }, + { + name: 'V', + range: { + type: 'class', + value: classReference, + genericTypeParameterInstances: [ + { + type: 'genericTypeReference', + value: 'U', + origin: classReference, + }, + { + type: 'raw', + value: 'string', + }, + ], + }, + }, + ], + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + }, [], [])).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass', + '@type': 'Class', + constructorArguments: [ + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB' }, + ], + genericTypeParameters: [ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_U', + range: 'xsd:number', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_V', + range: { + '@type': 'ParameterRangeGenericComponent', + component: 'mp:components/a/b/file-param.jsonld#MyClass', + genericTypeInstances: [ + { + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: 'mp:components/a/b/file-param.jsonld#MyClass__generic_U', + }, + 'xsd:string', + ], + }, + }, + ], + parameters: [ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + comment: 'Hi1', + range: { + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: 'mp:components/a/b/file-param.jsonld#MyClass__generic_U', + }, + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB', + comment: 'Hi2', + range: { + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: 'mp:components/a/b/file-param.jsonld#MyClass__generic_V', + }, + }, + ], requireElement: 'MyClass', - extends: [ - 'mp:a/b/SuperFile1#SuperInterface1', - 'mp:a/b/SuperFile2#SuperInterface2', + }); + }); + }); + + describe('constructExtensionDefinition', () => { + it('should handle an extension without generics', async() => { + await expect(ctor.constructExtensionDefinition(context, externalContextsCallback, { + classLoaded: classReference, + genericTypeInstantiations: [], + })).resolves.toBe('mp:components/a/b/file-param.jsonld#MyClass'); + }); + + it('should handle an extension with generics', async() => { + await expect(ctor.constructExtensionDefinition(context, externalContextsCallback, { + classLoaded: classReference, + genericTypeInstantiations: [ + { type: 'raw', value: 'boolean' }, + { type: 'raw', value: 'string' }, ], + })).resolves.toEqual({ + '@type': 'GenericComponentExtension', + component: 'mp:components/a/b/file-param.jsonld#MyClass', + genericTypeInstances: [ 'xsd:boolean', 'xsd:string' ], }); }); }); @@ -682,17 +925,50 @@ describe('ComponentConstructor', () => { describe('moduleIriToId', () => { it('should return a compacted module IRI', () => { expect(ctor.moduleIriToId(context)) - .toEqual('npmd:my-package'); + .toBe('npmd:my-package'); }); }); describe('classNameToId', () => { it('should return a compacted class IRI within the current package', async() => { - expect(await ctor.classNameToId(context, externalContextsCallback, { + await expect(ctor.classNameToId(context, externalContextsCallback, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - })).toEqual('mp:a/b/MyOwnClass#MyClass'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + })).resolves.toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass'); + }); + + it('should return an existing IRI in another package that is being generated', async() => { + const packageMetadata = { + name: 'other-package', + version: '3.2.1', + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/other-package', + contexts: { + 'http://example.org/context-other-package.jsonld': true, + }, + }; + externalComponents.packagesBeingGenerated['other-package'] = { + packageMetadata, + pathDestination: { + packageRootDirectory: normalizeFilePath('/docs/other-package'), + originalPath: 'src', + replacementPath: 'components', + }, + minimalContext: await new ContextParser({ + documentLoader: new PrefetchedDocumentLoader({ + contexts: {}, + }), + skipValidation: true, + }).parse(new ContextConstructorMocked({ packageMetadata }).constructContext()), + }; + await expect(ctor.classNameToId(context, externalContextsCallback, { + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + })).resolves.toBe('op:components/a/b/MyOwnClass.jsonld#MyClass'); + expect(externalContextsCallback).toHaveBeenCalledWith('http://example.org/context-other-package.jsonld'); }); it('should return an existing IRI in an external package', async() => { @@ -702,11 +978,12 @@ describe('ComponentConstructor', () => { MyClass: 'http://example.org/other-package.ttl#MyClass', }, }; - expect(await ctor.classNameToId(context, externalContextsCallback, { + await expect(ctor.classNameToId(context, externalContextsCallback, { packageName: 'other-package', localName: 'MyClass', - fileName: Path.normalize('/docs/other-package/src/a/b/MyOwnClass'), - })).toEqual('op:MyClass'); + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + })).resolves.toBe('op:MyClass'); expect(externalContextsCallback).toHaveBeenCalledWith('http://example.org/context-other-package.jsonld'); }); @@ -720,11 +997,12 @@ describe('ComponentConstructor', () => { await expect(ctor.classNameToId(context, externalContextsCallback, { packageName: 'other-package', localName: 'MyClass', - fileName: Path.normalize('/docs/other-package/src/a/b/MyOwnClass'), + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', })).rejects.toThrow(`Tried to reference a class 'MyClass' from an external module 'other-package' that does not expose this component`); }); - it('should throw when an external package does not exist', async() => { + it('should handle an external package that does not expose components', async() => { externalComponents.components['other-package-other'] = { contextIris: [ 'http://example.org/context-other-package.jsonld' ], componentNamesToIris: { @@ -734,8 +1012,9 @@ describe('ComponentConstructor', () => { await expect(ctor.classNameToId(context, externalContextsCallback, { packageName: 'other-package', localName: 'MyClass', - fileName: Path.normalize('/docs/other-package/src/a/b/MyOwnClass'), - })).rejects.toThrow(`Tried to reference a class 'MyClass' from an external module 'other-package' that is not a dependency`); + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + })).resolves.toBe('urn:npm:other-package:MyClass'); }); }); @@ -744,8 +1023,9 @@ describe('ComponentConstructor', () => { expect(ctor.fieldNameToId(context, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - }, 'field', scope)).toEqual('mp:a/b/MyOwnClass#MyClass_field'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass_field'); }); it('should return a compacted field IRI for parent field names', () => { @@ -754,143 +1034,251 @@ describe('ComponentConstructor', () => { expect(ctor.fieldNameToId(context, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - }, 'field', scope)).toEqual('mp:a/b/MyOwnClass#MyClass_a_b_field'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass_a_b_field'); }); it('should return unique compacted field IRIs', () => { expect(ctor.fieldNameToId(context, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - }, 'field', scope)).toEqual('mp:a/b/MyOwnClass#MyClass_field'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass_field'); expect(ctor.fieldNameToId(context, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - }, 'field', scope)).toEqual('mp:a/b/MyOwnClass#MyClass_field_1'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass_field_1'); expect(ctor.fieldNameToId(context, { packageName: 'my-package', localName: 'MyClass', - fileName: Path.normalize('/docs/package/src/a/b/MyOwnClass'), - }, 'field', scope)).toEqual('mp:a/b/MyOwnClass#MyClass_field_2'); + fileName: normalizeFilePath('/docs/package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('mp:components/a/b/MyOwnClass.jsonld#MyClass_field_2'); + }); + + it('should return a compacted field IRI for a class in another package that is being generated', async() => { + const packageMetadata = { + name: 'other-package', + version: '3.2.1', + moduleIri: 'https://linkedsoftwaredependencies.org/bundles/npm/other-package', + contexts: { + 'http://example.org/context-other-package.jsonld': true, + }, + }; + externalComponents.packagesBeingGenerated['other-package'] = { + packageMetadata, + pathDestination: { + packageRootDirectory: normalizeFilePath('/docs/other-package'), + originalPath: 'src', + replacementPath: 'components', + }, + minimalContext: await new ContextParser({ + documentLoader: new PrefetchedDocumentLoader({ + contexts: {}, + }), + skipValidation: true, + }).parse(new ContextConstructorMocked({ packageMetadata }).constructContext()), + }; + expect(ctor.fieldNameToId(context, { + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)).toBe('npmd:other-package/^3.0.0/components/a/b/MyOwnClass.jsonld#MyClass_field'); + }); + + it('should throw on a compacted field IRI for a class in another package that is not being generated', async() => { + expect(() => ctor.fieldNameToId(context, { + packageName: 'other-package', + localName: 'MyClass', + fileName: normalizeFilePath('/docs/other-package/src/a/b/MyOwnClass'), + fileNameReferenced: 'unused', + }, 'field', scope)) + .toThrow(/Tried to reference a field field in ".*" outside the current package: .*/u); }); }); - describe('constructParameters', () => { - it('should handle a constructor with no params', async() => { - const parameters: ParameterDefinition[] = []; - expect(await ctor.constructParameters(context, externalContextsCallback, classReference, { - parameters: [], - }, parameters)).toEqual([]); - expect(parameters).toEqual([]); + describe('constructGenericTypeParameters', () => { + it('should handle a constructor with no generics', async() => { + await expect(ctor.constructGenericTypeParameters(context, externalContextsCallback, classReference, [])).resolves + .toEqual([]); }); - it('should handle a constructor with two params', async() => { - const parameters: ParameterDefinition[] = []; - expect(await ctor.constructParameters(context, externalContextsCallback, classReference, { - parameters: [ - { - type: 'field', - name: 'fieldA', + it('should handle a constructor with a single untyped generic', async() => { + await expect(ctor.constructGenericTypeParameters(context, externalContextsCallback, classReference, [ + { + name: 'T', + }, + ])).resolves.toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + }, + ]); + }); + + it('should handle a constructor with a single typed generic', async() => { + await expect(ctor.constructGenericTypeParameters(context, externalContextsCallback, classReference, [ + { + name: 'T', + range: { + type: 'raw', + value: 'number', + }, + }, + ])).resolves.toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + range: 'xsd:number', + }, + ]); + }); + + it('should handle a constructor with a single generic with default', async() => { + await expect(ctor.constructGenericTypeParameters(context, externalContextsCallback, classReference, [ + { + name: 'T', + default: { + type: 'literal', + value: 3, + }, + }, + ])).resolves.toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + default: { + '@type': 'ParameterRangeLiteral', + parameterRangeValueLiteral: 3, + }, + }, + ]); + }); + + it('should handle a constructor with a multiple generics', async() => { + await expect(ctor.constructGenericTypeParameters(context, externalContextsCallback, classReference, [ + { + name: 'T', + }, + { + name: 'U', + range: { + type: 'raw', + value: 'number', + }, + }, + ])).resolves.toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass__generic_U', + range: 'xsd:number', + }, + ]); + }); + }); + + describe('constructParameters', () => { + it('should handle a constructor with no params', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor.constructParameters(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + parameters: [], + }, parameters)).resolves.toEqual([]); + expect(parameters).toEqual([]); + }); + + it('should handle a constructor with two params', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor.constructParameters(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, + parameters: [ + { + type: 'field', + name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], - }, parameters)).toEqual([ - { '@id': 'mp:a/b/file-param#MyClass_fieldA' }, - { '@id': 'mp:a/b/file-param#MyClass_fieldB' }, + }, parameters)).resolves.toEqual([ + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB' }, ]); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a constructor with three params with identical names', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor.constructParameters(context, externalContextsCallback, classReference, { + await expect(ctor.constructParameters(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [ { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'field', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, { type: 'field', name: 'field', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi3', }, ], - }, parameters)).toEqual([ - { '@id': 'mp:a/b/file-param#MyClass_field' }, - { '@id': 'mp:a/b/file-param#MyClass_field_1' }, - { '@id': 'mp:a/b/file-param#MyClass_field_2' }, + }, parameters)).resolves.toEqual([ + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_1' }, + { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_2' }, ]); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_1', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_1', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_2', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_2', comment: 'Hi3', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a constructor with a nested param with two sub-params', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor.constructParameters(context, externalContextsCallback, classReference, { + await expect(ctor.constructParameters(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [ { type: 'field', @@ -902,54 +1290,46 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, - required: true, - unique: true, comment: 'Hi', }, ], - }, parameters)).toEqual([ + }, parameters)).resolves.toEqual([ { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ - { keyRaw: 'fieldA', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldA' }}, - { keyRaw: 'fieldB', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldB' }}, + { keyRaw: 'fieldA', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA' }}, + { keyRaw: 'fieldB', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB' }}, ], }, ]); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a constructor with a nested param with a hash', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor.constructParameters(context, externalContextsCallback, classReference, { + await expect(ctor.constructParameters(context, externalContextsCallback, classReference, { + classLoaded: ( ctor).classAndInterfaceIndex.MyClass1, parameters: [ { type: 'field', @@ -971,29 +1351,27 @@ describe('ComponentConstructor', () => { }, ], }, - required: true, - unique: true, comment: 'Hi1', }, ], }, - required: true, - unique: true, comment: 'Hi', }, ], - }, parameters)).toEqual([ + }, parameters)).resolves.toEqual([ { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ { keyRaw: 'fieldA', value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA__constructorArgument', fields: [ { - collectEntries: 'mp:a/b/file-param#MyClass_field_fieldA', - key: 'mp:a/b/file-param#MyClass_field_fieldA_key', + collectEntries: 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', + key: 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_key', value: { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA_value', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_value', }, }, ], @@ -1004,22 +1382,18 @@ describe('ComponentConstructor', () => { ]); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', comment: 'Hi1', range: { - '@type': 'mp:a/b/file-param#MyClass_field_fieldA_range', - parameters: [ + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: [ { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA_key', - required: true, - unique: true, + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_key', }, { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA_value', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_value', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, ], }, @@ -1031,107 +1405,100 @@ describe('ComponentConstructor', () => { describe('parameterDataToConstructorArgument', () => { it('should handle a raw parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ '@id': 'mp:a/b/file-param#MyClass_field' }); + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); it('should handle an override parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', range: { type: 'override', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ '@id': 'mp:a/b/file-param#MyClass_field' }); + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); it('should handle a class parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', - range: { type: 'class', + range: { + type: 'class', value: { packageName: 'my-package', localName: 'ClassParam', - fileName: Path.normalize('/docs/package/src/a/b/file-param'), - }}, - required: true, - unique: true, + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }, + genericTypeParameterInstances: undefined, + }, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ '@id': 'mp:a/b/file-param#MyClass_field' }); + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', comment: 'Hi', - range: 'mp:a/b/file-param#ClassParam', - required: true, - unique: true, + range: 'mp:components/a/b/file-param.jsonld#ClassParam', }, ]); }); it('should handle an undefined parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', range: { type: 'undefined' }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ '@id': 'mp:a/b/file-param#MyClass_field' }); + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', comment: 'Hi', - required: true, - unique: true, + range: { + '@type': 'ParameterRangeUndefined', + }, }, ]); }); it('should handle an empty nested parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', range: { type: 'nested', value: []}, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [], }); expect(parameters).toEqual([]); @@ -1139,7 +1506,7 @@ describe('ComponentConstructor', () => { it('should handle a nested parameter definition with raw field', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', @@ -1150,37 +1517,223 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ - { keyRaw: 'field', value: { '@id': 'mp:a/b/file-param#MyClass_field_field' }}, + { keyRaw: 'field', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field' }}, ], }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); it('should handle a nested parameter definition with multiple raw fields', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { type: 'raw', value: 'boolean' }, + comment: 'Hi1', + }, + { + type: 'field', + name: 'fieldB', + range: { type: 'raw', value: 'string' }, + comment: 'Hi2', + }, + ], + }, + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', + fields: [ + { keyRaw: 'fieldA', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA' }}, + { keyRaw: 'fieldB', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB' }}, + ], + }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', + comment: 'Hi1', + range: 'xsd:boolean', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB', + comment: 'Hi2', + range: 'xsd:string', + }, + ]); + }); + + it('should handle a nested parameter definition with multiple raw fields and scoped default', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + defaultNested: [ + { + paramPath: [ 'field', 'fieldA' ], + value: { type: 'raw', value: 'VALUE' }, + }, + ], + range: { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { type: 'raw', value: 'boolean' }, + comment: 'Hi1', + }, + { + type: 'field', + name: 'fieldB', + range: { type: 'raw', value: 'string' }, + comment: 'Hi2', + }, + ], + }, + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', + fields: [ + { keyRaw: 'fieldA', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA' }}, + { keyRaw: 'fieldB', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB' }}, + ], + }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', + comment: 'Hi1', + default: 'VALUE', + range: 'xsd:boolean', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB', + comment: 'Hi2', + range: 'xsd:string', + }, + ]); + }); + + it('should handle a deep nested parameter definition with multiple raw fields and scoped default', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', + defaultNested: [ + { + paramPath: [ 'field', 'fieldA', 'field1' ], + value: { type: 'raw', value: 'VALUE' }, + }, + ], + range: { + type: 'nested', + value: [ + { + type: 'field', + name: 'fieldA', + range: { + type: 'nested', + value: [ + { + type: 'field', + name: 'field1', + range: { type: 'raw', value: 'boolean' }, + comment: 'Hi1', + }, + { + type: 'field', + name: 'field2', + range: { type: 'raw', value: 'string' }, + comment: 'Hi2', + }, + ], + }, + comment: 'Hi1', + }, + { + type: 'field', + name: 'fieldB', + range: { type: 'raw', value: 'string' }, + comment: 'Hi2', + }, + ], + }, + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', + fields: [ + { + keyRaw: 'fieldA', + value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA__constructorArgument', + fields: [ + { + keyRaw: 'field1', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_field1' }, + }, + { + keyRaw: 'field2', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_field2' }, + }, + ], + }, + }, + { keyRaw: 'fieldB', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB' }}, + ], + }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_field1', + comment: 'Hi1', + default: 'VALUE', + range: 'xsd:boolean', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA_field2', + comment: 'Hi2', + range: 'xsd:string', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB', + comment: 'Hi2', + range: 'xsd:string', + }, + ]); + }); + + it('should handle a default and nested default', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + defaultNested: [ + { + paramPath: [ 'field', 'fieldA' ], + value: { type: 'raw', value: 'VALUE' }, + }, + ], range: { type: 'nested', value: [ @@ -1188,50 +1741,50 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, + defaults: [{ type: 'raw', value: 'VALUEOTHER' }], comment: 'Hi1', }, { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ - { keyRaw: 'fieldA', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldA' }}, - { keyRaw: 'fieldB', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldB' }}, + { + keyRaw: 'fieldA', + value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', + }, + }, + { keyRaw: 'fieldB', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB' }}, ], }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', comment: 'Hi1', + default: { + '@list': [ 'VALUEOTHER', 'VALUE' ], + }, range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a recursive nested parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', @@ -1242,8 +1795,6 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { @@ -1256,29 +1807,28 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ - { keyRaw: 'fieldA', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldA' }}, + { keyRaw: 'fieldA', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA' }}, { keyRaw: 'fieldSub', value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldSub__constructorArgument', fields: [ - { keyRaw: 'fieldB', value: { '@id': 'mp:a/b/file-param#MyClass_field_fieldSub_fieldB' }}, + { + keyRaw: 'fieldB', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldSub_fieldB' }, + }, ], }, }, @@ -1286,25 +1836,21 @@ describe('ComponentConstructor', () => { }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldA', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_fieldSub_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_fieldSub_fieldB', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a recursive nested parameter definition with identical field names', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'field', @@ -1315,8 +1861,6 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, { @@ -1329,29 +1873,25 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'string' }, - required: true, - unique: true, comment: 'Hi2', }, ], }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_field', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ - { keyRaw: 'field', value: { '@id': 'mp:a/b/file-param#MyClass_field_field' }}, + { keyRaw: 'field', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field' }}, { keyRaw: 'value', value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_value__constructorArgument', fields: [ - { keyRaw: 'field', value: { '@id': 'mp:a/b/file-param#MyClass_field_value_field' }}, + { keyRaw: 'field', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_value_field' }}, ], }, }, @@ -1359,25 +1899,21 @@ describe('ComponentConstructor', () => { }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, { - '@id': 'mp:a/b/file-param#MyClass_field_value_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_value_field', comment: 'Hi2', range: 'xsd:string', - required: true, - unique: true, }, ]); }); it('should handle a nested field with indexed parameter definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'fieldA', @@ -1392,36 +1928,31 @@ describe('ComponentConstructor', () => { }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_fieldA', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA__constructorArgument', fields: [ { - collectEntries: 'mp:a/b/file-param#MyClass_fieldA', - key: 'mp:a/b/file-param#MyClass_fieldA_key', - value: { '@id': 'mp:a/b/file-param#MyClass_fieldA_value' }, + collectEntries: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + key: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value' }, }, ], }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi', range: { - '@type': 'mp:a/b/file-param#MyClass_fieldA_range', - parameters: [ + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: [ { - '@id': 'mp:a/b/file-param#MyClass_fieldA_key', - required: true, - unique: true, + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', }, { - '@id': 'mp:a/b/file-param#MyClass_fieldA_value', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, ], }, @@ -1431,7 +1962,7 @@ describe('ComponentConstructor', () => { it('should handle a nested field with indexed parameter and field definition', async() => { const parameters: ParameterDefinition[] = []; - expect(await ctor + await expect(ctor .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { type: 'field', name: 'fieldA', @@ -1448,59 +1979,274 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldB', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi1', }, ], }, - required: true, - unique: true, comment: 'Hi', - }, parameters, 'mp:a/b/file-param#MyClass_fieldA', scope)).toEqual({ + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA__constructorArgument', fields: [ { - collectEntries: 'mp:a/b/file-param#MyClass_fieldA', - key: 'mp:a/b/file-param#MyClass_fieldA_key', - value: { '@id': 'mp:a/b/file-param#MyClass_fieldA_value' }, + collectEntries: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + key: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value' }, }, { keyRaw: 'fieldB', - value: { '@id': 'mp:a/b/file-param#MyClass_fieldA_fieldB' }, + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_fieldB' }, }, ], }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi', range: { - '@type': 'mp:a/b/file-param#MyClass_fieldA_range', - parameters: [ + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: [ { - '@id': 'mp:a/b/file-param#MyClass_fieldA_key', - required: true, - unique: true, + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', }, { - '@id': 'mp:a/b/file-param#MyClass_fieldA_value', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, ], }, }, { - '@id': 'mp:a/b/file-param#MyClass_fieldA_fieldB', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_fieldB', comment: 'Hi1', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); + + it('should handle a nested field in a union with indexed parameter definition', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'fieldA', + range: { + type: 'union', + elements: [ + { + type: 'nested', + value: [ + { + type: 'index', + domain: 'string', + range: { type: 'raw', value: 'boolean' }, + comment: 'Hi1', + }, + ], + }, + { + type: 'undefined', + }, + ], + }, + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', scope)).resolves.toEqual({ + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA__constructorArgument', + fields: [ + { + collectEntries: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + key: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value' }, + }, + ], + }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + comment: 'Hi', + range: { + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: [ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', + }, + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value', + comment: 'Hi1', + range: 'xsd:boolean', + }, + ], + }, + }, + ]); + }); + + it('should handle a parameter with default raw value', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'raw', value: 'boolean' }, + defaults: [{ type: 'raw', value: 'abc' }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: 'xsd:boolean', + default: 'abc', + }, + ]); + }); + + it('should handle a parameter with default raw value with array range', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'array', value: { type: 'raw', value: 'boolean' }}, + defaults: [{ type: 'raw', value: 'abc' }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:boolean', + }, + default: { + '@list': [ + 'abc', + ], + }, + }, + ]); + }); + + it('should handle a parameter with default iri value', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'raw', value: 'boolean' }, + defaults: [{ type: 'iri', value: 'ex:abc', baseComponent: classReference }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: 'xsd:boolean', + default: { '@id': 'ex:abc' }, + }, + ]); + }); + + it('should handle a parameter with default iri value that is relative', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'raw', value: 'boolean' }, + defaults: [{ type: 'iri', value: 'abc', baseComponent: classReference }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: 'xsd:boolean', + default: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_abc' }, + }, + ]); + }); + + it('should handle a parameter with default json value', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'override', value: 'json' }, + defaults: [{ type: 'raw', value: '{"a":true}' }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: 'rdf:JSON', + default: { + '@type': '@json', + '@value': { a: true }, + }, + }, + ]); + }); + + it('should handle a parameter with default optional json value', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { + type: 'union', + elements: [ + { type: 'override', value: 'json' }, + { type: 'undefined' }, + ], + }, + defaults: [{ type: 'raw', value: '{"a":true}' }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)).resolves + .toEqual({ '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field' }); + expect(parameters).toEqual([ + { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field', + comment: 'Hi', + range: { + '@type': 'ParameterRangeUnion', + parameterRangeElements: [ + 'rdf:JSON', + { '@type': 'ParameterRangeUndefined' }, + ], + }, + default: { + '@type': '@json', + '@value': { a: true }, + }, + }, + ]); + }); + + it('should throw on a parameter with an invalid default json value', async() => { + const parameters: ParameterDefinition[] = []; + await expect(ctor + .parameterDataToConstructorArgument(context, externalContextsCallback, classReference, { + type: 'field', + name: 'field', + range: { type: 'override', value: 'json' }, + defaults: [{ type: 'raw', value: '{"a":invalid}' }], + comment: 'Hi', + }, parameters, 'mp:components/a/b/file-param.jsonld#MyClass_field', scope)) + .rejects.toThrow( + /* eslint-disable max-len */ + /JSON parsing error in default value of mp:components\/a\/b\/file-param.jsonld#MyClass_field: Unexpected token (i in JSON at position 5|'i', "\{"a":invalid\}" is not valid JSON)/u, + ); + }); }); describe('constructFieldDefinitionNested', () => { @@ -1510,7 +2256,7 @@ describe('ComponentConstructor', () => { }); it('should construct a field', async() => { - const parameterData: ParameterData & { range: { type: 'nested' } } = { + const parameterData: ParameterData & { range: { type: 'nested' }} = { type: 'field', name: 'field', range: { @@ -1520,18 +2266,14 @@ describe('ComponentConstructor', () => { type: 'field', name: 'fieldA', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', }; const subParamData: ParameterData = ( parameterData).range.value[0]; - expect(await ctor.constructFieldDefinitionNested( + await expect(ctor.constructFieldDefinitionNested( context, externalContextsCallback, classReference, @@ -1540,21 +2282,19 @@ describe('ComponentConstructor', () => { subParamData, '', scope, - )) - .toEqual({ keyRaw: 'fieldA', value: { '@id': 'mp:a/b/file-param#MyClass_fieldA' }}); + )).resolves + .toEqual({ keyRaw: 'fieldA', value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA' }}); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); it('should construct a double nested field', async() => { - const parameterData: ParameterData & { range: { type: 'nested' } } = { + const parameterData: ParameterData & { range: { type: 'nested' }} = { type: 'field', name: 'field', range: { @@ -1570,24 +2310,18 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', }, ], }, - required: true, - unique: true, comment: 'Hi', }; const subParamData: ParameterData = ( parameterData).range.value[0]; - expect(await ctor.constructFieldDefinitionNested( + await expect(ctor.constructFieldDefinitionNested( context, externalContextsCallback, classReference, @@ -1596,15 +2330,16 @@ describe('ComponentConstructor', () => { subParamData, '', scope, - )) + )).resolves .toEqual({ keyRaw: 'field', value: { + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field__constructorArgument', fields: [ { keyRaw: 'field', value: { - '@id': 'mp:a/b/file-param#MyClass_field_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field', }, }, ], @@ -1612,17 +2347,15 @@ describe('ComponentConstructor', () => { }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_field_field', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_field_field', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ]); }); it('should construct an indexed element with raw values', async() => { - const parameterData: ParameterData & { range: { type: 'nested' } } = { + const parameterData: ParameterData & { range: { type: 'nested' }} = { type: 'field', name: 'fieldA', range: { @@ -1636,44 +2369,38 @@ describe('ComponentConstructor', () => { }, ], }, - required: true, - unique: false, comment: 'Hi', }; const subParamData: ParameterData = ( parameterData).range.value[0]; - expect(await ctor.constructFieldDefinitionNested( + await expect(ctor.constructFieldDefinitionNested( context, externalContextsCallback, classReference, parameterData, parameters, subParamData, - 'mp:a/b/file-param#MyClass_fieldA', + 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', scope, - )) + )).resolves .toEqual({ - collectEntries: 'mp:a/b/file-param#MyClass_fieldA', - key: 'mp:a/b/file-param#MyClass_fieldA_key', - value: { '@id': 'mp:a/b/file-param#MyClass_fieldA_value' }, + collectEntries: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', + key: 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', + value: { '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value' }, }); expect(parameters).toEqual([ { - '@id': 'mp:a/b/file-param#MyClass_fieldA', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA', comment: 'Hi', range: { - '@type': 'mp:a/b/file-param#MyClass_fieldA_range', - parameters: [ + '@type': 'ParameterRangeCollectEntries', + parameterRangeCollectEntriesParameters: [ { - '@id': 'mp:a/b/file-param#MyClass_fieldA_key', - required: true, - unique: true, + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_key', }, { - '@id': 'mp:a/b/file-param#MyClass_fieldA_value', + '@id': 'mp:components/a/b/file-param.jsonld#MyClass_fieldA_value', comment: 'Hi', range: 'xsd:boolean', - required: true, - unique: true, }, ], }, @@ -1682,7 +2409,7 @@ describe('ComponentConstructor', () => { }); it('should error on an indexed element inside another index', async() => { - const parameterData: ParameterData & { range: { type: 'nested' } } = { + const parameterData: ParameterData & { range: { type: 'nested' }} = { type: 'index', domain: 'string', range: { @@ -1710,68 +2437,287 @@ describe('ComponentConstructor', () => { '', scope, )).rejects - .toThrow(new Error(`Detected illegal indexed element inside a non-field in MyClass at ${Path.normalize('/docs/package/src/a/b/file-param')}`)); + .toThrow(new Error(`Detected illegal indexed element inside a non-field in MyClass at ${normalizeFilePath('/docs/package/src/a/b/file-param')}`)); }); }); - describe('constructParameterRaw', () => { - it('should construct a raw parameter definition', () => { + describe('constructParameterRange', () => { + it('should construct a raw parameter range', async() => { const rangeValue = 'boolean'; - expect(ctor.constructParameterRaw(context, classReference, { - type: 'field', - name: 'field', - range: { type: 'raw', value: rangeValue }, - required: true, - unique: true, - comment: 'Hi', - }, rangeValue, 'mp:a/b/file-param#MyClass_field')).toEqual({ - '@id': 'mp:a/b/file-param#MyClass_field', - comment: 'Hi', - range: 'xsd:boolean', - required: true, - unique: true, - }); + await expect(ctor.constructParameterRange( + { type: 'raw', value: rangeValue }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toBe('xsd:boolean'); }); - it('should construct a JSON parameter definition', () => { + it('should construct a JSON parameter range', async() => { const rangeValue = 'json'; - expect(ctor.constructParameterRaw(context, classReference, { - type: 'field', - name: 'field', - range: { type: 'raw', value: 'string' }, - required: true, - unique: true, - comment: 'Hi', - }, rangeValue, 'mp:a/b/file-param#MyClass_field')).toEqual({ - '@id': 'mp:a/b/file-param#MyClass_field', - comment: 'Hi', - range: 'rdf:JSON', - required: true, - unique: true, - }); + await expect(ctor.constructParameterRange( + { type: 'override', value: rangeValue }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toBe('rdf:JSON'); + }); + + it('should construct a literal parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'literal', value: 'abc' }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ '@type': 'ParameterRangeLiteral', parameterRangeValueLiteral: 'abc' }); }); - }); - describe('constructParameterClass', () => { - it('should construct a class parameter definition', async() => { + it('should construct a class parameter range', async() => { const rangeValue: ClassReferenceLoaded = { packageName: 'my-package', localName: 'ClassParam', - fileName: Path.normalize('/docs/package/src/a/b/file-param'), + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), }; - expect(await ctor.constructParameterClass(context, externalContextsCallback, classReference, { - type: 'field', - name: 'field', - range: { type: 'class', value: rangeValue }, - required: true, - unique: true, - comment: 'Hi', - }, rangeValue, 'mp:a/b/file-param#MyClass_field')).toEqual({ - '@id': 'mp:a/b/file-param#MyClass_field', - comment: 'Hi', - range: 'mp:a/b/file-param#ClassParam', - required: true, - unique: true, + await expect(ctor.constructParameterRange( + { type: 'class', value: rangeValue, genericTypeParameterInstances: undefined }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toBe('mp:components/a/b/file-param.jsonld#ClassParam'); + }); + + it('should construct a class parameter range with generics', async() => { + const rangeValue: ClassReferenceLoaded = { + packageName: 'my-package', + localName: 'ClassParam', + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }; + await expect(ctor.constructParameterRange( + { + type: 'class', + value: rangeValue, + genericTypeParameterInstances: [ + { + type: 'raw', + value: 'number', + }, + { + type: 'genericTypeReference', + value: 'T', + origin: classReference, + }, + ], + }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeGenericComponent', + component: 'mp:components/a/b/file-param.jsonld#ClassParam', + genericTypeInstances: [ + 'xsd:number', + { + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + }, + ], + }); + }); + + it('should construct on a nested parameter range as wildcard', async() => { + const rangeValue: ParameterData[] = []; + await expect(ctor.constructParameterRange( + { type: 'nested', value: rangeValue }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeWildcard', + }); + }); + + it('should construct an undefined parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'undefined' }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeUndefined', + }); + }); + + it('should construct a wildcard parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'wildcard' }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeWildcard', + }); + }); + + it('should construct a union parameter range', async() => { + const rangeValueClass: ClassReferenceLoaded = { + packageName: 'my-package', + localName: 'ClassParam', + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }; + const children: ParameterRangeResolved[] = [ + { type: 'raw', value: 'boolean' }, + { type: 'class', value: rangeValueClass, genericTypeParameterInstances: undefined }, + ]; + await expect(ctor.constructParameterRange( + { type: 'union', elements: children }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeUnion', + parameterRangeElements: [ + 'xsd:boolean', + 'mp:components/a/b/file-param.jsonld#ClassParam', + ], + }); + }); + + it('should construct an intersection parameter range', async() => { + const rangeValueClass: ClassReferenceLoaded = { + packageName: 'my-package', + localName: 'ClassParam', + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }; + const children: ParameterRangeResolved[] = [ + { type: 'raw', value: 'boolean' }, + { type: 'class', value: rangeValueClass, genericTypeParameterInstances: undefined }, + ]; + await expect(ctor.constructParameterRange( + { type: 'intersection', elements: children }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeIntersection', + parameterRangeElements: [ + 'xsd:boolean', + 'mp:components/a/b/file-param.jsonld#ClassParam', + ], + }); + }); + + it('should construct a tuple parameter range', async() => { + const rangeValueClass: ClassReferenceLoaded = { + packageName: 'my-package', + localName: 'ClassParam', + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }; + const elements: ParameterRangeResolved[] = [ + { type: 'raw', value: 'boolean' }, + { type: 'class', value: rangeValueClass, genericTypeParameterInstances: undefined }, + ]; + await expect(ctor.constructParameterRange( + { type: 'tuple', elements }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeTuple', + parameterRangeElements: [ + 'xsd:boolean', + 'mp:components/a/b/file-param.jsonld#ClassParam', + ], + }); + }); + + it('should construct a tuple parameter range with rest type', async() => { + const rangeValueClass: ClassReferenceLoaded = { + packageName: 'my-package', + localName: 'ClassParam', + fileName: normalizeFilePath('/docs/package/src/a/b/file-param'), + }; + const elements: ParameterRangeResolved[] = [ + { type: 'rest', value: { type: 'raw', value: 'boolean' }}, + { type: 'class', value: rangeValueClass, genericTypeParameterInstances: undefined }, + ]; + await expect(ctor.constructParameterRange( + { type: 'tuple', elements }, + context, + externalContextsCallback, + 'mp:components/a/b/file-param.jsonld#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeTuple', + parameterRangeElements: [ + { + '@type': 'ParameterRangeRest', + parameterRangeValue: 'xsd:boolean', + }, + 'mp:components/a/b/file-param.jsonld#ClassParam', + ], + }); + }); + + it('should construct an array parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'array', value: { type: 'raw', value: 'boolean' }}, + context, + externalContextsCallback, + 'mp:a/b/file-param#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:boolean', + }); + }); + + it('should construct a generic type reference range', async() => { + await expect(ctor.constructParameterRange( + { type: 'genericTypeReference', value: 'T', origin: classReference }, + context, + externalContextsCallback, + 'mp:a/b/file-param#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeGenericTypeReference', + parameterRangeGenericType: 'mp:components/a/b/file-param.jsonld#MyClass__generic_T', + }); + }); + + it('should construct a keyof parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'keyof', value: { type: 'raw', value: 'boolean' }}, + context, + externalContextsCallback, + 'mp:a/b/file-param#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeKeyof', + parameterRangeValue: 'xsd:boolean', + }); + }); + + it('should construct a typeof parameter range', async() => { + await expect(ctor.constructParameterRange( + { type: 'typeof', value: { type: 'raw', value: 'boolean' }}, + context, + externalContextsCallback, + 'mp:a/b/file-param#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeTypeof', + parameterRangeValue: 'xsd:boolean', + }); + }); + + it('should construct an indexed parameter range', async() => { + await expect(ctor.constructParameterRange( + { + type: 'indexed', + object: { type: 'raw', value: 'boolean' }, + index: { type: 'raw', value: 'boolean' }, + }, + context, + externalContextsCallback, + 'mp:a/b/file-param#MyClass_field', + )).resolves.toEqual({ + '@type': 'ParameterRangeIndexed', + parameterRangeIndexedObject: 'xsd:boolean', + parameterRangeIndexedIndex: 'xsd:boolean', }); }); }); @@ -1783,8 +2729,6 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: false, - unique: false, comment: undefined, }); expect(field).toEqual({ @@ -1798,8 +2742,6 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: false, - unique: false, comment: 'Hi', }); expect(field).toEqual({ @@ -1814,29 +2756,10 @@ describe('ComponentConstructor', () => { type: 'field', name: 'field', range: { type: 'raw', value: 'boolean' }, - required: false, - unique: true, - comment: undefined, - }); - expect(field).toEqual({ - '@id': 'ex:field', - unique: true, - }); - }); - - it('should fill in the required flag', () => { - const field = { '@id': 'ex:field' }; - ctor.populateOptionalParameterFields(field, { - type: 'field', - name: 'field', - range: { type: 'raw', value: 'boolean' }, - required: true, - unique: false, comment: undefined, }); expect(field).toEqual({ '@id': 'ex:field', - required: true, }); }); }); diff --git a/test/serialize/ComponentSerialize.test.ts b/test/serialize/ComponentSerialize.test.ts index de76a1d..0b0e24f 100644 --- a/test/serialize/ComponentSerialize.test.ts +++ b/test/serialize/ComponentSerialize.test.ts @@ -1,5 +1,5 @@ -import * as Path from 'path'; import { ComponentSerializer } from '../../lib/serialize/ComponentSerializer'; +import { normalizeFilePath } from '../../lib/util/PathUtil'; import { ResolutionContextMocked } from '../ResolutionContextMocked'; describe('ComponentSerializer', () => { @@ -22,12 +22,12 @@ describe('ComponentSerializer', () => { describe('serializeComponents', () => { it('should not create files for no components', async() => { - expect(await serializer.serializeComponents({})).toEqual([]); + await expect(serializer.serializeComponents({})).resolves.toEqual([]); expect(resolutionContext.contentsOverrides).toEqual({}); }); it('should create files for components', async() => { - expect(await serializer.serializeComponents({ + await expect(serializer.serializeComponents({ 'a/b/file1': { '@context': [], '@id': 'myfile', @@ -38,7 +38,7 @@ describe('ComponentSerializer', () => { '@id': 'myfile', components: [], }, - })).toEqual([ + })).resolves.toEqual([ 'a/b/file1.jsonld', 'a/b/file2.jsonld', ]); @@ -59,7 +59,7 @@ describe('ComponentSerializer', () => { describe('serializeComponentsIndex', () => { it('should handle a valid components index', async() => { - expect(await serializer.serializeComponentsIndex({ + await expect(serializer.serializeComponentsIndex({ '@context': [ 'http://example.org/my-package/context.jsonld', ], @@ -71,9 +71,9 @@ describe('ComponentSerializer', () => { 'ex:my-package/file2.jsonld', 'ex:my-package/file/a/b/c.jsonld', ], - })).toEqual(Path.normalize('/components/components.jsonld')); + })).resolves.toEqual(normalizeFilePath('/components/components.jsonld')); expect(resolutionContext.contentsOverrides).toEqual({ - [Path.normalize('/components/components.jsonld')]: `{ + [normalizeFilePath('/components/components.jsonld')]: `{ "@context": [ "http://example.org/my-package/context.jsonld" ], @@ -92,15 +92,15 @@ describe('ComponentSerializer', () => { describe('serializeContext', () => { it('should handle a valid context', async() => { - expect(await serializer.serializeContext({ + await expect(serializer.serializeContext({ '@context': [ { a: 'b', }, ], - })).toEqual(Path.normalize('/components/context.jsonld')); + })).resolves.toEqual(normalizeFilePath('/components/context.jsonld')); expect(resolutionContext.contentsOverrides).toEqual({ - [Path.normalize('/components/context.jsonld')]: `{ + [normalizeFilePath('/components/context.jsonld')]: `{ "@context": [ { "a": "b" diff --git a/test/serialize/ContextConstructor.test.ts b/test/serialize/ContextConstructor.test.ts index 149f04c..11e2fe4 100644 --- a/test/serialize/ContextConstructor.test.ts +++ b/test/serialize/ContextConstructor.test.ts @@ -1,6 +1,10 @@ +import semverMajor = require('semver/functions/major'); import type { PackageMetadata } from '../../lib/parse/PackageMetadataLoader'; import { ContextConstructor } from '../../lib/serialize/ContextConstructor'; +// eslint-disable-next-line import/extensions +const CJS_MAJOR_VERSION = semverMajor(require('componentsjs/package.json').version); + describe('ContextConstructor', () => { let ctor: ContextConstructor; let packageMetadata: PackageMetadata; @@ -18,25 +22,24 @@ describe('ContextConstructor', () => { }; ctor = new ContextConstructor({ packageMetadata, - typeScopedContexts: false, }); }); describe('getPackageNamePrefix', () => { it('should handle a name with one component', () => { - expect(ContextConstructor.getPackageNamePrefix('package')).toEqual('p'); + expect(ContextConstructor.getPackageNamePrefix('package')).toBe('p'); }); it('should handle a name with two components', () => { - expect(ContextConstructor.getPackageNamePrefix('my-package')).toEqual('mp'); + expect(ContextConstructor.getPackageNamePrefix('my-package')).toBe('mp'); }); it('should handle a name with three components', () => { - expect(ContextConstructor.getPackageNamePrefix('my-package-stuff')).toEqual('mps'); + expect(ContextConstructor.getPackageNamePrefix('my-package-stuff')).toBe('mps'); }); it('should handle a scoped name with three components', () => { - expect(ContextConstructor.getPackageNamePrefix('@personal/my-package-stuff')).toEqual('pmps'); + expect(ContextConstructor.getPackageNamePrefix('@personal/my-package-stuff')).toBe('pmps'); }); }); @@ -44,11 +47,10 @@ describe('ContextConstructor', () => { it('should handle undefined component definitions', () => { expect(ctor.constructContext()).toEqual({ '@context': [ - 'https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^4.0.0/components/context.jsonld', + `https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^${CJS_MAJOR_VERSION}.0.0/components/context.jsonld`, { npmd: 'https://linkedsoftwaredependencies.org/bundles/npm/', - mp: 'npmd:my-package/', - 'files-mp': 'mp:^2.0.0/', + mp: 'npmd:my-package/^2.0.0/', }, ], }); @@ -67,6 +69,7 @@ describe('ContextConstructor', () => { '@type': 'Class', constructorArguments: [], parameters: [], + memberFields: [], requireElement: 'MyClass1', }, ], @@ -83,23 +86,25 @@ describe('ContextConstructor', () => { requireElement: 'MyClass2', constructorArguments: [], parameters: [], + memberFields: [], }, ], }, })).toEqual({ '@context': [ - 'https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^4.0.0/components/context.jsonld', + `https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^${CJS_MAJOR_VERSION}.0.0/components/context.jsonld`, { MyClass1: { '@id': 'mp:file1#MyClass1', '@prefix': true, + '@context': {}, }, MyClass2: { '@id': 'mp:b/file2#MyClass2', '@prefix': true, + '@context': {}, }, - 'files-mp': 'mp:^2.0.0/', - mp: 'npmd:my-package/', + mp: 'npmd:my-package/^2.0.0/', npmd: 'https://linkedsoftwaredependencies.org/bundles/npm/', }, ], @@ -124,7 +129,446 @@ describe('ContextConstructor', () => { '@id': 'mp:file1#MyClass1', '@type': 'Class', constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + { + '@id': 'mp:file1#MyClass1_param2', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + param1: { + '@id': 'mp:file1#MyClass1_param1', + '@container': '@list', + }, + param2: { + '@id': 'mp:file1#MyClass1_param2', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions with two prefixes', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_args_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + { + '@id': 'mp:file1#MyClass1_args_param2', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + args_param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + args_param2: { + '@id': 'mp:file1#MyClass1_args_param2', + }, + param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + param2: { + '@id': 'mp:file1#MyClass1_args_param2', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions with three shared prefixes', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_args_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + { + '@id': 'mp:file1#MyClass1_args_param2', + }, + { + '@id': 'mp:file1#MyClass1_args_param3', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + args_param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + args_param2: { + '@id': 'mp:file1#MyClass1_args_param2', + }, + args_param3: { + '@id': 'mp:file1#MyClass1_args_param3', + }, + param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + param2: { + '@id': 'mp:file1#MyClass1_args_param2', + }, + param3: { + '@id': 'mp:file1#MyClass1_args_param3', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions with complex shared prefixes', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_args_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + { + '@id': 'mp:file1#MyClass1_args_x_param2', + }, + { + '@id': 'mp:file1#MyClass1_args_x_param3', + }, + { + '@id': 'mp:file1#MyClass1_args_param4', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + args_param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + args_x_param2: { + '@id': 'mp:file1#MyClass1_args_x_param2', + }, + args_x_param3: { + '@id': 'mp:file1#MyClass1_args_x_param3', + }, + args_param4: { + '@id': 'mp:file1#MyClass1_args_param4', + }, + param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + x_param2: { + '@id': 'mp:file1#MyClass1_args_x_param2', + }, + x_param3: { + '@id': 'mp:file1#MyClass1_args_x_param3', + }, + param4: { + '@id': 'mp:file1#MyClass1_args_param4', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions with nearly shared prefixes', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_args_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + { + '@id': 'mp:file1#MyClass1_args_param2', + }, + { + '@id': 'mp:file1#MyClass1_param3', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + args_param1: { + '@id': 'mp:file1#MyClass1_args_param1', + '@container': '@list', + }, + args_param2: { + '@id': 'mp:file1#MyClass1_args_param2', + }, + param3: { + '@id': 'mp:file1#MyClass1_param3', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions without shared prefixes', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + param1: { + '@id': 'mp:file1#MyClass1_param1', + '@container': '@list', + }, + }, + }, + }); + }); + + it('should handle non-empty component definitions for JSON ranges', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_param1', + range: 'rdf:JSON', + }, + { + '@id': 'mp:file1#MyClass1_param2', + range: 'rdf:JSON', + }, + ], + memberFields: [], requireElement: 'MyClass1', }, ], @@ -141,6 +585,7 @@ describe('ContextConstructor', () => { requireElement: 'MyClass2', constructorArguments: [], parameters: [], + memberFields: [], }, ], }, @@ -148,18 +593,98 @@ describe('ContextConstructor', () => { MyClass1: { '@id': 'mp:file1#MyClass1', '@prefix': true, + '@context': { + param1: { + '@id': 'mp:file1#MyClass1_param1', + '@type': '@json', + }, + param2: { + '@id': 'mp:file1#MyClass1_param2', + '@type': '@json', + }, + }, }, MyClass2: { '@id': 'mp:b/file2#MyClass2', '@prefix': true, + '@context': {}, }, }); }); - it('should handle non-empty component definitions when typeScopedContexts is true', () => { + it('should handle non-empty component definitions for JSON ranges in arrays', () => { + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_param1', + range: { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'rdf:JSON', + }, + }, + { + '@id': 'mp:file1#MyClass1_param2', + range: 'rdf:JSON', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + param1: { + '@id': 'mp:file1#MyClass1_param1', + '@type': '@json', + '@container': '@list', + }, + param2: { + '@id': 'mp:file1#MyClass1_param2', + '@type': '@json', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions when typeScopedContexts is true for opt arrays', () => { ctor = new ContextConstructor({ packageMetadata, - typeScopedContexts: true, }); expect(ctor.constructComponentShortcuts({ '/docs/package/components/file1': { @@ -175,13 +700,22 @@ describe('ContextConstructor', () => { parameters: [ { '@id': 'mp:file1#MyClass1_param1', - unique: false, + range: { + '@type': 'ParameterRangeUnion', + parameterRangeElements: [ + { '@type': 'ParameterRangeUndefined' }, + { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + ], + }, }, { '@id': 'mp:file1#MyClass1_param2', - unique: true, }, ], + memberFields: [], requireElement: 'MyClass1', }, ], @@ -198,6 +732,7 @@ describe('ContextConstructor', () => { requireElement: 'MyClass2', constructorArguments: [], parameters: [], + memberFields: [], }, ], }, @@ -223,10 +758,9 @@ describe('ContextConstructor', () => { }); }); - it('should handle non-empty component definitions when typeScopedContexts is true for JSON ranges', () => { + it('should handle non-empty component definitions when typeScopedContexts is true for opt arrays (2)', () => { ctor = new ContextConstructor({ packageMetadata, - typeScopedContexts: true, }); expect(ctor.constructComponentShortcuts({ '/docs/package/components/file1': { @@ -242,13 +776,22 @@ describe('ContextConstructor', () => { parameters: [ { '@id': 'mp:file1#MyClass1_param1', - range: 'rdf:JSON', + range: { + '@type': 'ParameterRangeUnion', + parameterRangeElements: [ + { + '@type': 'ParameterRangeArray', + parameterRangeValue: 'xsd:float', + }, + { '@type': 'ParameterRangeUndefined' }, + ], + }, }, { '@id': 'mp:file1#MyClass1_param2', - range: 'rdf:JSON', }, ], + memberFields: [], requireElement: 'MyClass1', }, ], @@ -265,6 +808,80 @@ describe('ContextConstructor', () => { requireElement: 'MyClass2', constructorArguments: [], parameters: [], + memberFields: [], + }, + ], + }, + })).toEqual({ + MyClass1: { + '@id': 'mp:file1#MyClass1', + '@prefix': true, + '@context': { + param1: { + '@id': 'mp:file1#MyClass1_param1', + '@container': '@list', + }, + param2: { + '@id': 'mp:file1#MyClass1_param2', + }, + }, + }, + MyClass2: { + '@id': 'mp:b/file2#MyClass2', + '@prefix': true, + '@context': {}, + }, + }); + }); + + it('should handle non-empty component definitions when typeScopedContexts is true for union types', () => { + ctor = new ContextConstructor({ + packageMetadata, + }); + expect(ctor.constructComponentShortcuts({ + '/docs/package/components/file1': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:file1#MyClass1', + '@type': 'Class', + constructorArguments: [], + parameters: [ + { + '@id': 'mp:file1#MyClass1_param1', + range: { + '@type': 'ParameterRangeUnion', + parameterRangeElements: [ + { '@type': 'ParameterRangeUndefined' }, + { '@type': 'ParameterRangeUndefined' }, + ], + }, + }, + { + '@id': 'mp:file1#MyClass1_param2', + }, + ], + memberFields: [], + requireElement: 'MyClass1', + }, + ], + }, + '/docs/package/components/b/file2': { + '@context': [ + 'https://linkedsoftwaredependencies.org/bundles/npm/my-package/context.jsonld', + ], + '@id': 'npmd:my-package', + components: [ + { + '@id': 'mp:b/file2#MyClass2', + '@type': 'Class', + requireElement: 'MyClass2', + constructorArguments: [], + parameters: [], + memberFields: [], }, ], }, @@ -275,11 +892,9 @@ describe('ContextConstructor', () => { '@context': { param1: { '@id': 'mp:file1#MyClass1_param1', - '@type': '@json', }, param2: { '@id': 'mp:file1#MyClass1_param2', - '@type': '@json', }, }, }, @@ -307,7 +922,6 @@ describe('ContextConstructor', () => { }; ctor = new ContextConstructor({ packageMetadata, - typeScopedContexts: false, }); }); @@ -324,6 +938,7 @@ describe('ContextConstructor', () => { '@type': 'Class', constructorArguments: [], parameters: [], + memberFields: [], requireElement: 'MyClass1', }, ], @@ -340,23 +955,25 @@ describe('ContextConstructor', () => { requireElement: 'MyClass2', constructorArguments: [], parameters: [], + memberFields: [], }, ], }, })).toEqual({ '@context': [ - 'https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^4.0.0/components/context.jsonld', + `https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^${CJS_MAJOR_VERSION}.0.0/components/context.jsonld`, { MyClass1: { '@id': 'mp:file1#MyClass1', '@prefix': true, + '@context': {}, }, MyClass2: { '@id': 'mp:b/file2#MyClass2', '@prefix': true, + '@context': {}, }, - 'files-test': 'test:^2.0.0/', - test: 'npmd:my-package/', + test: 'npmd:my-package/^2.0.0/', npmd: 'https://linkedsoftwaredependencies.org/bundles/npm/', }, ], diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index a150bc3..dccccc3 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "include": [ - "index.ts", + "jest.config.ts", "lib/**/*.ts", "test/**/*.ts", "bin/**/*.ts" diff --git a/tsconfig.json b/tsconfig.json index 2aa7ed3..7ac3250 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,23 +1,22 @@ { "compileOnSave": true, "compilerOptions": { - "module": "commonjs", + "target": "es2021", "lib": [ - "es6", + "es2021", "dom" ], - "target": "es2017", + "module": "commonjs", + "strict": true, "noImplicitAny": true, - "removeComments": false, - "preserveConstEnums": true, - "sourceMap": true, - "inlineSources": true, "declaration": true, "importHelpers": false, - "strict": true + "inlineSources": true, + "preserveConstEnums": true, + "removeComments": false, + "sourceMap": true }, "include": [ - "index.ts", "bin/**/*", "lib/**/*" ], diff --git a/yarn.lock b/yarn.lock index 9556d7c..f632e01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6900 +1,9400 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/compat-data@^7.13.15": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== - -"@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" - integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.4" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" - 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.7.2": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.11.0", "@babel/generator@^7.11.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" - integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== - dependencies: - "@babel/types" "^7.12.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3", "@babel/generator@^7.7.2": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== - dependencies: - "@babel/types" "^7.14.2" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== - dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^6.3.0" - -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.13.12": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" - integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" - integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== - -"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.7.2": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" - integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== - -"@babel/parser@^7.12.5", "@babel/parser@^7.7.0": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" - integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - 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.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - 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.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - 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.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - 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.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/template@^7.10.4", "@babel/template@^7.3.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.7.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.7.0": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" - integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.5" - "@babel/types" "^7.12.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" - integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.5", "@babel/types@^7.7.0": - version "7.12.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" - integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@comunica/actor-abstract-mediatyped@^1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-abstract-mediatyped/-/actor-abstract-mediatyped-1.21.1.tgz#b6800f49f312fdf30ccb805f0dfbe8c3e8ca12af" - integrity sha512-5LzWccqId3AfAeCPGqPkOiDATXrooXYLn58sNXDRdDUsRpL/jZ6be+7F000ZLTHnDRVCiLCXtb5P7984bBIzaA== - -"@comunica/actor-http-native@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-http-native/-/actor-http-native-1.21.1.tgz#d2824721560df965b37dd0d935d57ea7b577de30" - integrity sha512-dJlBz8/nQgxH5ARkh8/092BbvQ8vaJ38hjWinLXXakmdj8WsVHnhUJ7/D4YtqY61bjwCBFekOLSPjfxKCEMRgA== - dependencies: - "@comunica/context-entries" "^1.21.1" - "@types/parse-link-header" "^1.0.0" - cross-fetch "^3.0.5" - follow-redirects "^1.5.1" - parse-link-header "^1.0.1" - -"@comunica/actor-rdf-parse-html-microdata@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-html-microdata/-/actor-rdf-parse-html-microdata-1.21.1.tgz#ed021a65e2fa4145f4f008bfa7727f15ef59d5de" - integrity sha512-50EjJ0HYiCdKEb2nebULLGkqLk9XZeLLSPCMDo+4Est65dGXcLkFPerBPTIlcrpOMmVXLry8F7m+fAtDQxUcmw== - dependencies: - microdata-rdf-streaming-parser "^1.1.0" - -"@comunica/actor-rdf-parse-html-rdfa@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-html-rdfa/-/actor-rdf-parse-html-rdfa-1.21.1.tgz#a8724235a455901501879b655c2ec011d36e6015" - integrity sha512-37whUUn3LsvCV/kj37/ztAnBjGqKdGP8fLUpD3z8vDOg3ArhktPvWn+cB0ssU0DKSzsCTnCNujS7QoVyINPxJQ== - dependencies: - rdfa-streaming-parser "^1.4.0" - -"@comunica/actor-rdf-parse-html-script@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-html-script/-/actor-rdf-parse-html-script-1.21.1.tgz#9958fb9c2b6ae2beed6e5c7abd1efe8a8f795f9d" - integrity sha512-cM06ZEVpgj4/fLFrM8alRi0a4kh1XVY3vwWOyZXnkjVkIKp36Nc17Pw4+vM10z7D+x5VI/mZc0tGMohr8u7dcw== - dependencies: - "@comunica/bus-rdf-parse-html" "^1.21.1" - "@types/rdf-js" "*" - relative-to-absolute-iri "^1.0.5" - -"@comunica/actor-rdf-parse-html@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-html/-/actor-rdf-parse-html-1.21.1.tgz#32a15600e15416360cfdab7172cf2f153d156f72" - integrity sha512-eZUExtLtC28nEMrECL2g3kmZjLmuY/Nu7S9p5NyvI60cwEjj1Rbf0aM9xqWLG5vuCiSKQz7MUobQ92WxtG6RHA== - dependencies: - "@comunica/bus-rdf-parse-html" "^1.21.1" - "@types/rdf-js" "*" - htmlparser2 "^6.0.0" - -"@comunica/actor-rdf-parse-jsonld@~1.21.2": - version "1.21.2" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-jsonld/-/actor-rdf-parse-jsonld-1.21.2.tgz#f2fe479db3a5fba32154e4f1bf1eb2149459cf6a" - integrity sha512-YUiYo2EJ9T1oUGgBwzzPRjXT+cd/xckWbtfYBzr7RugXeKjrVai8atnV1OsPc0u5iPZCTkiVCO9sI/Q6M7ig2w== - dependencies: - "@comunica/context-entries" "^1.21.1" - "@types/rdf-js" "*" - jsonld-context-parser "^2.1.2" - jsonld-streaming-parser "^2.3.2" - stream-to-string "^1.2.0" - -"@comunica/actor-rdf-parse-n3@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-n3/-/actor-rdf-parse-n3-1.21.1.tgz#1e781c884ebe1daacb066c509d98b3a87a025bf8" - integrity sha512-SFx/hkY0yr/TxfVdEecVg3DY2KOWPeGfM288CjDQjogx6Sxb6JuF9JaipNX8/twKVdBefGS9b1S9EyKpcr99Zg== - dependencies: - "@types/n3" "^1.4.4" - n3 "^1.6.3" - -"@comunica/actor-rdf-parse-rdfxml@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-rdfxml/-/actor-rdf-parse-rdfxml-1.21.1.tgz#79a5a501e5d44b02acc30eb2afbb377aae2b5518" - integrity sha512-fv5+DF5LagSJUayyQm7a917XQ9PNUfJVh2bqO/NlVfESXO8OFUAIySefW+j1y1JA0fpa5v1OnWTGAfdxGKnrUg== - dependencies: - rdfxml-streaming-parser "^1.4.0" - -"@comunica/actor-rdf-parse-xml-rdfa@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/actor-rdf-parse-xml-rdfa/-/actor-rdf-parse-xml-rdfa-1.21.1.tgz#729ef45f903793944d2f5e332c04eea1996c33ae" - integrity sha512-+9qyKJS+Ab3BWqrWnFU5CSgEDGtoGJpe19TzpymSXDP0aSAM6lnkZpCvT3EKi/Y8Bmw9xRXJZwemtxQK2y4SSQ== - dependencies: - rdfa-streaming-parser "^1.3.0" - -"@comunica/bus-http@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/bus-http/-/bus-http-1.21.1.tgz#c2c5dc8de5ba0aef4e643ca8c13c903c6b8b033e" - integrity sha512-M6gi128ME+7uSnLPz4Bx3jgXhIb5/O7tODVHAtw9gt0z/9AAuYfmW9jqmcZ5Uwv3CCvJSvEc/m+dooCv35dTsA== - dependencies: - "@comunica/context-entries" "^1.21.1" - is-stream "^2.0.0" - web-streams-node "^0.4.0" - -"@comunica/bus-init@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/bus-init/-/bus-init-1.21.1.tgz#3d9717794ec4ee89244df1ce5f2bf7553c76b207" - integrity sha512-h8Gp/iJiyY8mbqhrbfLySwTXasjxmCX6kpM9RyXWqCBJzdx8Bfq6F/nYg2N+zpEJgyrn5zLdNgbBkcDetdeAmA== - -"@comunica/bus-rdf-parse-html@^1.21.1", "@comunica/bus-rdf-parse-html@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/bus-rdf-parse-html/-/bus-rdf-parse-html-1.21.1.tgz#028cfe008b8d392564577009ee401a54c15e1dc5" - integrity sha512-DJDFB8lxTJ1Pt+AhjOqe9hvj2nKtC23fJfEihU7DYIbz67O5pXAFgFtp9gn3gefoGB7T/CKoB8y8DcZy8N5u0A== - dependencies: - "@types/rdf-js" "*" - -"@comunica/bus-rdf-parse@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/bus-rdf-parse/-/bus-rdf-parse-1.21.1.tgz#d27d1e00826e712435b9cba86e1a85d611182cd2" - integrity sha512-JQD9Cgml/W+PCSEX3WulwxiQOdULFxAFDipLk69/J9WZxOj6emufxStM8M9R+pavbLaLYRcBQWgO0KLhEn/Rnw== - dependencies: - "@comunica/actor-abstract-mediatyped" "^1.21.1" - "@types/rdf-js" "*" - -"@comunica/context-entries@^1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/context-entries/-/context-entries-1.21.1.tgz#c74b03d6f35a719d04fcced07b017e5e8ff9ea2e" - integrity sha512-7wBb+J+YLg4hcRQLFeP6/2b/xyK+lnQlc71OSjVMinQx1OO6tsjqlqHvQ6py56uVFs3cYduASgFuHTRVuoe1xA== - -"@comunica/core@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/core/-/core-1.21.1.tgz#6471d0253a15ffc1e4564568f1266fbf92838d1a" - integrity sha512-5lY/HkyOCorY2CtxQiKUKEOcUGjIKf/YG/txJrz84SKuy+zC91zq1Zt8qWfzNihCcWrgfmk0oZuvjbYvZGK4EA== - dependencies: - "@comunica/context-entries" "^1.21.1" - "@comunica/types" "^1.21.1" - immutable "^3.8.2" - -"@comunica/mediator-combine-union@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/mediator-combine-union/-/mediator-combine-union-1.21.1.tgz#264588cb81e69273ac2dd40478df076d7053693b" - integrity sha512-wp2lbViVOOeNKTBRD+6sze7TKVX71T2RD324/1Syb8vOpwT3mtaDNJYFg0Mrwer/Xs54d7nA7JGZA2wC2HaXow== - -"@comunica/mediator-number@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/mediator-number/-/mediator-number-1.21.1.tgz#abe79325351d418f9f1efbd36b1937133c5c6d60" - integrity sha512-OeuGx0R/mWI1uMMXM2V1vcR8J1DPhYXPR+Ncg4/qKHl7tSCQH1tlCgZu0+fovY2Qmc14f1tmw5YgnsE8lsikSQ== - -"@comunica/mediator-race@~1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/mediator-race/-/mediator-race-1.21.1.tgz#bf2ff6d93f439708f6ed1b97b0dda0554112ef6b" - integrity sha512-SgdtF1JmqDyhZJsAOiVMPuV1qgdXqv/hbsFCxcmDQ+8q1ObmQ+0DZvdUe5Ymf2IyFaevsOHHG7hF5hJbLZmdmQ== - -"@comunica/types@^1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@comunica/types/-/types-1.21.1.tgz#01990e79325704cca9f7dd83d801f38772d22f35" - integrity sha512-Sdp8m9yvKbcCSx31L4nLe0tORCRc1TvUXSgpIUVGBXunqZpoWAhxcn2PZn7//xb6xnYUjHqrQZhYQbMdDIqONQ== - dependencies: - "@types/rdf-js" "*" - asynciterator "^3.1.0" - immutable "^3.8.2" - sparqlalgebrajs "^2.4.0" - -"@dabh/diagnostics@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" - integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@eslint/eslintrc@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" - integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.19" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@hutson/parse-repository-url@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" - integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - 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" - -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/console@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.0.1.tgz#c6acfec201f9b6823596eb6c4fcd77c89a8b27e9" - integrity sha512-50E6nN2F5cAXn1lDljn0gE9F0WFXHYz/u0EeR7sOt4nbRPNli34ckbl6CUDaDABJbHt62DYnyQAIB3KgdzwKDw== - dependencies: - "@jest/types" "^27.0.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.0.1" - jest-util "^27.0.1" - slash "^3.0.0" - -"@jest/core@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.0.1.tgz#88d0ff55f465fe1fc3a940718e8cf0fea242be4b" - integrity sha512-PiCbKSMf6t8PEfY3MAd0Ldn3aJAt5T+UcaFkAfMZ1VZgas35+fXk5uHIjAQHQLNIHZWX19TLv0wWNT03yvrw6w== - dependencies: - "@jest/console" "^27.0.1" - "@jest/reporters" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^27.0.1" - jest-config "^27.0.1" - jest-haste-map "^27.0.1" - jest-message-util "^27.0.1" - jest-regex-util "^27.0.1" - jest-resolve "^27.0.1" - jest-resolve-dependencies "^27.0.1" - jest-runner "^27.0.1" - jest-runtime "^27.0.1" - jest-snapshot "^27.0.1" - jest-util "^27.0.1" - jest-validate "^27.0.1" - jest-watcher "^27.0.1" - micromatch "^4.0.4" - p-each-series "^2.1.0" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.1.tgz#27ed89bf8179c0a030690f063d922d6da7a519ac" - integrity sha512-nG+r3uSs2pOTsdhgt6lUm4ZGJLRcTc6HZIkrFsVpPcdSqEpJehEny9r9y2Bmhkn8fKXWdGCYJKF3i4nKO0HSmA== - dependencies: - "@jest/fake-timers" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - jest-mock "^27.0.1" - -"@jest/fake-timers@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.1.tgz#6987a596b0bcf8c07653086076c17058b4c77b5c" - integrity sha512-3CyLJQnHzKI4TCJSCo+I9TzIHjSK4RrNEk93jFM6Q9+9WlSJ3mpMq/p2YuKMe0SiHKbmZOd5G/Ll5ofF9Xkw9g== - dependencies: - "@jest/types" "^27.0.1" - "@sinonjs/fake-timers" "^7.0.2" - "@types/node" "*" - jest-message-util "^27.0.1" - jest-mock "^27.0.1" - jest-util "^27.0.1" - -"@jest/globals@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.1.tgz#14c776942f7047a04f2aea09b148065e2aa9d7e9" - integrity sha512-80ZCzgopysKdpp5EOglgjApKxiNDR96PG4PwngB4fTwZ4qqqSKo0EwGwQIhl16szQ1M2xCVYmr9J6KelvnABNQ== - dependencies: - "@jest/environment" "^27.0.1" - "@jest/types" "^27.0.1" - expect "^27.0.1" - -"@jest/reporters@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.1.tgz#5b491f64e37c9b97b13e564f18f36b6697d28045" - integrity sha512-lZbJWuS1h/ytKERfu1D6tEQ4PuQ7+15S4+HrSzHR0i7AGVT1WRo49h4fZqxASOp7AQCupUVtPJNZDkaG9ZXy0g== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.0.1" - jest-resolve "^27.0.1" - jest-util "^27.0.1" - jest-worker "^27.0.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/source-map@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.1.tgz#2afbf73ddbaddcb920a8e62d0238a0a9e0a8d3e4" - integrity sha512-yMgkF0f+6WJtDMdDYNavmqvbHtiSpwRN2U/W+6uztgfqgkq/PXdKPqjBTUF1RD/feth4rH5N3NW0T5+wIuln1A== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-result@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.0.1.tgz#8fb97214268ea21cf8cfb83edc0f17e558b3466d" - integrity sha512-5aa+ibX2dsGSDLKaQMZb453MqjJU/CRVumebXfaJmuzuGE4qf87yQ2QZ6PEpEtBwVUEgrJCzi3jLCRaUbksSuw== - dependencies: - "@jest/console" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.1.tgz#2a3b85130978fc545d8ee6c34d65ff4231dbad86" - integrity sha512-yK2c2iruJ35WgH4KH8whS72uH+FASJUrzwxzNKTzLAEWmNpWKNEPOsSEKsHynvz78bLHafrTg4adN7RrYNbEOA== - dependencies: - "@jest/test-result" "^27.0.1" - graceful-fs "^4.2.4" - jest-haste-map "^27.0.1" - jest-runner "^27.0.1" - jest-runtime "^27.0.1" - -"@jest/transform@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.1.tgz#a9ece291f82273d5e58132550996c16edd5a902a" - integrity sha512-LC95VpT6wMnQ96dRJDlUiAnW/90zyh4+jS30szI/5AsfS0qwSlr/O4TPcGoD2WVaVMfo6KvR+brvOtGyMHaNhA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.0.1" - babel-plugin-istanbul "^6.0.0" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^27.0.1" - jest-regex-util "^27.0.1" - jest-util "^27.0.1" - micromatch "^4.0.4" - pirates "^4.0.1" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" - -"@jest/types@^27.0.1": - version "27.0.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.0.1.tgz#631738c942e70045ebbf42a3f9b433036d3845e4" - integrity sha512-8A25RRV4twZutsx2D+7WphnDsp7If9Yu6ko0Gxwrwv8BiWESFzka34+Aa2kC8w9xewt7SDuCUSZ6IiAFVj3PRg== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@microsoft/tsdoc-config@0.13.6": - version "0.13.6" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.13.6.tgz#2154785e264edaa515ce5bb2a6c9cd7865f356cf" - integrity sha512-VJjV35PnrNISoX2WMemZjnCIdOUPTRpCz6pu8inISotLd3SgoDSJygGaE7+lOYdCtDl+4c8PWJdZivxxXgOnLw== - dependencies: - "@microsoft/tsdoc" "0.12.21" - ajv "~6.12.3" - jju "~1.4.0" - resolve "~1.12.0" - -"@microsoft/tsdoc@0.12.21": - version "0.12.21" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.21.tgz#1098c393634826ed47386862a1241ce8b7c0cf0d" - integrity sha512-j+9OJ0A0buZZaUn6NxeHUVpoa05tY2PgVs7kXJhJQiKRB0G1zQqbJxer3T7jWtzpqQWP89OBDluyIeyTsMk8Sg== - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@rubensworks/eslint-config@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@rubensworks/eslint-config/-/eslint-config-1.0.1.tgz#90698e2222b2cb1b05d03c87c22615e7badcccd7" - integrity sha512-irpYgLY/Tq+tBcISorM+kiEY75f2m0WGi+PcrnfszuDOmdRSbcTIs+AKftzYTz20MeiLdq8yKhi4/bMScV3Bmw== - -"@sinonjs/commons@^1.7.0": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" - integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^7.0.2": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e" - integrity sha512-hAEzXi6Wbvlb67NnGMGSNOeAflLVnMa4yliPU/ty1qjgW/vAletH15/v/esJwASSIA0YlIyjnloenFbEZc9q9A== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__core@^7.1.14": - version "7.1.14" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" - integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== - dependencies: - "@babel/types" "^7.3.0" - -"@types/babel__traverse@^7.0.4": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" - integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== - dependencies: - "@babel/types" "^7.3.0" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/fs-extra@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918" - integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg== - dependencies: - "@types/node" "*" - -"@types/glob@*": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" - integrity sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ== - dependencies: - "@types/node" "*" - -"@types/http-link-header@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/http-link-header/-/http-link-header-1.0.1.tgz#411493fe06da4b9472fa4eeecc990ea92be8cc2a" - integrity sha512-5h+Pqs4EHoMkY/fLva7XsYmh9IVQghQ6uWWil1FGCNI0WqjhI4g20doYsbT4kJ/G3GkAlQca4AIc9OexdUnzkg== - -"@types/isomorphic-fetch@^0.0.35": - version "0.0.35" - resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz#c1c0d402daac324582b6186b91f8905340ea3361" - integrity sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^26.0.0": - version "26.0.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.10.tgz#8faf7e9756c033c39014ae76a7329efea00ea607" - integrity sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q== - dependencies: - jest-diff "^25.2.1" - pretty-format "^25.2.1" - -"@types/json-schema@^7.0.3": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/jsonld@^1.5.0": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/jsonld/-/jsonld-1.5.1.tgz#361e98bdc07814f5c98a42b4063430b243a8fa9b" - integrity sha512-8XI88iiCBVqmNCMBqPOgJhJPPuiIW1Tp2sXqe3NwD137ljhQVkDWY8cuYBBDZQoBYfGzUJvja527bbwqVbRnHQ== - -"@types/lru-cache@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" - integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - -"@types/n3@^1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@types/n3/-/n3-1.4.4.tgz#ed4f58200766ffc850d281e28c566eacb2b0b592" - integrity sha512-xsWfwyDh0uAH0CXvwqe9vb2UEDafMjRez/pB7yZwbWpd9Olw2wdxaL32FtdHjmmFE6b9i+j249JfRyZnvWkoqg== - dependencies: - "@types/node" "*" - "@types/rdf-js" "*" - -"@types/node@*": - version "14.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499" - integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== - -"@types/node@^13.1.0": - version "13.13.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.15.tgz#fe1cc3aa465a3ea6858b793fd380b66c39919766" - integrity sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw== - -"@types/node@^14.14.7": - version "14.14.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340" - integrity sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/parse-link-header@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-link-header/-/parse-link-header-1.0.0.tgz#69f059e40a0fa93dc2e095d4142395ae6adc5d7a" - integrity sha512-fCA3btjE7QFeRLfcD0Sjg+6/CnmC66HpMBoRfRzd2raTaWMJV21CCZ0LO8MOqf8onl5n0EPfjq4zDhbyX8SVwA== - -"@types/prettier@^2.1.5": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" - integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== - -"@types/rdf-js@*", "@types/rdf-js@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/rdf-js/-/rdf-js-4.0.0.tgz#96f7314b09b77ecd16fca7f358db90db8ac86d1b" - integrity sha512-2uaR7ks0380MqzUWGOPOOk9yZIr/6MOaCcaj3ntKgd2PqNocgi8j5kSHIJTDe+5ABtTHqKMSE0v0UqrsT8ibgQ== - dependencies: - "@types/node" "*" - -"@types/rimraf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" - integrity sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ== - dependencies: - "@types/glob" "*" - "@types/node" "*" - -"@types/semver@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb" - integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ== - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== - -"@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== - -"@types/yargs@^13.0.0": - version "13.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b" - integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^15.0.0": - version "15.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" - integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^16.0.0": - version "16.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.3.tgz#4b6d35bb8e680510a7dc2308518a80ee1ef27e01" - integrity sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@4.6.1", "@typescript-eslint/eslint-plugin@^4.2.0": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz#99d77eb7a016fd5a5e749d2c44a7e4c317eb7da3" - integrity sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA== - dependencies: - "@typescript-eslint/experimental-utils" "4.6.1" - "@typescript-eslint/scope-manager" "4.6.1" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/eslint-plugin@^2.3.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== - dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz#a9c691dfd530a9570274fe68907c24c07a06c4aa" - integrity sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.6.1" - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/typescript-estree" "4.6.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.0.1.tgz#7d9a3ab6821ad5274dad2186c1aa0d93afd696eb" - integrity sha512-gAqOjLiHoED79iYTt3F4uSHrYmg/GPz/zGezdB0jAdr6S6gwNiR/j7cTZ8nREKVzMVKLd9G3xbg1sV9GClW3sw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.0.1" - "@typescript-eslint/types" "4.0.1" - "@typescript-eslint/typescript-estree" "4.0.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@4.6.1", "@typescript-eslint/parser@^4.1.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.6.1.tgz#b801bff67b536ecc4a840ac9289ba2be57e02428" - integrity sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ== - dependencies: - "@typescript-eslint/scope-manager" "4.6.1" - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/typescript-estree" "4.6.1" - debug "^4.1.1" - -"@typescript-eslint/scope-manager@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.0.1.tgz#24d93c3000bdfcc5a157dc4d32b742405a8631b5" - integrity sha512-u3YEXVJ8jsj7QCJk3om0Y457fy2euEOkkzxIB/LKU3MdyI+FJ2gI0M4aKEaXzwCSfNDiZ13a3lDo5DVozc+XLQ== - dependencies: - "@typescript-eslint/types" "4.0.1" - "@typescript-eslint/visitor-keys" "4.0.1" - -"@typescript-eslint/scope-manager@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz#21872b91cbf7adfc7083f17b8041149148baf992" - integrity sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg== - dependencies: - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/visitor-keys" "4.6.1" - -"@typescript-eslint/types@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.0.1.tgz#1cf72582f764931f085cb8230ff215980fe467b2" - integrity sha512-S+gD3fgbkZYW2rnbjugNMqibm9HpEjqZBZkTiI3PwbbNGWmAcxolWIUwZ0SKeG4Dy2ktpKKaI/6+HGYVH8Qrlg== - -"@typescript-eslint/types@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.6.1.tgz#d3ad7478f53f22e7339dc006ab61aac131231552" - integrity sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w== - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.0.1.tgz#29a43c7060641ec51c902d9f50ac7c5866ec479f" - integrity sha512-zGzleORFXrRWRJAMLTB2iJD1IZbCPkg4hsI8mGdpYlKaqzvKYSEWVAYh14eauaR+qIoZVWrXgYSXqLtTlxotiw== - dependencies: - "@typescript-eslint/types" "4.0.1" - "@typescript-eslint/visitor-keys" "4.0.1" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@4.6.1", "@typescript-eslint/typescript-estree@^4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz#6025cce724329413f57e4959b2d676fceeca246f" - integrity sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ== - dependencies: - "@typescript-eslint/types" "4.6.1" - "@typescript-eslint/visitor-keys" "4.6.1" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/visitor-keys@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.0.1.tgz#d4e8de62775f2a6db71c7e8539633680039fdd6c" - integrity sha512-yBSqd6FjnTzbg5RUy9J+9kJEyQjTI34JdGMJz+9ttlJzLCnGkBikxw+N5n2VDcc3CesbIEJ0MnZc5uRYnrEnCw== - dependencies: - "@typescript-eslint/types" "4.0.1" - eslint-visitor-keys "^2.0.0" - -"@typescript-eslint/visitor-keys@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz#6b125883402d8939df7b54528d879e88f7ba3614" - integrity sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw== - dependencies: - "@typescript-eslint/types" "4.6.1" - eslint-visitor-keys "^2.0.0" - -abab@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" - integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== - -abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== - -acorn@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" - integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@~6.12.3: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== - 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@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - 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" - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - 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.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -array.prototype.flatmap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" - integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - -arrayify-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/arrayify-stream/-/arrayify-stream-1.0.0.tgz#9e8e113d43325c3a44e965c59b5b89d962b9a37f" - integrity sha512-RP80ep76Lbew2wWN5ogrl2NluTnBVYYh2K3NNCcWfcmmUB7nBcNBctiJeEZAixp3I1vQ9H88iHZ9MbHSdkuupQ== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - -asynciterator@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/asynciterator/-/asynciterator-3.1.0.tgz#ebf7142f7ed7bc32a90c33b94b318c8dd8eb1d5b" - integrity sha512-+iDz8roOCGT+hvhhJ+GsQliEEB4Qd1QL1RIsllssZ3MkrtBGqc5Uwi3n5LcLp2f3rXRK07+qJPZQO+YvFCQzug== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== - -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-jest@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.1.tgz#9f1c4571ac17a39e599d1325dcaf53a274261df4" - integrity sha512-aWFD7OGQjk3Y8MdZKf1XePlQvHnjMVJQjIq9WKrlAjz9by703kJ45Jxhp26JwnovoW71YYz5etuqRl8wMcIv0w== - dependencies: - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^27.0.1" - chalk "^4.0.0" - graceful-fs "^4.2.4" - slash "^3.0.0" - -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.1.tgz#a6d10e484c93abff0f4e95f437dad26e5736ea11" - integrity sha512-sqBF0owAcCDBVEDtxqfYr2F36eSHdx7lAVGyYuOBRnKdD6gzcy0I0XrAYCZgOA3CRrLhmR+Uae9nogPzmAtOfQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" - integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== - 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" - -babel-preset-jest@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.0.1.tgz#7a50c75d16647c23a2cf5158d5bb9eb206b10e20" - integrity sha512-nIBIqCEpuiyhvjQs2mVNwTxQQa2xk70p9Dd/0obQGBf8FBzbnI8QhQKzLsWMN2i6q+5B0OcWDtrboBX5gmOLyA== - dependencies: - babel-plugin-jest-hoist "^27.0.1" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.14.5: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001219: - version "1.0.30001230" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" - integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== - -canonicalize@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.3.tgz#7c65d89eaf4f8f78a589e3ae23eabb1ce941c563" - integrity sha512-QWAGweNicWIXzcl7skvUZQ/ArdecS8fOeudnjIU0LYqSdTOSBSap+0VPMas4u11cW3a9sN5AN/aJHQUGfdWLCw== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - -cjs-module-lexer@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" - integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" - integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= - dependencies: - escape-string-regexp "^1.0.5" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - 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.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - 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.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" - integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -colors@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -colorspace@1.1.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" - integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== - dependencies: - color "3.0.x" - text-hex "1.0.x" - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comment-parser@^0.7.6: - version "0.7.6" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.6.tgz#0e743a53c8e646c899a1323db31f6cd337b10f12" - integrity sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -componentsjs@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/componentsjs/-/componentsjs-4.4.0.tgz#5f55c73cadf43de511eee11644241eadaea7ad89" - integrity sha512-lpceBsCYHG9QUuo+Hb0lAe7pAKi+E7JFr3qe5fbLhIcj92wu3kU822U4hYjE0u0JVYRDK6edEsoa6leEABWI2Q== - dependencies: - "@types/minimist" "^1.2.0" - "@types/node" "^14.14.7" - "@types/rdf-js" "*" - "@types/semver" "^7.3.4" - jsonld-context-parser "^2.1.1" - minimist "^1.2.0" - rdf-data-factory "^1.0.4" - rdf-object "^1.8.0" - rdf-parse "^1.8.1" - rdf-quad "^1.5.0" - rdf-terms "^1.6.2" - semver "^7.3.2" - winston "^3.3.3" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -coveralls@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.0.tgz#13c754d5e7a2dd8b44fe5269e21ca394fb4d615b" - integrity sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ== - dependencies: - js-yaml "^3.13.1" - lcov-parse "^1.0.0" - log-driver "^1.2.7" - minimist "^1.2.5" - request "^2.88.2" - -cross-fetch@^3.0.5, cross-fetch@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" - integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== - dependencies: - node-fetch "2.6.1" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -diff-sequences@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" - integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== - -diff-sequences@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.1.tgz#9c9801d52ed5f576ff0a20e3022a13ee6e297e7c" - integrity sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" - integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== - -domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" - integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== - dependencies: - domelementtype "^2.0.1" - -domhandler@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" - integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== - dependencies: - domelementtype "^2.1.0" - -domhandler@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" - integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.4.2: - version "2.4.4" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3" - integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.0.1" - domhandler "^4.0.0" - -domutils@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.6.0.tgz#2e15c04185d43fb16ae7057cb76433c6edb938b7" - integrity sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.3.723: - version "1.3.740" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz#e38b7d2b848f632191b643e6dabca51be2162922" - integrity sha512-Mi2m55JrX2BFbNZGKYR+2ItcGnR4O5HhrvgoRRyZQlaMGQULqDhoGkLWHzJoshSzi7k1PUofxcDbNhlFrDZNhg== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0: - version "1.18.0-next.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" - integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-ast-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" - integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== - dependencies: - lodash.get "^4.4.2" - lodash.zip "^4.2.0" - -eslint-config-es@^3.23.0: - version "3.26.0" - resolved "https://registry.yarnpkg.com/eslint-config-es/-/eslint-config-es-3.26.0.tgz#84e1d0a73ce9f5eca55d183d38ebe81c1ad4d6cd" - integrity sha512-AviHtSAnll2DQiBqPMMsHRu6TkQ0w8gCy8cdpsOgmHFFLekVDopLB/9uUlePg9Nk8eWfnNEs5LXm+mfB14R7Rg== - dependencies: - "@typescript-eslint/eslint-plugin" "4.6.1" - "@typescript-eslint/parser" "4.6.1" - eslint-plugin-extended "0.2.0" - eslint-plugin-mocha "8.0.0" - eslint-plugin-react "7.21.5" - eslint-plugin-unicorn "23.0.0" - -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-import-resolver-typescript@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.3.0.tgz#0870988098bc6c6419c87705e6b42bee89425445" - integrity sha512-MHSXvmj5e0SGOOBhBbt7C+fWj1bJbtSYFAD85Xeg8nvUtuooTod2HQb8bfhE9f5QyyNxEfgzqOYFCvmdDIcCuw== - dependencies: - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-extended@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-extended/-/eslint-plugin-extended-0.2.0.tgz#8aa3357976803c11c64203d5b9d2642257e38819" - integrity sha1-iqM1eXaAPBHGQgPVudJkIlfjiBk= - dependencies: - varname "2.0.2" - -eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-jest@^24.0.2: - version "24.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz#6708037d7602e5288ce877fd0103f329dc978361" - integrity sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg== - dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" - -eslint-plugin-mocha@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz#7ec5d228bcb3735301701dfbc3376320a1ca3791" - integrity sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ== - dependencies: - eslint-utils "^2.1.0" - ramda "^0.27.1" - -eslint-plugin-react@7.21.5: - version "7.21.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3" - integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g== - dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.4.1 || ^3.0.0" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" - -eslint-plugin-tsdoc@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.7.tgz#19a4203b2856cd6bae58e4a3dfe6c543de41988f" - integrity sha512-GAbNpwNfwnolagP6mCQT8wY4usifnAE/iuCz15L3BcEca0xAidctU61h7w40mOuNiSp78DYPUl5gwN89nJ8+8Q== - dependencies: - "@microsoft/tsdoc" "0.12.21" - "@microsoft/tsdoc-config" "0.13.6" - -eslint-plugin-unicorn@23.0.0: - version "23.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-23.0.0.tgz#b2820212874735f9d91ecc8678b263ecfa6cf5f6" - integrity sha512-Vabo3cjl6cjyhcf+76CdQEY6suOFzK0Xh3xo0uL9VDYrDJP5+B6PjV0tHTYm82WZmFWniugFJM3ywHSNYTi/ZQ== - dependencies: - ci-info "^2.0.0" - clean-regexp "^1.0.0" - eslint-ast-utils "^1.1.0" - eslint-template-visitor "^2.2.1" - eslint-utils "^2.1.0" - import-modules "^2.0.0" - lodash "^4.17.20" - pluralize "^8.0.0" - read-pkg-up "^7.0.1" - regexp-tree "^0.1.21" - reserved-words "^0.1.2" - safe-regex "^2.1.1" - semver "^7.3.2" - -eslint-plugin-unused-imports@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-0.1.3.tgz#e7ba892576218218f793653d5337081c7ee0f991" - integrity sha512-hNbmvUhfy+Nf+9t2Sx720FsFRMkpWLaN5QSw0yUyplcOugvnRaLg9ylAK6DFu/S3J+IiPiHueZHKJh7lhggAXA== - dependencies: - "@typescript-eslint/eslint-plugin" "^2.3.0" - eslint "^6.3.0" - eslint-rule-composer "^0.3.0" - requireindex "~1.1.0" - typescript "^3.6.3" - -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-template-visitor@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.2.1.tgz#2dccb1ab28fa7429e56ba6dd0144def2d89bc2d6" - integrity sha512-q3SxoBXz0XjPGkUpwGVAwIwIPIxzCAJX1uwfVc8tW3v7u/zS7WXNH3I2Mu2MDz2NgSITAyKLRaQFPHu/iyKxDQ== - dependencies: - babel-eslint "^10.1.0" - eslint-visitor-keys "^1.3.0" - esquery "^1.3.1" - multimap "^1.1.0" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - -eslint@^6.3.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -eslint@^7.9.0: - version "7.12.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" - integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.1" - 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" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.0" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.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 "^4.17.19" - 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 "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1, esquery@^1.2.0, esquery@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" - integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== - 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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.1.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -expect@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.0.1.tgz#1290c74fef8d62f15f4c5dd1d7233001909abbfb" - integrity sha512-hjKwLeAvKUiq0Plha1dmzOH1FGEwJC9njbT993cq4PK9r58/+3NM+WDqFVGcPuRH7XTjmbIeHQBzp2faDrPhjQ== - dependencies: - "@jest/types" "^27.0.1" - ansi-styles "^5.0.0" - jest-get-type "^27.0.1" - jest-matcher-utils "^27.0.1" - jest-message-util "^27.0.1" - jest-regex-util "^27.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-safe-stringify@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - -fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fecha@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" - integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.5.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-pkg-repo@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.1.1.tgz#699422f552b71b9f8aa41529ce7923ce7f271d79" - integrity sha512-CReGtqeJoY02L5vzok3jX1Le3sxqeAOrCnd75r/M4u4aSBT9KK7KevnpGulsJxP2NOnuIwnWPJ5XcLxTwBFzZg== - dependencies: - "@hutson/parse-repository-url" "^3.0.0" - hosted-git-info "^2.1.4" - meow "^7.0.0" - through2 "^2.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -git-raw-commits@^2.0.0: - version "2.0.7" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.7.tgz#02e9357727a9755efa8e14dd5e59b381c29068fb" - integrity sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g== - dependencies: - dargs "^7.0.0" - lodash.template "^4.0.2" - meow "^7.0.0" - split2 "^2.0.0" - through2 "^3.0.0" - -git-semver-tags@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34" - integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA== - dependencies: - meow "^4.0.0" - semver "^6.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -htmlparser2@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" - integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== - dependencies: - domelementtype "^2.0.1" - domhandler "^3.3.0" - domutils "^2.4.2" - entities "^2.0.0" - -htmlparser2@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-link-header@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.0.2.tgz#bea50f02e1c7996021f1013b428c63f77e0f4e11" - integrity sha512-z6YOZ8ZEnejkcCWlGZzYXNa6i+ZaTfiTg3WhlV/YvnNya3W/RbX1bMVUMTuCrg/DrtTCQxaFCkXCz4FtLpcebg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -husky@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" - integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -immutable@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -import-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" - integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== - dependencies: - es-abstract "^1.17.0-next.1" - has "^1.0.3" - side-channel "^1.0.2" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== - dependencies: - ci-info "^3.1.1" - -is-core-module@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== - dependencies: - has "^1.0.3" - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.0, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.0.1.tgz#b8356b3708cac9d05ebf6f9e0b32227b514945c8" - integrity sha512-Y/4AnqYNcUX/vVgfkmvSA3t7rcg+t8m3CsSGlU+ra8kjlVW5ZqXcBZY/NUew2Mo8M+dn0ApKl+FmGGT1JV5dVA== - dependencies: - "@jest/types" "^27.0.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.1.tgz#3a7ec9e9fd60ef4c827197dffe2288aa19f86678" - integrity sha512-Tz3ytmrsgxWlTwSyPYb8StF9J2IMjLlbBMKAjhL2UU9/0ZpYb2JiEGjXaAhnGauQRbbpyFbSH3yj5HIbdurmwQ== - dependencies: - "@jest/environment" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.0.1" - is-generator-fn "^2.0.0" - jest-each "^27.0.1" - jest-matcher-utils "^27.0.1" - jest-message-util "^27.0.1" - jest-runner "^27.0.1" - jest-runtime "^27.0.1" - jest-snapshot "^27.0.1" - jest-util "^27.0.1" - pretty-format "^27.0.1" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.1.tgz#9accc8a505438571ee423438eac526a7ee4654b5" - integrity sha512-plDsQQwpkKK1SZ5L5xqMa7v/sTwB5LTIeSJqb+cV+4EMlThdUQfg8jwMfHX8jHuUc9TPGLcdoZeBuZcGGn3Rlg== - dependencies: - "@jest/core" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/types" "^27.0.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.4" - import-local "^3.0.2" - jest-config "^27.0.1" - jest-util "^27.0.1" - jest-validate "^27.0.1" - prompts "^2.0.1" - yargs "^16.0.3" - -jest-config@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.1.tgz#db4f202efcbb92011f62d8f25b52c3d1bd5672d4" - integrity sha512-V8O6+CZjGF0OMq4kxVR29ztV/LQqlAAcJLw7a94RndfRXkha4U84n50yZCXiPWtAHHTmb3g1y52US6rGPxA+3w== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.0.1" - "@jest/types" "^27.0.1" - babel-jest "^27.0.1" - chalk "^4.0.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - is-ci "^3.0.0" - jest-circus "^27.0.1" - jest-environment-jsdom "^27.0.1" - jest-environment-node "^27.0.1" - jest-get-type "^27.0.1" - jest-jasmine2 "^27.0.1" - jest-regex-util "^27.0.1" - jest-resolve "^27.0.1" - jest-util "^27.0.1" - jest-validate "^27.0.1" - micromatch "^4.0.4" - pretty-format "^27.0.1" - -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-diff@^25.2.1: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" - integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== - dependencies: - chalk "^3.0.0" - diff-sequences "^25.2.6" - jest-get-type "^25.2.6" - pretty-format "^25.5.0" - -jest-diff@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.0.1.tgz#021beb29fe9f07e83c809a4f7a1ce807b229c4ab" - integrity sha512-DQ3OgfJgoGWVTYo4qnYW/Jg5mpYFS2QW9BLxA8bs12ZRN1K8QPZtWeYvUPohQFs3CHX3JLTndGg3jyxdL5THFQ== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.0.1" - jest-get-type "^27.0.1" - pretty-format "^27.0.1" - -jest-docblock@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.1.tgz#bd9752819b49fa4fab1a50b73eb58c653b962e8b" - integrity sha512-TA4+21s3oebURc7VgFV4r7ltdIJ5rtBH1E3Tbovcg7AV+oLfD5DcJ2V2vJ5zFA9sL5CFd/d2D6IpsAeSheEdrA== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.0.1.tgz#37fa20b7d809b29d4349d8eb7d01f17c2feeab10" - integrity sha512-uJTK/aZ05HsdKkfXucAT5+/1DIURnTRv34OSxn1HWHrD+xu9eDX5Xgds09QSvg/mU01VS5upuHTDKG3W+r0rQA== - dependencies: - "@jest/types" "^27.0.1" - chalk "^4.0.0" - jest-get-type "^27.0.1" - jest-util "^27.0.1" - pretty-format "^27.0.1" - -jest-environment-jsdom@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.1.tgz#12b0ed587fb53e0a581a5101bb209aef09da2310" - integrity sha512-lesU8T9zkjgLaLpUFmFDgchu6/2OCoXm52nN6UumR063Hb+1TJdI7ihgM86+G01Ay86Lyr+K/FAR6yIIOviH3Q== - dependencies: - "@jest/environment" "^27.0.1" - "@jest/fake-timers" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - jest-mock "^27.0.1" - jest-util "^27.0.1" - jsdom "^16.6.0" - -jest-environment-node@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.1.tgz#7d7df7ae191477a823ffb4fcc0772b4c23ec5c87" - integrity sha512-/p94lo0hx+hbKUw1opnRFUPPsjncRBEUU+2Dh7BuxX8Nr4rRiTivLYgXzo79FhaeMYV0uiV5WAbHBq6xC11JJg== - dependencies: - "@jest/environment" "^27.0.1" - "@jest/fake-timers" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - jest-mock "^27.0.1" - jest-util "^27.0.1" - -jest-extended@^0.11.2: - version "0.11.5" - resolved "https://registry.yarnpkg.com/jest-extended/-/jest-extended-0.11.5.tgz#f063b3f1eaadad8d7c13a01f0dfe0f538d498ccf" - integrity sha512-3RsdFpLWKScpsLD6hJuyr/tV5iFOrw7v6YjA3tPdda9sJwoHwcMROws5gwiIZfcwhHlJRwFJB2OUvGmF3evV/Q== - dependencies: - expect "^24.1.0" - jest-get-type "^22.4.3" - jest-matcher-utils "^22.0.0" - -jest-get-type@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-get-type@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" - integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== - -jest-get-type@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815" - integrity sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg== - -jest-haste-map@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.1.tgz#653c4ba59309a86499ad7bf663176e7f97478191" - integrity sha512-ioCuobr4z90H1Pz8+apz2vfz63387apzAoawm/9IIOndarDfRkjLURdLOe//AI5jUQmjVRg+WiL92339kqlCmA== - dependencies: - "@jest/types" "^27.0.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^27.0.1" - jest-serializer "^27.0.1" - jest-util "^27.0.1" - jest-worker "^27.0.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.1.tgz#d975bfe072f3ac3596c0be5fc0a1215fd2e91e77" - integrity sha512-o8Ist0o970QDDm/R2o9UDbvNxq8A0++FTFQ0z9OnieJwS1nDH6H7WBDYAGPTdmnla7kbW41oLFPvhmjJE4mekg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.0.1" - "@jest/source-map" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.0.1" - is-generator-fn "^2.0.0" - jest-each "^27.0.1" - jest-matcher-utils "^27.0.1" - jest-message-util "^27.0.1" - jest-runtime "^27.0.1" - jest-snapshot "^27.0.1" - jest-util "^27.0.1" - pretty-format "^27.0.1" - throat "^6.0.1" - -jest-leak-detector@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.0.1.tgz#eedeaee7c0ab553db4d8908f74967329624342b9" - integrity sha512-SQ/lRhfmnV3UuiaKIjwNXCaW2yh1rTMAL4n4Cl4I4gU0X2LoIc6Ogxe4UKM/J6Ld2uzc4gDGVYc5lSdpf6WjYw== - dependencies: - jest-get-type "^27.0.1" - pretty-format "^27.0.1" - -jest-matcher-utils@^22.0.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" - integrity sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA== - dependencies: - chalk "^2.0.1" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.0.1.tgz#7a01330786e370f152b0b0159f827293b6322909" - integrity sha512-NauNU+olKhPzLlsRnTOYFGk/MK5QFYl9ZzkrtfsY4eCq4SB3Bcl03UL44VdnlN5S/uFn4H2jwvRY1y6nSDTX3g== - dependencies: - chalk "^4.0.0" - jest-diff "^27.0.1" - jest-get-type "^27.0.1" - pretty-format "^27.0.1" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-message-util@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.0.1.tgz#382b7c55d8e0b1aba9eeb41d3cfdd34e451210ed" - integrity sha512-w8BfON2GwWORkos8BsxcwwQrLkV2s1ENxSRXK43+6yuquDE2hVxES/jrFqOArpP1ETVqqMmktU6iGkG8ncVzeA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.0.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - pretty-format "^27.0.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.0.1.tgz#8394e297bc3dfed980961622cb51fd042b4acf5a" - integrity sha512-fXCSZQDT5hUcAUy8OBnB018x7JFOMQnz4XfpSKEbfpWzL6o5qaLRhgf2Qg2NPuVKmC/fgOf33Edj8wjF4I24CQ== - dependencies: - "@jest/types" "^27.0.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-regex-util@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68" - integrity sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ== - -jest-resolve-dependencies@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.1.tgz#3dcaeb277e0253747706467e8f05e1e78a1d534d" - integrity sha512-ly1x5mEf21f3IVWbUNwIz/ePLtv4QdhYuQIVSVDqxx7yzAwhhdu0DJo7UNiEYKQY7Im48wfbNdOUpo7euFUXBQ== - dependencies: - "@jest/types" "^27.0.1" - jest-regex-util "^27.0.1" - jest-snapshot "^27.0.1" - -jest-resolve@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.1.tgz#4e1b76f61c7e2213d2fbd37342800864309de538" - integrity sha512-Q7QQ0OZ7z6D5Dul0MrsexlKalU8ZwexBfHLSu1qYPgphvUm6WO1b/xUnipU3e+uW1riDzMcJeJVYbdQ37hBHeg== - dependencies: - "@jest/types" "^27.0.1" - chalk "^4.0.0" - escalade "^3.1.1" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^27.0.1" - resolve "^1.20.0" - slash "^3.0.0" - -jest-runner@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.1.tgz#52137173fbf318b7b1f034b81200c2846758f681" - integrity sha512-DUNizlD2D7J80G3VOrwfbtb7KYxiftMng82HNcKwTW0W3AwwNuBeq+1exoCnLO7Mxh7NP+k/1XQBlzLpjr/CnA== - dependencies: - "@jest/console" "^27.0.1" - "@jest/environment" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^27.0.1" - jest-docblock "^27.0.1" - jest-haste-map "^27.0.1" - jest-leak-detector "^27.0.1" - jest-message-util "^27.0.1" - jest-resolve "^27.0.1" - jest-runtime "^27.0.1" - jest-util "^27.0.1" - jest-worker "^27.0.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.1.tgz#b71bb8ea189c50525aebb4aba6c524633ca27659" - integrity sha512-ImcrbQtpCUp8X9Rm4ky3j1GG9cqIKZJvXGZyB5cHEapGPTmg7wvvNooLmKragEe61/p/bhw1qO68Y0/9BSsBBg== - dependencies: - "@jest/console" "^27.0.1" - "@jest/environment" "^27.0.1" - "@jest/fake-timers" "^27.0.1" - "@jest/globals" "^27.0.1" - "@jest/source-map" "^27.0.1" - "@jest/test-result" "^27.0.1" - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.4" - jest-haste-map "^27.0.1" - jest-message-util "^27.0.1" - jest-mock "^27.0.1" - jest-regex-util "^27.0.1" - jest-resolve "^27.0.1" - jest-snapshot "^27.0.1" - jest-util "^27.0.1" - jest-validate "^27.0.1" - slash "^3.0.0" - strip-bom "^4.0.0" - yargs "^16.0.3" - -jest-serializer@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.1.tgz#2464d04dcc33fb71dc80b7c82e3c5e8a08cb1020" - integrity sha512-svy//5IH6bfQvAbkAEg1s7xhhgHTtXu0li0I2fdKHDsLP2P2MOiscPQIENQep8oU2g2B3jqLyxKKzotZOz4CwQ== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.1.tgz#01a82d901f260604908373795c9255b032d2a07a" - integrity sha512-HgKmSebDB3rswugREeh+nKrxJEVZE12K7lZ2MuwfFZT6YmiH0TlofsL2YmiLsCsG5KH5ZcLYYpF5bDrvtVx/Xg== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/parser" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.0.1" - graceful-fs "^4.2.4" - jest-diff "^27.0.1" - jest-get-type "^27.0.1" - jest-haste-map "^27.0.1" - jest-matcher-utils "^27.0.1" - jest-message-util "^27.0.1" - jest-resolve "^27.0.1" - jest-util "^27.0.1" - natural-compare "^1.4.0" - pretty-format "^27.0.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.0.1.tgz#324ed9879d129c1e64f9169a739d6d50d7928769" - integrity sha512-lEw3waSmEOO4ZkwkUlFSvg4es1+8+LIkSGxp/kF60K0+vMR3Dv3O2HMZhcln9NHqSQzpVbsDT6OeMzUPW7DfRg== - dependencies: - "@jest/types" "^27.0.1" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^3.0.0" - picomatch "^2.2.3" - -jest-validate@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.0.1.tgz#8e43428674b6097f8ee3abe42c4248a4826cd008" - integrity sha512-zvmPRcfTkqTZuHveIKAI2nbkUc3SDXjWVJULknPLGF5bdxOGSeGZg7f/Uw0MUVOkCOaspcHnsPCgZG0pqmg71g== - dependencies: - "@jest/types" "^27.0.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.0.1" - leven "^3.1.0" - pretty-format "^27.0.1" - -jest-watcher@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.0.1.tgz#61b9403d7b498161f6aa6124602363525ac3efc2" - integrity sha512-Chp9c02BN0IgEbtGreyAhGqIsOrn9a0XnzbuXOxdW1+cW0Tjh12hMzHDIdLFHpYP/TqaMTmPHaJ5KWvpCCrNFw== - dependencies: - "@jest/test-result" "^27.0.1" - "@jest/types" "^27.0.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.0.1" - string-length "^4.0.1" - -jest-worker@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.1.tgz#b255fcbb40fb467295010c628474b1185cab4f9e" - integrity sha512-NhHqClI3owOjmS8dBhQMKHZ2rrT0sBTpqGitp9nMX5AAjVXd+15o4v96uBEMhoywaLKN+5opcKBlXwAoADZolA== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.0.1.tgz#d3822f0904f3bbe884bea393cede2be2aa290d0e" - integrity sha512-lFEoUdXjbGAIxk/gZhcv98xOaH1hjqG5R/PQHs5GBfIK5iL3tnXCjHQf4HQLVZZ2rcXML3oeVg9+XrRZbooBdQ== - dependencies: - "@jest/core" "^27.0.1" - import-local "^3.0.2" - jest-cli "^27.0.1" - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.6.0: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz#371873c5ffa44304a6ba12419bcfa95f404ae081" - integrity sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@2.x, json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== - dependencies: - universalify "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonld-context-parser@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsonld-context-parser/-/jsonld-context-parser-2.0.2.tgz#d3debfaee3b162337b3bd9304af5aa14058bb5fd" - integrity sha512-IjQi26E+5ESS85MkcLsYo9gV93oJSOvQ/deHxKspaeHOmRiPyRRaGAk86DjuQc6c0hdp3OKGvDDsy3wi8znsqg== - dependencies: - "@types/http-link-header" "^1.0.1" - "@types/isomorphic-fetch" "^0.0.35" - "@types/node" "^13.1.0" - canonicalize "^1.0.1" - http-link-header "^1.0.2" - isomorphic-fetch "^2.2.1" - relative-to-absolute-iri "^1.0.5" - -jsonld-context-parser@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/jsonld-context-parser/-/jsonld-context-parser-2.1.1.tgz#0de2b459465b199ef6014a94d7af9b2485360374" - integrity sha512-7yKhnwFaiCnDPUZYQuAWyT0zZBfOKZDyjtqFVNbXrYRkboU+m55UsastsfXbo7qNroTGdFiEyxHEHDEfBC0P4Q== - dependencies: - "@types/http-link-header" "^1.0.1" - "@types/node" "^13.1.0" - canonicalize "^1.0.1" - cross-fetch "^3.0.6" - http-link-header "^1.0.2" - relative-to-absolute-iri "^1.0.5" - -jsonld-context-parser@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/jsonld-context-parser/-/jsonld-context-parser-2.1.2.tgz#17e9e749488cc91e91ddbb6d2edc901bdf55023f" - integrity sha512-zAhus+dz4IrXiYAiYf6M1PSdYkILVWPg4bqqGfim+rGrmVc3d0drFAriLOU2RMwQFKljM+41lJTau47sxt6YWA== - dependencies: - "@types/http-link-header" "^1.0.1" - "@types/node" "^13.1.0" - canonicalize "^1.0.1" - cross-fetch "^3.0.6" - http-link-header "^1.0.2" - relative-to-absolute-iri "^1.0.5" - -jsonld-streaming-parser@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/jsonld-streaming-parser/-/jsonld-streaming-parser-2.3.2.tgz#a3e1bd405a500186cc12b0f1fcee8a97b8392dd4" - integrity sha512-C9hyL5LRb2K0eaS5biP+ixUtMjr3UPJn9WInNYAmjX9tL7NzeSw3lY7nW3GEnKETxF3I3btvEPR1Nm/+tHMWZQ== - dependencies: - "@types/http-link-header" "^1.0.1" - "@types/rdf-js" "^4.0.0" - canonicalize "^1.0.1" - http-link-header "^1.0.2" - jsonld-context-parser "^2.1.2" - jsonparse "^1.3.1" - rdf-data-factory "^1.0.4" - -jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891" - integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA== - dependencies: - array-includes "^3.1.1" - object.assign "^4.1.1" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -lcov-parse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" - integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.template@^4.0.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.uniqwith@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz#7a0cbf65f43b5928625a9d4d0dc54b18cadc7ef3" - integrity sha1-egy/ZfQ7WShiWp1NDcVLGMrcfvM= - -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - -lodash@4.x, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -logform@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" - integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^4.2.0" - ms "^2.1.1" - triple-beam "^1.3.0" - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -manual-git-changelog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/manual-git-changelog/-/manual-git-changelog-1.0.1.tgz#63ce94f6d3ca4611b954bbc7a6921e4f7baad837" - integrity sha512-sORVeVpUtnEuE59icgPqs0AzwgWJjTjSUy1RZ4VrAMOmHQaRh2L9nFCA/NRkvI4b7WbXMGt98NuI8dgOIFNSyA== - dependencies: - arrayify-stream "^1.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.0" - git-semver-tags "^2.0.0" - minimist "^1.2.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -meow@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.0.tgz#50ecbcdafa16f8b58fb7eb9675b933f6473b3a59" - integrity sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -microdata-rdf-streaming-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/microdata-rdf-streaming-parser/-/microdata-rdf-streaming-parser-1.1.0.tgz#1807cfc9b44e739defac7be879f89545cb4dfe59" - integrity sha512-nvPEFzG4vZWzWJP2x8Ax7mJmdrFkSYrfhdTUDHLtXYZJVl8Ip7ScHUPLkUfX+Ci4g7sOdgHsotkxuccnlxtCAg== - dependencies: - "@types/rdf-js" "^4.0.0" - htmlparser2 "^5.0.0" - rdf-data-factory "^1.0.2" - relative-to-absolute-iri "^1.0.2" - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multimap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" - integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -n3@^1.6.3: - version "1.7.0" - resolved "https://registry.yarnpkg.com/n3/-/n3-1.7.0.tgz#618391e1685d24ff642213777156380653807405" - integrity sha512-8R0Qj545WnVLQxOfxxyFKzOpO13hF3jhSMJfO0FNqvbsPZDiR9ZDmGGjXAlcoZDf/88OsCYd7rHML284vm1h6A== - dependencies: - queue-microtask "^1.1.2" - readable-stream "^3.6.0" - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.7.0, object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" - integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - has "^1.0.3" - -object.fromentries@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" - integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1, optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - 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" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-each-series@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" - integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== - 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-link-header@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-1.0.1.tgz#bedfe0d2118aeb84be75e7b025419ec8a61140a7" - integrity sha1-vt/g0hGK64S+deewJUGeyKYRQKc= - dependencies: - xtend "~4.0.1" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -pretty-format@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" - integrity sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.2.1, pretty-format@^25.5.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.0.1.tgz#c4094621dfbd3e8ab751964d1cf01edc6f88474d" - integrity sha512-qE+0J6c/gd+R6XTcQgPJMc5hMJNsxzSF5p8iZSbMZ7GQzYGlSLNkh2P80Wa2dbF4gEVUsJEgcrBY+1L2/j265w== - dependencies: - "@jest/types" "^27.0.1" - ansi-regex "^5.0.0" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-polyfill@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-1.1.6.tgz#cd04eff46f5c95c3a7d045591d79b5e3e01f12d7" - integrity sha1-zQTv9G9clcOn0EVZHXm14+AfEtc= - -prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.4" - -prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -queue-microtask@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== - -rdf-data-factory@^1.0.0, rdf-data-factory@^1.0.1, rdf-data-factory@^1.0.2, rdf-data-factory@^1.0.3, rdf-data-factory@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/rdf-data-factory/-/rdf-data-factory-1.0.4.tgz#4e22fc462620fbca650eb2d26c4a13a103edd777" - integrity sha512-ZIIwEkLcV7cTc+atvQFzAETFVRHz1BRe/MhdkZqYse8vxskErj8/bF/Ittc3B5c0GTyw6O3jVF2V7xBRGyRoSQ== - dependencies: - "@types/rdf-js" "^4.0.0" - -rdf-isomorphic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rdf-isomorphic/-/rdf-isomorphic-1.2.1.tgz#071f0d05671e3e6c9bdae75ff4cbe50308f2fc75" - integrity sha512-kIKlQYoizNqp8zhbca1zV3mYngisoD/KNt/xBRjagp7R3F8niI3b1vxvqcWlSkNXgPD6MsXpP2E/uXZ8oGTIcA== - dependencies: - hash.js "^1.1.7" - rdf-string "^1.5.0" - rdf-terms "^1.6.2" - -rdf-literal@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/rdf-literal/-/rdf-literal-1.2.0.tgz#3159cce5587007144ea4a3a713cea31af4fc0c68" - integrity sha512-N7nyfp/xzoiUuJt0xZ80BvBGkCPwWejgVDkCxWDSuooXKSows4ToW+KouYkMHLcoFzGg1Rlw2lk6btjMJg5aSA== - dependencies: - "@types/rdf-js" "^4.0.0" - rdf-data-factory "^1.0.1" - -rdf-object@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/rdf-object/-/rdf-object-1.8.0.tgz#f7b6c3c997d87d72a5a5651c6bb7ef63d6e0af24" - integrity sha512-/yq5vk8eqspZwIcK1BS3wPcmv4kinooaPX5SRDpCnthCjOcDiyNgPnfXqMt5OpDWhykDkNJeTCvqQifFqZRPyw== - dependencies: - jsonld-context-parser "^2.0.2" - rdf-data-factory "^1.0.3" - rdf-string "^1.5.0" - streamify-array "^1.0.1" - -rdf-parse@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/rdf-parse/-/rdf-parse-1.8.1.tgz#99658d13dc4cf0f7d8310b914439b40eb4665df7" - integrity sha512-sNcQ1Vc8hDf/hVjVHYS9CSHyFShVX8LVwBrFARKkGgGe+K9DZJRaZQI06VCwmEW027ZFjfxFgmjQlc09FLmI4A== - dependencies: - "@comunica/actor-http-native" "~1.21.1" - "@comunica/actor-rdf-parse-html" "~1.21.1" - "@comunica/actor-rdf-parse-html-microdata" "~1.21.1" - "@comunica/actor-rdf-parse-html-rdfa" "~1.21.1" - "@comunica/actor-rdf-parse-html-script" "~1.21.1" - "@comunica/actor-rdf-parse-jsonld" "~1.21.2" - "@comunica/actor-rdf-parse-n3" "~1.21.1" - "@comunica/actor-rdf-parse-rdfxml" "~1.21.1" - "@comunica/actor-rdf-parse-xml-rdfa" "~1.21.1" - "@comunica/bus-http" "~1.21.1" - "@comunica/bus-init" "~1.21.1" - "@comunica/bus-rdf-parse" "~1.21.1" - "@comunica/bus-rdf-parse-html" "~1.21.1" - "@comunica/core" "~1.21.1" - "@comunica/mediator-combine-union" "~1.21.1" - "@comunica/mediator-number" "~1.21.1" - "@comunica/mediator-race" "~1.21.1" - "@types/rdf-js" "*" - stream-to-string "^1.2.0" - -rdf-quad@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/rdf-quad/-/rdf-quad-1.5.0.tgz#531c4c132cdcbc0ca3295a3df9060cd3b0ce896f" - integrity sha512-LnCYx8XbRVW1wr6UiZPSy2Tv7bXAtEwuyck/68dANhFu8VMnGS+QfUNP3b9YI6p4Bfd/fyDx5E3x81IxGV6BzA== - dependencies: - rdf-data-factory "^1.0.1" - rdf-literal "^1.2.0" - rdf-string "^1.5.0" - -rdf-string@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/rdf-string/-/rdf-string-1.5.0.tgz#5d0118f8788fe509f06d8cefc181fd979d712412" - integrity sha512-3TEJuDIKUADgZrfcZG+zAN4GfVA1Ei2sKA7Z7QVHkAE36wWoRGPJbGihPQMldgzvy9lG2nzZU+CXz+6oGSQNsQ== - dependencies: - rdf-data-factory "^1.0.0" - -rdf-terms@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/rdf-terms/-/rdf-terms-1.6.2.tgz#e31ad9023e0ee163dafa3dd847410c61556d0d57" - integrity sha512-dASpdYHYLEwzN9iSymJie1WUj6VHXy1By8Am4g2rJlhTfVvNitsJpDY+A3X2QehlGhCaWjHMzXS4q/JKNPI80A== - dependencies: - lodash.uniqwith "^4.5.0" - rdf-data-factory "^1.0.1" - -rdfa-streaming-parser@^1.3.0, rdfa-streaming-parser@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rdfa-streaming-parser/-/rdfa-streaming-parser-1.4.0.tgz#051bcfba4d8cfb37198011260befdb3e900f7149" - integrity sha512-tx2rsBpK7MhpuvuMFdpoIfH8t8ij/traX6+hiFe4WV648eWlcYKURLVdWwqqPkF4qwnT1PH8mqBpBY7CNpbjvg== - dependencies: - "@types/rdf-js" "^4.0.0" - htmlparser2 "^5.0.0" - rdf-data-factory "^1.0.2" - relative-to-absolute-iri "^1.0.2" - -rdfxml-streaming-parser@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rdfxml-streaming-parser/-/rdfxml-streaming-parser-1.4.0.tgz#32cae3cfbc77aef110f6be8e067935fbf156f3b6" - integrity sha512-/FKDCq4tuSWz8PZaaPxqIQpenEvRR3Gsqllqg4VmdPFN6WiWfbaD244cKASfXfQHt9Bw7tLsLHsmtA1isIPBCg== - dependencies: - "@types/rdf-js" "^4.0.0" - rdf-data-factory "^1.0.2" - relative-to-absolute-iri "^1.0.0" - sax "^1.2.4" - -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - 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" - -readable-stream-node-to-web@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readable-stream-node-to-web/-/readable-stream-node-to-web-1.0.1.tgz#8b7614faa1465ebfa0da9b9ca6303fa27073b7cf" - integrity sha1-i3YU+qFGXr+g2pucpjA/onBzt88= - -"readable-stream@2 || 3", readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.3.7, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp-tree@^0.1.21, regexp-tree@~0.1.1: - version "0.1.21" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" - integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== - -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -relative-to-absolute-iri@^1.0.0, relative-to-absolute-iri@^1.0.2, relative-to-absolute-iri@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/relative-to-absolute-iri/-/relative-to-absolute-iri-1.0.6.tgz#7111dac5730587e3fbca3e0f48585fbc88c147a7" - integrity sha512-Xw5/Zx6iWSCMJUXwXVOjySjH8Xli4hVFL9QQFvkl1qEmFBG94J+QUI9emnoctOCD3285f1jNV+QWV9eDYwIdfQ== - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -requireindex@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= - -reserved-words@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" - integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.12.0, resolve@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" - -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@~1.12.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.3.tgz#96d5253df8005ce19795c14338f2a013c38a8c15" - integrity sha512-hF6+hAPlxjqHWrw4p1rF3Wztbgxd4AjA5VlUzY5zcTb4J8D3JK4/1RjU48pHz2PJWzGVsLB1VWZkvJzhK2CCOA== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@latest: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" - integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== - dependencies: - es-abstract "^1.18.0-next.0" - object-inspect "^1.8.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sparqlalgebrajs@^2.4.0: - version "2.5.5" - resolved "https://registry.yarnpkg.com/sparqlalgebrajs/-/sparqlalgebrajs-2.5.5.tgz#a9d8b387bd035441154105e6a33e1c0ebd910455" - integrity sha512-sG9XI5311mS+JPDaeZUwtwYaYDRiTZDzxtHVS1GSrnfcZ2aiK1fa1PX9z16l7dtS35X3z1j1qyHEElzZO5OM3A== - dependencies: - fast-deep-equal "^3.1.3" - minimist "^1.2.5" - rdf-data-factory "^1.0.4" - rdf-isomorphic "^1.2.0" - rdf-string "^1.5.0" - sparqljs "^3.3.0" - -sparqljs@^3.3.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/sparqljs/-/sparqljs-3.4.2.tgz#ad69eb1ff62b3d1152f41ed50f01fae8638d18fa" - integrity sha512-MmmZ6cMuvhf4Eh2FXX21dalgADUiZ9WN8XKMedwhTFg0r7W09/o8wvoZ8C4yA6FptnjjAjm+mGnxAEpkSRY3QQ== - dependencies: - rdf-data-factory "^1.0.4" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - 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.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - 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.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-to-string@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stream-to-string/-/stream-to-string-1.2.0.tgz#3ca506a097ecbf78b0e0aee0b6fa5c4565412a15" - integrity sha512-8drZlFIKBHSMdX9GCWv8V9AAWnQcTqw0iAI6/GC7UJ0H0SwKeFKjOoZfGY1tOU00GGU7FYZQoJ/ZCUEoXhD7yQ== - dependencies: - promise-polyfill "^1.1.6" - -streamify-array@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/streamify-array/-/streamify-array-1.0.1.tgz#741cd1e7eaf1d451a0da484e5dc986a76dfa479c" - integrity sha512-ZnswaBcC6B1bhPLSQOlC6CdaDUSzU0wr2lvvHpbHNms8V7+DLd8uEAzDAWpsjxbFkijBHhuObFO/qqu52DZUMA== - -string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.matchall@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" - integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" - -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - 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.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through2@^2.0.0, through2@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== - dependencies: - punycode "^2.1.1" - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== - -triple-beam@^1.2.0, triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - -ts-jest@^27.0.1: - version "27.0.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.0.1.tgz#3cd174561c4bb311e0187a5837543fb858c60d16" - integrity sha512-03qAt77QjhxyM5Bt2KrrT1WbdumiwLz989sD3IUznSp3GIFQrx76kQqSMLF7ynnxrF3/1ipzABnHxMlU8PD4Vw== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash "4.x" - make-error "1.x" - mkdirp "1.x" - semver "7.x" - yargs-parser "20.x" - -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^3.6.3: - version "3.9.7" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" - integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== - -typescript@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" - integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== - -v8-to-istanbul@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz#b4fe00e35649ef7785a9b7fcebcea05f37c332fc" - integrity sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varname@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/varname/-/varname-2.0.2.tgz#df7969952b882f6d011f85029e13b2c83e721158" - integrity sha1-33lplSuIL20BH4UCnhOyyD5yEVg= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -web-streams-node@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/web-streams-node/-/web-streams-node-0.4.0.tgz#641e42d7a7c4df95785a774e2484ba93d36fd672" - integrity sha512-u+PBQs8DFaBrN/bxCLFn21tO/ZP7EM3qA4FGzppoUCcZ5CaMbKOsN8uOp27ylVEsfrxcR2tsF6gWHI5M8bN73w== - dependencies: - is-stream "^1.1.0" - readable-stream-node-to-web "^1.0.1" - web-streams-ponyfill "^1.4.1" - -web-streams-ponyfill@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/web-streams-ponyfill/-/web-streams-ponyfill-1.4.2.tgz#0ae863cc5f7493903679f16b08cbf14d432b62f4" - integrity sha512-LCHW+fE2UBJ2vjhqJujqmoxh1ytEDEr0dPO3CabMdMDJPKmsaxzS90V1Ar6LtNE5VHLqxR4YMEj1i4lzMAccIA== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@>=0.10.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz#e11de14f4878f773fbebcde8871b2c0699af8b30" - integrity sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ== - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" - integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^5.0.0" - -whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== - dependencies: - lodash "^4.7.0" - tr46 "^2.0.2" - webidl-conversions "^6.1.0" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -winston-transport@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" - integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== - dependencies: - readable-stream "^2.3.7" - triple-beam "^1.2.0" - -winston@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" - integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== - dependencies: - "@dabh/diagnostics" "^2.0.2" - async "^3.1.0" - is-stream "^2.0.0" - logform "^2.2.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.4.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - 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" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^7.4.5: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.x: - version "20.2.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" - integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== - -yargs-parser@^18.1.3: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.7" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" - integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== - -yargs@^16.0.3: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/f3451525379c68a73eb0a1e65247fbf28c0cccd126d93af21c75fceff77773d43c0d4a2d51978fb131aff25b5f2cb41a9fe48cc296e61ae65e679c4f6918b0ab + languageName: node + linkType: hard + +"@antfu/eslint-config@npm:2.6.4": + version: 2.6.4 + resolution: "@antfu/eslint-config@npm:2.6.4" + dependencies: + "@antfu/eslint-define-config": "npm:^1.23.0-2" + "@antfu/install-pkg": "npm:^0.3.1" + "@eslint-types/jsdoc": "npm:46.8.2-1" + "@eslint-types/typescript-eslint": "npm:^6.19.1" + "@eslint-types/unicorn": "npm:^50.0.1" + "@stylistic/eslint-plugin": "npm:^1.5.4" + "@typescript-eslint/eslint-plugin": "npm:^6.20.0" + "@typescript-eslint/parser": "npm:^6.20.0" + eslint-config-flat-gitignore: "npm:^0.1.2" + eslint-merge-processors: "npm:^0.1.0" + eslint-plugin-antfu: "npm:^2.1.2" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-i: "npm:^2.29.1" + eslint-plugin-jsdoc: "npm:^48.0.4" + eslint-plugin-jsonc: "npm:^2.13.0" + eslint-plugin-markdown: "npm:^3.0.1" + eslint-plugin-n: "npm:^16.6.2" + eslint-plugin-no-only-tests: "npm:^3.1.0" + eslint-plugin-perfectionist: "npm:^2.5.0" + eslint-plugin-toml: "npm:^0.9.2" + eslint-plugin-unicorn: "npm:^50.0.1" + eslint-plugin-unused-imports: "npm:^3.0.0" + eslint-plugin-vitest: "npm:^0.3.21" + eslint-plugin-vue: "npm:^9.21.1" + eslint-plugin-yml: "npm:^1.12.2" + eslint-processor-vue-blocks: "npm:^0.1.1" + globals: "npm:^13.24.0" + jsonc-eslint-parser: "npm:^2.4.0" + local-pkg: "npm:^0.5.0" + parse-gitignore: "npm:^2.0.0" + picocolors: "npm:^1.0.0" + prompts: "npm:^2.4.2" + toml-eslint-parser: "npm:^0.9.3" + vue-eslint-parser: "npm:^9.4.2" + yaml-eslint-parser: "npm:^1.2.2" + yargs: "npm:^17.7.2" + peerDependencies: + "@unocss/eslint-plugin": ">=0.50.0" + eslint: ">=8.40.0" + eslint-plugin-format: ">=0.1.0" + eslint-plugin-react: ^7.33.2 + eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-react-refresh: ^0.4.4 + eslint-plugin-svelte: ^2.34.1 + svelte-eslint-parser: ^0.33.1 + peerDependenciesMeta: + "@unocss/eslint-plugin": + optional: true + eslint-plugin-format: + optional: true + eslint-plugin-react: + optional: true + eslint-plugin-react-hooks: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-svelte: + optional: true + svelte-eslint-parser: + optional: true + bin: + eslint-config: bin/index.js + checksum: 10/10d67a9a7bae5ede0004287953deacc9f8649af5c2f4504e44430c66e15aa856b79b6ab21e82ec896b6ebbc3dfd7788620c636dc635bfae0745d4a0bf8c9cac5 + languageName: node + linkType: hard + +"@antfu/eslint-define-config@npm:^1.23.0-2": + version: 1.23.0-2 + resolution: "@antfu/eslint-define-config@npm:1.23.0-2" + checksum: 10/b647c10d48b5ba99a16dfb970a8e7892dea1696c455b4a19fadde75a69d5fc26aa28502430779fd28940dcb87766a543c7477cb5f9f325f58d27a614677cb7de + languageName: node + linkType: hard + +"@antfu/install-pkg@npm:^0.3.1": + version: 0.3.5 + resolution: "@antfu/install-pkg@npm:0.3.5" + dependencies: + "@jsdevtools/ez-spawn": "npm:^3.0.4" + checksum: 10/370167042e325c5358bbf52e9722709798957a4a040c1fd5802fe6c415305e8fa073c66d4285da7aee8a3f59748637dcc68728637f9c01484289380c089006a6 + languageName: node + linkType: hard + +"@antfu/utils@npm:^0.7.10": + version: 0.7.10 + resolution: "@antfu/utils@npm:0.7.10" + checksum: 10/c8c2797aeab3e88f0095dea5736d2f16137a7213195e568246792b2cceecb184234f018346dc07c252c62e4d9085c09ce6bd180da833266cafa65133fb03e075 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.26.5": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10/bdddf577f670e0e12996ef37e134856c8061032edb71a13418c3d4dae8135da28910b7cd6dec6e668ab3a41e42089ef7ee9c54ef52fe0860b54cb420b0d14948 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/68f6707eebd6bb8beed7ceccf5153e35b86c323e40d11d796d75c626ac8f1cc4e1f795584c5ab5f886bc64150c22d5088123d68c069c63f29984c4fc054d1dab + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.7.2": + version: 7.26.10 + resolution: "@babel/generator@npm:7.26.10" + dependencies: + "@babel/parser": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10/acf5e6544ee672810b598add2451302146cc79e1974fa5d87c5f70d5a51cab140abb628e36c434d01616af3747fd42378379e4b828f3eb9672e84c14f21db46b + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" + dependencies: + "@babel/compat-data": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/f3b5f0bfcd7b6adf03be1a494b269782531c6e415afab2b958c077d570371cf1bfe001c442508092c50ed3711475f244c05b8f04457d8dea9c34df2b741522bf + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/9841d2a62f61ad52b66a72d08264f23052d533afc4ce07aec2a6202adac0bfe43014c312f94feacb3291f4c5aafe681955610041ece2c276271adce3f570f2f5 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10/9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.10": + version: 7.26.10 + resolution: "@babel/helpers@npm:7.26.10" + dependencies: + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.10" + checksum: 10/664146257974ccf064b42bd99b1b85717cce2bcebc5068273e13b230ee8bd98d87187c3783706758d76b678ebe0d2f48150eaa6cffc4f77af1342a78ec1cf57a + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9": + version: 7.26.10 + resolution: "@babel/parser@npm:7.26.10" + dependencies: + "@babel/types": "npm:^7.26.10" + bin: + parser: ./bin/babel-parser.js + checksum: 10/3f87781f46795ba72448168061d9e99c394fdf9cd4aa3ddf053a06334247da4d25d0923ccc89195937d3360d384cee181e99711763c1e8fe81d4f17ee22541fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 + languageName: node + linkType: hard + +"@babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10/240288cebac95b1cc1cb045ad143365643da0470e905e11731e63280e43480785bd259924f4aea83898ef68e9fa7c176f5f2d1e8b0a059b27966e8ca0b41a1b6 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10": + version: 7.26.10 + resolution: "@babel/traverse@npm:7.26.10" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.10" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10/e9c77390ce93d1f79fb0d83fc7c67282314ba73fa746ec3cf78e999b2dcda340e200a4fc9d8c5c4ca08f183e1aea2a5c0eb6e4ce802e43c4b10124dbc7d4e748 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3": + version: 7.26.10 + resolution: "@babel/types@npm:7.26.10" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/6b4f24ee77af853c2126eaabb65328cd44a7d6f439685131cf929c30567e01b6ea2e5d5653b2c304a09c63a5a6199968f0e27228a007acf35032036d79a9dee6 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10/1a1f0e356a3bb30b5f1ced6f79c413e6ebacf130421f15fac5fcd8be5ddf98aedb4404d7f5624e3285b700e041f9ef938321f3ca4d359d5b716f96afa120d88d + languageName: node + linkType: hard + +"@bergos/jsonparse@npm:^1.4.0": + version: 1.4.2 + resolution: "@bergos/jsonparse@npm:1.4.2" + dependencies: + buffer: "npm:^6.0.3" + checksum: 10/ca8b1faf362e034f083dbd8cfc437eb6762a798f3661e8be301d4e4a914b75eb4b7114314a27e22233f9dfce4e61bfa7106c04cad9d902b1e7b5beb6a8f10218 + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10/66d00284a3a9a21e5e853b256942e17edbb295f4bd7b9aa7ef06bbb603568d5173eb41b0f64c1e51748bc29d382a23a67d99956e57e7431c64e47e74324182d9 + languageName: node + linkType: hard + +"@comunica/actor-abstract-mediatyped@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/actor-abstract-mediatyped@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + checksum: 10/52f4b35eff7342a2f407fcafa713bed6df8a006c885b942add983daad9466a0dfdd0d29afe995c6ec8b7c844a9867c79e43cd882c4ca9e5a2a34a2a44b00317c + languageName: node + linkType: hard + +"@comunica/actor-abstract-parse@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/actor-abstract-parse@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + readable-stream: "npm:^4.4.2" + checksum: 10/76675e52d54a3406bf6228946aa20fde69c555017c30913efeeeef30da57d4b056d4677f074ac775bfc8086e3fd7ed414f4854301175600e57752d290e74fa60 + languageName: node + linkType: hard + +"@comunica/actor-http-fetch@npm:^2.0.1": + version: 2.10.2 + resolution: "@comunica/actor-http-fetch@npm:2.10.2" + dependencies: + "@comunica/bus-http": "npm:^2.10.2" + "@comunica/context-entries": "npm:^2.10.0" + "@comunica/mediatortype-time": "npm:^2.10.0" + abort-controller: "npm:^3.0.0" + cross-fetch: "npm:^4.0.0" + checksum: 10/b5176ff12cfcb5283b44bc15087969595a49362a28be55f7bacf5c22e3574dedd228711ac61178ce23e6463d1bb02e6d779e62a3463d7691245cecbee81b7b4c + languageName: node + linkType: hard + +"@comunica/actor-http-proxy@npm:^2.0.1": + version: 2.10.2 + resolution: "@comunica/actor-http-proxy@npm:2.10.2" + dependencies: + "@comunica/bus-http": "npm:^2.10.2" + "@comunica/context-entries": "npm:^2.10.0" + "@comunica/mediatortype-time": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + checksum: 10/d8cc07dd1909418eb04cb7ccd73b130986b5d83cb5b31b39f7523788786fea20a1e56e1dc71b1f3c7b36c4f24dbefdc7044454ddc8504e30a719f521dbec3fda + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-html-microdata@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-html-microdata@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse-html": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + microdata-rdf-streaming-parser: "npm:^2.0.1" + checksum: 10/8b7ed66942c17855fe4dd3d94ec18b558f743359e57dc1be7cc25d57339ca6c9e877cc3cc1afaeab3caba5c6b1d84c46c397ab135020bc80c0fe22b186dd1d78 + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-html-rdfa@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-html-rdfa@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse-html": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + rdfa-streaming-parser: "npm:^2.0.1" + checksum: 10/59a5c174ffe378795c16b19b115d50367f21fb88d2203d2240b19a7307009b6cb326db7b3076602bd862c800031f838a4eecd39c506111d2ef0d61745caa268d + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-html-script@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-html-script@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/bus-rdf-parse-html": "npm:^2.10.0" + "@comunica/context-entries": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + readable-stream: "npm:^4.4.2" + relative-to-absolute-iri: "npm:^1.0.7" + checksum: 10/f1a239da0611062ebf60bcc295a91ee7bfeb7dd91f65c80b0ded15d1f06e14384bc5920097d2c736362fdab505384bf72f5819c09fed1ce1ccb69f0af993ae4c + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-html@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-html@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/bus-rdf-parse-html": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + htmlparser2: "npm:^9.0.0" + readable-stream: "npm:^4.4.2" + checksum: 10/bf3174301af434cfe8343dbbfca161fa0872cc2aa4ba853d12c4494d41be45c38945d317dd383cf03045e7fe6047f884adc32288c519ae27b0fea41f84d6ba71 + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-jsonld@npm:^2.0.1": + version: 2.10.2 + resolution: "@comunica/actor-rdf-parse-jsonld@npm:2.10.2" + dependencies: + "@comunica/bus-http": "npm:^2.10.2" + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/context-entries": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + jsonld-context-parser: "npm:^2.2.2" + jsonld-streaming-parser: "npm:^3.0.1" + stream-to-string: "npm:^1.2.0" + checksum: 10/a4efffd5ef06b34205c527197a3df8b9ce558269973d22f4c6dafb479d686b513d7a08f08e0bcd139a52860cb961946ad91c7554e5b6d8eca7bad38752a1ce43 + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-n3@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-n3@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + n3: "npm:^1.17.0" + checksum: 10/976019223dd3b0e3f4f3705ebfc746933e8ca20fdbf525be78b0155f4e0c4dd3fae1b3f400b8989d9fff64b9dee0962ee9cfe6e8b6c68b9ec3e70cd9cff74818 + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-rdfxml@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-rdfxml@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + rdfxml-streaming-parser: "npm:^2.2.3" + checksum: 10/f7afdb413b450f8ad7f62e571c9913fc32b3e6aad87ebfff00bd4ae5d3cef862e8492dd403c991d4d61aea3463ee8542c9ce05f6900f2b8c2df1f461f5dcaadc + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-shaclc@npm:^2.6.2": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-shaclc@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + asynciterator: "npm:^3.8.1" + readable-stream: "npm:^4.4.2" + shaclc-parse: "npm:^1.4.0" + stream-to-string: "npm:^1.2.0" + checksum: 10/5ac8fa8326d26f2cefa45fc48da19b75cf18553f89c6f323832799e7126eb821aa4cbce8f148f43fd2e73d7fc48fce3d27b04f0f60dc64becc2725f2a5e6d0fa + languageName: node + linkType: hard + +"@comunica/actor-rdf-parse-xml-rdfa@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/actor-rdf-parse-xml-rdfa@npm:2.10.0" + dependencies: + "@comunica/bus-rdf-parse": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + rdfa-streaming-parser: "npm:^2.0.1" + checksum: 10/66c9d5594c75291702dd5b444ca24a389404d52334927bad89ded2e396131cf38d35b6b93f8e1105a1587bba34666f6957d5c37209975caf55e5816b755c460c + languageName: node + linkType: hard + +"@comunica/bus-http@npm:^2.0.1, @comunica/bus-http@npm:^2.10.2": + version: 2.10.2 + resolution: "@comunica/bus-http@npm:2.10.2" + dependencies: + "@comunica/core": "npm:^2.10.0" + "@smessie/readable-web-to-node-stream": "npm:^3.0.3" + is-stream: "npm:^2.0.1" + readable-stream-node-to-web: "npm:^1.0.1" + web-streams-ponyfill: "npm:^1.4.2" + checksum: 10/bb4381a26b32da13d62c376edc7a0132853ff79772210915f189d14bf8b0e8b8de3738386783dfe1ab47c952bd481cf94df7696863ac1abb7269fae52c18f9fc + languageName: node + linkType: hard + +"@comunica/bus-init@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/bus-init@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + readable-stream: "npm:^4.4.2" + checksum: 10/f615db4c2f8c07b04898654890354d4dc22df098df4fb7b81ccf066af70c4b908a096329f3a280c3f74f648d22003576b98e2db9edaefed720bb04f4b9fae5c2 + languageName: node + linkType: hard + +"@comunica/bus-rdf-parse-html@npm:^2.0.1, @comunica/bus-rdf-parse-html@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/bus-rdf-parse-html@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + checksum: 10/c6eab29a1fe4cc96ec521c347c719e8154eb7985c920d6d386e17c2f196f67289a588931818a9c092227a3375b2501221263665d92813770fe8194a5f6218b8e + languageName: node + linkType: hard + +"@comunica/bus-rdf-parse@npm:^2.0.1, @comunica/bus-rdf-parse@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/bus-rdf-parse@npm:2.10.0" + dependencies: + "@comunica/actor-abstract-mediatyped": "npm:^2.10.0" + "@comunica/actor-abstract-parse": "npm:^2.10.0" + "@comunica/core": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + checksum: 10/c206d054f93b13d989daa1e02704b129c4d25503ef3e3485e80fd8447137106cbf6a891bca5887ed135fe531828aae403eaa96eb3bb9b2a5be1ccd8e81012b32 + languageName: node + linkType: hard + +"@comunica/config-query-sparql@npm:^2.0.1": + version: 2.7.0 + resolution: "@comunica/config-query-sparql@npm:2.7.0" + checksum: 10/be657b723d3f8251c0009724e257df5178a835e5e59664d86b5aae6999dde9fcea2d5bec562d9dfc57ad157aa864dc2c6da690405a2b5270b32c735ec5fd41f5 + languageName: node + linkType: hard + +"@comunica/context-entries@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/context-entries@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + "@rdfjs/types": "npm:*" + jsonld-context-parser: "npm:^2.2.2" + sparqlalgebrajs: "npm:^4.2.0" + checksum: 10/ee538e6680626542d690d3887a921ae8c084b38f586e341c0cd3d7aefe0b0f1f4ec71a477ac525079a1ed9217e52fa41aff2e595afe1c027eca11ce751271d17 + languageName: node + linkType: hard + +"@comunica/core@npm:^2.0.1, @comunica/core@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/core@npm:2.10.0" + dependencies: + "@comunica/types": "npm:^2.10.0" + immutable: "npm:^4.1.0" + checksum: 10/6a0765bb38a86f6b29dc6d45f397a079b87404709fe9083019a60c0199da276c9e8b6a17c5d7cafd12907d9ecfb040f332991b9c79e2242fa223aee6f6dd458b + languageName: node + linkType: hard + +"@comunica/mediator-combine-pipeline@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/mediator-combine-pipeline@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + "@comunica/types": "npm:^2.10.0" + checksum: 10/b6bf65706b3e3906831bd146fe3052e4b45426303831ff6d4250a1c654580e4fda62a8caa7bcfe546df06f46b81a4af2c198130f1c6faa016c3e16b64bc14f4b + languageName: node + linkType: hard + +"@comunica/mediator-combine-union@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/mediator-combine-union@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + checksum: 10/aa38403bfe73b049976e9acc5862a105a00972f844104a0e34d7293b093ef72e3a00d1542aee09464ae9e1bcbabbc8035a66cdaf907d28df79accb1fd7c2b578 + languageName: node + linkType: hard + +"@comunica/mediator-number@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/mediator-number@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + checksum: 10/883a4cbaa4a102930bad539513914d81aa3be7a9e519af7ef6ce43e99ace45618da615ae9398bcedcbff8315d874b7aadf32295e7aa8aa79eecb7d601ede6acf + languageName: node + linkType: hard + +"@comunica/mediator-race@npm:^2.0.1": + version: 2.10.0 + resolution: "@comunica/mediator-race@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + checksum: 10/8f0378290364d2256f93815208dc54065dacfd93e7a6e49390f55b97cd388e9d3b6f06fda34133550573c1fce3bacb62a38b753798fcb6b3c26f7a47a293f129 + languageName: node + linkType: hard + +"@comunica/mediatortype-time@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/mediatortype-time@npm:2.10.0" + dependencies: + "@comunica/core": "npm:^2.10.0" + checksum: 10/c700e6e6e1d01cb1c535c72235e6ce9f3c92fe62d47f3024bc8824b4d1c08de910f779447e242e5189864ebc0ab8865e67b178b28b7dd495f465ed08170b09e7 + languageName: node + linkType: hard + +"@comunica/types@npm:^2.10.0": + version: 2.10.0 + resolution: "@comunica/types@npm:2.10.0" + dependencies: + "@rdfjs/types": "npm:*" + "@types/yargs": "npm:^17.0.24" + asynciterator: "npm:^3.8.1" + sparqlalgebrajs: "npm:^4.2.0" + checksum: 10/03c33b2612fc7bb9742d6871b375c3acba02a6691f8f357d0005c7d0bd0419def83255c89ddc15b19772efed9a7d7f72dc94aa977cd2628cc402751277fdb19e + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10/b6e38a1712fab242c86a241c229cf562195aad985d0564bd352ac404be583029e89e93028ffd2c251d2c407ecac5fb0cbdca94a2d5c10f29ac806ede0508b3ff + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10/14e449a7f42f063f959b472f6ce02d16457a756e852a1910aaa831b63fc21d86f6c32b2a1aa98a4835b856548c926643b51062d241fb6e9b2b7117996053e6b9 + languageName: node + linkType: hard + +"@emnapi/core@npm:^1.3.1": + version: 1.3.1 + resolution: "@emnapi/core@npm:1.3.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.1" + tslib: "npm:^2.4.0" + checksum: 10/00dbc2ae1b9682c3afadb39e0de4e69c7223b06df59b975c2a2ef58d6cbd91f5a7cfd666a97831c958737c5ec110735c6164bf0ac6f56b60477a933bd9ce793c + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.3.1": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/619915ee44682356f77f60455025e667b0b04ad3c95ced36c03782aea9ebc066fa73e86c4a59d221177eba5e5533d40b3a6dbff4e58ee5d81db4270185c21e22 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.1": + version: 1.0.1 + resolution: "@emnapi/wasi-threads@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/949f8bdcb11153d530652516b11d4b11d8c6ed48a692b4a59cbaa4305327aed59a61f0d87c366085c20ad0b0336c3b50eaddbddeeb3e8c55e7e82b583b9d98fb + languageName: node + linkType: hard + +"@es-joy/jsdoccomment@npm:~0.46.0": + version: 0.46.0 + resolution: "@es-joy/jsdoccomment@npm:0.46.0" + dependencies: + comment-parser: "npm:1.4.1" + esquery: "npm:^1.6.0" + jsdoc-type-pratt-parser: "npm:~4.0.0" + checksum: 10/1853865bebd502763dfd85ff247195806a40cff860278c5c20767f0b330c4fd51e71458ed4dac53891dcf5e3bb2fac13b5538eeb38938cf4549cf17984b0cc2e + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.5.1 + resolution: "@eslint-community/eslint-utils@npm:4.5.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10/336b85150cf1828cba5b1fcf694233b947e635654c33aa2c1692dc9522d617218dff5abf3aaa6410b92fcb7fd1f0bf5393ec5b588987ac8835860465f8808ec5 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc + languageName: node + linkType: hard + +"@eslint-types/jsdoc@npm:46.8.2-1": + version: 46.8.2-1 + resolution: "@eslint-types/jsdoc@npm:46.8.2-1" + checksum: 10/c671eaee321928bb6ee4aa63153b6730c1ef895d7d29194291f9b9a34fa3b2ce14b7dae69a19ef536eccf53a7f5854291dd25f548e9c7eef86601226f965c717 + languageName: node + linkType: hard + +"@eslint-types/typescript-eslint@npm:^6.19.1": + version: 6.21.0 + resolution: "@eslint-types/typescript-eslint@npm:6.21.0" + checksum: 10/73894aaa810b11f78a1cbaa98506e72cdbe0a41575d3619f48fb390b7c776151be4bc63a8ed3089564dda0c4fc1bd109b6df1cc98f8427acf08b48267299d477 + languageName: node + linkType: hard + +"@eslint-types/unicorn@npm:^50.0.1": + version: 50.0.1 + resolution: "@eslint-types/unicorn@npm:50.0.1" + checksum: 10/7aac3e611423db39c3ba08c347de4acb566e25aba236f16b540d3e2706b2a3934c8d21abeefd8d634d4abb4c15b8b0d033226059f2940a297c5f79a1f20344e7 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.3" + debug: "npm:^4.3.1" + minimatch: "npm:^3.0.5" + checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 + languageName: node + linkType: hard + +"@hutson/parse-repository-url@npm:^3.0.0": + version: 3.0.2 + resolution: "@hutson/parse-repository-url@npm:3.0.2" + checksum: 10/dae0656f2e77315a3027ab9ca438ed344bf78a5fda7b145f65a1fface20dfb17e94e1d31e146c8b76de4657c21020aabc72dc53b53941c9f5fe2c27416559283 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10/e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10/4412e9e6713c89c1e66d80bb0bb5a2a93192f10477623a27d08f228ba0316bb880affabc5bfe7f838f58a34d26c2c190da726e576cdfc18c49a72e89adabdcf5 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10/b000a5acd8d4fe6e34e25c399c8bdbb5d3a202b4e10416e17bfc25e12bab90bb56d33db6089ae30569b52686f4b35ff28ef26e88e21e69821d2b85884bd055b8 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10/a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10/4a80c750e8a31f344233cb9951dee9b77bf6b89377cb131f8b3cde07ff218f504370133a5963f6a786af4d2ce7f85642db206ff7a15f99fe58df4c38ac04899e + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10/ab6ac2e562d083faac7d8152ec1cc4eccc80f62e9579b69ed40aedf7211a6b2d57024a6cd53c4e35fd051c39a236e86257d1d99ebdb122291969a0a04563b51e + languageName: node + linkType: hard + +"@jest/diff-sequences@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/diff-sequences@npm:30.0.1" + checksum: 10/0ddb7c7ba92d6057a2ee51a9cfc2155b77cca707fe959167466ea02dcb0687018cc3c22b9622f25f3a417d6ad370e2d4dcfedf9f1410dc9c02954a7484423cc7 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10/90b5844a9a9d8097f2cf107b1b5e57007c552f64315da8c1f51217eeb0a9664889d3f145cdf8acf23a84f4d8309a6675e27d5b059659a004db0ea9546d1c81a8 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10/ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10/fea6c3317a8da5c840429d90bfe49d928e89c9e89fceee2149b93a11b7e9c73d2f6e4d7cdf647163da938fc4e2169e4490be6bae64952902bc7a701033fd4880 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10/9b394e04ffc46f91725ecfdff34c4e043eb7a16e1d78964094c9db3fde0b1c8803e45943a980e8c740d0a3d45661906de1416ca5891a538b0660481a3a828c27 + languageName: node + linkType: hard + +"@jest/get-type@npm:30.1.0": + version: 30.1.0 + resolution: "@jest/get-type@npm:30.1.0" + checksum: 10/e2a95fbb49ce2d15547db8af5602626caf9b05f62a5e583b4a2de9bd93a2bfe7175f9bbb2b8a5c3909ce261d467b6991d7265bb1d547cb60e7e97f571f361a70 + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10/97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10/a17d1644b26dea14445cedd45567f4ba7834f980be2ef74447204e14238f121b50d8b858fde648083d2cd8f305f81ba434ba49e37a5f4237a6f2a61180cc73dc + languageName: node + linkType: hard + +"@jest/schemas@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/schemas@npm:30.0.5" + dependencies: + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10/40df4db55d4aeed09d1c7e19caf23788309cea34490a1c5d584c913494195e698b9967e996afc27226cac6d76e7512fe73ae6b9584480695c60dd18a5459cdba + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10/910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10/bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10/c073ab7dfe3c562bff2b8fee6cc724ccc20aa96bcd8ab48ccb2aa309b4c0c1923a9e703cea386bd6ae9b71133e92810475bb9c7c22328fc63f797ad3324ed189 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10/4420c26a0baa7035c5419b0892ff8ffe9a41b1583ec54a10db3037cd46a7e29dd3d7202f8aa9d376e9e53be5f8b1bc0d16e1de6880a6d319b033b01dc4c8f639 + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10/30f42293545ab037d5799c81d3e12515790bb58513d37f788ce32d53326d0d72ebf5b40f989e6896739aa50a5f77be44686e510966370d58511d5ad2637c68c1 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10/f74bf512fd09bbe2433a2ad460b04668b7075235eea9a0c77d6a42222c10a79b9747dc2b2a623f140ed40d6865a2ed8f538f3cbb75169120ea863f29a7ed76cd + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/9d3a56ab3612ab9b85d38b2a93b87f3324f11c5130859957f6500e4ac8ce35f299d5ccc3ecd1ae87597601ecf83cee29e9afd04c18777c24011073992ff946df + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10/83deafb8e7a5ca98993c2c6eeaa93c270f6f647a4c0dc00deb38c9cf9b2d3b7bf15e8839540155247ef034a052c0ec4466f980bf0c9e2ab63b97d16c0cedd3ff + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + languageName: node + linkType: hard + +"@jsdevtools/ez-spawn@npm:^3.0.4": + version: 3.0.4 + resolution: "@jsdevtools/ez-spawn@npm:3.0.4" + dependencies: + call-me-maybe: "npm:^1.0.1" + cross-spawn: "npm:^7.0.3" + string-argv: "npm:^0.3.1" + type-detect: "npm:^4.0.8" + checksum: 10/9899acd300980c1e02c063bee116d0b550f8a48e2d5e36484376fd7a9e7cc5888c234a1613a3629be7393f96013ef73fff03d974c3ab73191fc67c7257f7d36e + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:0.16.2": + version: 0.16.2 + resolution: "@microsoft/tsdoc-config@npm:0.16.2" + dependencies: + "@microsoft/tsdoc": "npm:0.14.2" + ajv: "npm:~6.12.6" + jju: "npm:~1.4.0" + resolve: "npm:~1.19.0" + checksum: 10/37fc35d83dab66771502165fad6a8380ec6d47e0fdaadcb60c09792e5b8172feea42f327ebf4e6026c3b22448e5e73d9ee53948a2d877ee00257679b162f3490 + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.14.2": + version: 0.14.2 + resolution: "@microsoft/tsdoc@npm:0.14.2" + checksum: 10/00c3d4fc184e8e09e17aef57e4a990402bd9752607a5d50bd62a9e85bc4b8791c985a51e238affa6b9a2d23110f24d373becbfc84e1e6e9a84cf977822e3b00a + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^0.2.7": + version: 0.2.7 + resolution: "@napi-rs/wasm-runtime@npm:0.2.7" + dependencies: + "@emnapi/core": "npm:^1.3.1" + "@emnapi/runtime": "npm:^1.3.1" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10/91c3f6eaf7e73fc598b69308b780c3b3818e15bbc9c92c9f065280928fd6c3fffe8c6ca0363e87baff751d1acaccf392a78feb85db58d00f0bf9bda56d45747c + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 + languageName: node + linkType: hard + +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 10/0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10/775c9a7eb1f88c195dfb3bce70c31d0fe2a12b28b754e25c08a3edb4bc4816bfedb7ac64ef1e730579d078ca19dacf11630e99f8f3c3e0fd7b23caa5fd6d30a6 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/405c4490e1ff11cf299775449a3c254a366a4b1ffc79d87159b0ee7d5558ac9f6a2f8c0735fd6ff3873cef014cb1a44a5f9127cb6a1b2dbc408718cca9365b5a + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10/6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba + languageName: node + linkType: hard + +"@rdfjs/types@npm:*, @rdfjs/types@npm:>=1.0.0": + version: 2.0.1 + resolution: "@rdfjs/types@npm:2.0.1" + dependencies: + "@types/node": "npm:*" + checksum: 10/ed2934ac67ed5a252db98276ce3054ef2143081a6f8018b521b319d778a0c93f8f37e72714b886edbe1e8a03b28c9cbb0ea01a24ab9cc00e19298cf8288be250 + languageName: node + linkType: hard + +"@rdfjs/types@npm:^1.0.0, @rdfjs/types@npm:^1.1.0": + version: 1.1.2 + resolution: "@rdfjs/types@npm:1.1.2" + dependencies: + "@types/node": "npm:*" + checksum: 10/474b3a9e3dc7857e24c3668005fefbe9522a14279776e70d0b2395e6a160f81cf863034bf5baad15e392e1cb0bfb32a4227cff1222007da686730d43a97c62ef + languageName: node + linkType: hard + +"@rubensworks/eslint-config@npm:^3.0.0": + version: 3.1.0 + resolution: "@rubensworks/eslint-config@npm:3.1.0" + dependencies: + "@antfu/eslint-config": "npm:2.6.4" + "@rushstack/eslint-patch": "npm:^1.7.2" + eslint-import-resolver-typescript: "npm:^3.6.1" + eslint-plugin-extended: "npm:0.2.0" + eslint-plugin-import: "npm:2.29.1" + eslint-plugin-jest: "npm:^27.9.0" + eslint-plugin-react: "npm:7.33.2" + eslint-plugin-react-hooks: "npm:4.6.0" + eslint-plugin-style: "npm:^0.2.0" + eslint-plugin-tsdoc: "npm:^0.2.17" + checksum: 10/4212bb4772cd5f4cc54ee772b42f966d966ce6b239d2cc48d169acdeb4d4cbad119fdaafb171f6431485b9a0a2c06d28eb019a318e40ba93a7a31864324a39af + languageName: node + linkType: hard + +"@rubensworks/saxes@npm:^6.0.1": + version: 6.0.1 + resolution: "@rubensworks/saxes@npm:6.0.1" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10/b0e7d3b9c848a04b58ae6abc9bfe8f30e6734a59b72f67d6d2bed27899b2e0fb2e56f0a6a923e64e57155107f1e96074fc6d3a1662655808aa37edee1f7a85b3 + languageName: node + linkType: hard + +"@rushstack/eslint-patch@npm:^1.7.2": + version: 1.11.0 + resolution: "@rushstack/eslint-patch@npm:1.11.0" + checksum: 10/9bb3eb4a48a9a55e31d302b8b99f405e0f3e436fc3cda8c869fdd3fefd3ac398f5a353cceaa6c8cc5e5baf03ccd88d7965fbd25eb111f1f334415f95fa0f996d + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.41 + resolution: "@sinclair/typebox@npm:0.34.41" + checksum: 10/5c04a7f42156a7813a159947a0c3fe7e9f11aa722141ac3ff32242faf031b443ef71763d8791ce8d01bd5856770de51fd6fcda94b3a51558ba1f6d5112fa33f4 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10/a0af217ba7044426c78df52c23cedede6daf377586f3ac58857c565769358ab1f44ebf95ba04bbe38814fba6e316ca6f02870a009328294fc2c555d0f85a7117 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10/78155c7bd866a85df85e22028e046b8d46cf3e840f72260954f5e3ed5bd97d66c595524305a6841ffb3f681a08f6e5cef572a2cce5442a8a232dc29fb409b83e + languageName: node + linkType: hard + +"@smessie/readable-web-to-node-stream@npm:^3.0.3": + version: 3.0.3 + resolution: "@smessie/readable-web-to-node-stream@npm:3.0.3" + dependencies: + process: "npm:^0.11.10" + readable-stream: "npm:^4.5.1" + checksum: 10/bc6dabc4be04b59b5db20499908555c0cac4ec55f6fe0829db229104e4ba97c0516a6dd3a885220596c4d45927611f77eca0efe3fa90913bd6f8c84cb4974460 + languageName: node + linkType: hard + +"@stylistic/eslint-plugin-js@npm:1.8.1, @stylistic/eslint-plugin-js@npm:^1.8.1": + version: 1.8.1 + resolution: "@stylistic/eslint-plugin-js@npm:1.8.1" + dependencies: + "@types/eslint": "npm:^8.56.10" + acorn: "npm:^8.11.3" + escape-string-regexp: "npm:^4.0.0" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10/9f22be186a8653794d8607a3111a3822f00d63a2b84eec66611254c3a8d897181d122e2608b9ddddac050b832eb6b18483b05b40eb951c71646c638b78ddac50 + languageName: node + linkType: hard + +"@stylistic/eslint-plugin-jsx@npm:1.8.1": + version: 1.8.1 + resolution: "@stylistic/eslint-plugin-jsx@npm:1.8.1" + dependencies: + "@stylistic/eslint-plugin-js": "npm:^1.8.1" + "@types/eslint": "npm:^8.56.10" + estraverse: "npm:^5.3.0" + picomatch: "npm:^4.0.2" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10/b076eddf59a22bbfc851604728a328141deeea381972f8aaa168ab76ca94a6f177ef085a1d38ba244ed875401c07581115b7c50c81d650b9527f6a48d9c57bf1 + languageName: node + linkType: hard + +"@stylistic/eslint-plugin-plus@npm:1.8.1": + version: 1.8.1 + resolution: "@stylistic/eslint-plugin-plus@npm:1.8.1" + dependencies: + "@types/eslint": "npm:^8.56.10" + "@typescript-eslint/utils": "npm:^6.21.0" + peerDependencies: + eslint: "*" + checksum: 10/8b15b966121d0791a6b23a03f56e40884bdc0a38c01a8b696619c028458b71ff389ec0ff970a35b42d2842a34ed6feb2a254c80bfb8778b8cc22b9a2edc15bfb + languageName: node + linkType: hard + +"@stylistic/eslint-plugin-ts@npm:1.8.1": + version: 1.8.1 + resolution: "@stylistic/eslint-plugin-ts@npm:1.8.1" + dependencies: + "@stylistic/eslint-plugin-js": "npm:1.8.1" + "@types/eslint": "npm:^8.56.10" + "@typescript-eslint/utils": "npm:^6.21.0" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10/6a1718c59e1f7dd9e0897c3c0c74f40729038c988e6812e730a793bb0ef8b49208e792d23af723e1ee6aa373a0002c0ec1429f5ec19ca6b8df45a3c0c4aaaba6 + languageName: node + linkType: hard + +"@stylistic/eslint-plugin@npm:^1.5.4": + version: 1.8.1 + resolution: "@stylistic/eslint-plugin@npm:1.8.1" + dependencies: + "@stylistic/eslint-plugin-js": "npm:1.8.1" + "@stylistic/eslint-plugin-jsx": "npm:1.8.1" + "@stylistic/eslint-plugin-plus": "npm:1.8.1" + "@stylistic/eslint-plugin-ts": "npm:1.8.1" + "@types/eslint": "npm:^8.56.10" + peerDependencies: + eslint: ">=8.40.0" + checksum: 10/55823d0ab094169ff99574b79ffb1af9b766b47806b1801b3a82fe249019a33d1f116d101eb2022f3ba95f37840b586b3f073650d9d29099ce3ad67d1d0824cd + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10/51fe47d55fe1b80ec35e6e5ed30a13665fd3a531945350aa74a14a1e82875fb60b350c2f2a5e72a64831b1b6bc02acb6760c30b3738b54954ec2dea82db7a267 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10/5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10/19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10/202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10/c32838d280b5ab59d62557f9e331d3831f8e547ee10b4f85cb78753d97d521270cebfc73ce501e9fb27fe71884d1ba75e18658692c2f4117543f0fc4e3e118b3 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10/b53c215e9074c69d212402990b0ca8fa57595d09e10d94bda3130aa22b55d796e50449199867879e4ea0ee968f3a2099e009cfb21a726a53324483abbf25cd30 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10/d7a02d2a9b67e822694d8e6a7ddb8f2b71a1d6962dfd266554d2513eefbb205b33ca71a0d163b1caea3981ccf849211f9964d8bd0727124d18ace45aa6c9ae29 + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10/63d13a3789aa1e783b87a8b03d9fb2c2c90078de7782422feff1631b8c2a25db626e63a63ac5a1465d47359201c73069dacb4b52149d17c568187625da3064ae + languageName: node + linkType: hard + +"@types/eslint@npm:^8.56.10": + version: 8.56.12 + resolution: "@types/eslint@npm:8.56.12" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10/bd998b5d3f98ac430ec8db6223f1cff1820774c1e72eabda05463256875d97065fd357fba7379dd25e6bfbeb73296f28faff6f4dcbc320f890bb49b09087644d + languageName: node + linkType: hard + +"@types/estree@npm:*": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + +"@types/fs-extra@npm:^11.0.0": + version: 11.0.4 + resolution: "@types/fs-extra@npm:11.0.4" + dependencies: + "@types/jsonfile": "npm:*" + "@types/node": "npm:*" + checksum: 10/acc4c1eb0cde7b1f23f3fe6eb080a14832d8fa9dc1761aa444c5e2f0f6b6fa657ed46ebae32fb580a6700fc921b6165ce8ac3e3ba030c3dd15f10ad4dd4cae98 + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10/79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 + languageName: node + linkType: hard + +"@types/http-link-header@npm:^1.0.1": + version: 1.0.7 + resolution: "@types/http-link-header@npm:1.0.7" + dependencies: + "@types/node": "npm:*" + checksum: 10/168d8f533d719eccd3e3d27e77c9d32490f27449deaf9ae8c507d63316063a2d29a98bb81dca6557dd04426f7d3607fe92b4f21f70409c7b2e2e4d298e26ea46 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10/b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10/93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 + languageName: node + linkType: hard + +"@types/jest@npm:^29.0.0": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10/59ec7a9c4688aae8ee529316c43853468b6034f453d08a2e1064b281af9c81234cec986be796288f1bbb29efe943bc950e70c8fa8faae1e460d50e3cf9760f9b + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10/4e5aed58cabb2bbf6f725da13421aa50a49abb6bc17bfab6c31b8774b073fa7b50d557c61f961a09a85f6056151190f8ac95f13f5b48136ba5841f7d4484ec56 + languageName: node + linkType: hard + +"@types/jsonfile@npm:*": + version: 6.1.4 + resolution: "@types/jsonfile@npm:6.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10/309fda20eb5f1cf68f2df28931afdf189c5e7e6bec64ac783ce737bb98908d57f6f58757ad5da9be37b815645a6f914e2d4f3ac66c574b8fe1ba6616284d0e97 + languageName: node + linkType: hard + +"@types/mdast@npm:^3.0.0": + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" + dependencies: + "@types/unist": "npm:^2" + checksum: 10/050a5c1383928b2688dd145382a22535e2af87dc3fd592c843abb7851bcc99893a1ee0f63be19fc4e89779387ec26a57486cfb425b016c0b2a98a17fc4a1e8b3 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 10/477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.13.10 + resolution: "@types/node@npm:22.13.10" + dependencies: + undici-types: "npm:~6.20.0" + checksum: 10/57dc6a5e0110ca9edea8d7047082e649fa7fa813f79e4a901653b9174141c622f4336435648baced5b38d9f39843f404fa2d8d7a10981610da26066bc8caab48 + languageName: node + linkType: hard + +"@types/node@npm:^18.0.0": + version: 18.19.80 + resolution: "@types/node@npm:18.19.80" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10/05a54af019aae1fa7d7f8e6475071a7486cb8554f638894b5697ef1cad3b5ac6cbdd5fdfe3d8d70b3af7e56e0245b0033a986c00e1c09e80cb584db06e40c0ba + languageName: node + linkType: hard + +"@types/node@npm:^24.0.0": + version: 24.9.1 + resolution: "@types/node@npm:24.9.1" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10/eacbd06621616825042428dd6105d0c2f86d67b5f05f99db9fa89fe1cc173d5e65e604a9a61f1ce52ad915d09f2119e7468816ca1a22bb7a3cf5f3c131413c86 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10/65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + +"@types/readable-stream@npm:^2.3.13": + version: 2.3.15 + resolution: "@types/readable-stream@npm:2.3.15" + dependencies: + "@types/node": "npm:*" + safe-buffer: "npm:~5.1.1" + checksum: 10/49b51e56f9cc401cb31c72973a7565ef4208d7e2465a789843104ec0fcbe609727b0b5bf4682fbec773c7f7bd14858e5dba739fd85e14d8a85e41185d65984d3 + languageName: node + linkType: hard + +"@types/rimraf@npm:^4.0.0": + version: 4.0.5 + resolution: "@types/rimraf@npm:4.0.5" + dependencies: + rimraf: "npm:*" + checksum: 10/8c7201ff0ea89c4917d5010b22113e906930da65b6506ff4b45f99bde39099dc5195f095206fde8b84bc364cf801ee5eaf594c2676d3f3dd0e468344ab316187 + languageName: node + linkType: hard + +"@types/semver@npm:^7.0.0, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4, @types/semver@npm:^7.5.0": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: 10/3496808818ddb36deabfe4974fd343a78101fa242c4690044ccdc3b95dcf8785b494f5d628f2f47f38a702f8db9c53c67f47d7818f2be1b79f2efb09692e1178 + languageName: node + linkType: hard + +"@types/sparqljs@npm:^3.1.3": + version: 3.1.12 + resolution: "@types/sparqljs@npm:3.1.12" + dependencies: + "@rdfjs/types": "npm:>=1.0.0" + checksum: 10/7485343ad3bc360017dd1fa21b0e6c8867e49a19a71f575d5dda078993d15b34762a1db09928dcaf34e6e845d5a5df43279577349d106589a5c96133212a72a4 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10/72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10/519b6a1b30d4571965c9706ad5400a200b94e4050feca3e7856e3ea7ac00ec9903e32e9a10e2762d0f7e472d5d03e5f4b29c16c0bd8c1f77c8876c683b2231f1 + languageName: node + linkType: hard + +"@types/unist@npm:^2, @types/unist@npm:^2.0.2": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10/6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10/a794eb750e8ebc6273a51b12a0002de41343ffe46befef460bdbb57262d187fdf608bc6615b7b11c462c63c3ceb70abe2564c8dd8ee0f7628f38a314f74a9b9b + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.24, @types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10/16f6681bf4d99fb671bf56029141ed01db2862e3db9df7fc92d8bea494359ac96a1b4b1c35a836d1e95e665fb18ad753ab2015fc0db663454e8fd4e5d5e2ef91 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^6.20.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/type-utils": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/a57de0f630789330204cc1531f86cfc68b391cafb1ba67c8992133f1baa2a09d629df66e71260b040de4c9a3ff1252952037093c4128b0d56c4dbb37720b4c1d + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^6.20.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/4d51cdbc170e72275efc5ef5fce48a81ec431e4edde8374f4d0213d8d370a06823e1a61ae31d502a5f1b0d1f48fc4d29a1b1b5c2dcf809d66d3872ccf6e46ac7 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + checksum: 10/e827770baa202223bc0387e2fd24f630690809e460435b7dc9af336c77322290a770d62bd5284260fa881c86074d6a9fd6c97b07382520b115f6786b8ed499da + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + checksum: 10/fe91ac52ca8e09356a71dc1a2f2c326480f3cccfec6b2b6d9154c1a90651ab8ea270b07c67df5678956c3bbf0bbe7113ab68f68f21b20912ea528b1214197395 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/scope-manager@npm:7.18.0" + dependencies: + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" + checksum: 10/9eb2ae5d69d9f723e706c16b2b97744fc016996a5473bed596035ac4d12429b3d24e7340a8235d704efa57f8f52e1b3b37925ff7c2e3384859d28b23a99b8bcc + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/d03fb3ee1caa71f3ce053505f1866268d7ed79ffb7fed18623f4a1253f5b8f2ffc92636d6fd08fcbaf5bd265a6de77bf192c53105131e4724643dfc910d705fc + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 10/24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 10/e26da86d6f36ca5b6ef6322619f8ec55aabcd7d43c840c977ae13ae2c964c3091fc92eb33730d8be08927c9de38466c5323e78bfb270a9ff1d3611fe821046c5 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/types@npm:7.18.0" + checksum: 10/0e30c73a3cc3c67dd06360a5a12fd12cee831e4092750eec3d6c031bdc4feafcb0ab1d882910a73e66b451a4f6e1dd015e9e2c4d45bf6bf716a474e5d123ddf0 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/b32fa35fca2a229e0f5f06793e5359ff9269f63e9705e858df95d55ca2cd7fdb5b3e75b284095a992c48c5fc46a1431a1a4b6747ede2dd08929dc1cbacc589b8 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:7.18.0, @typescript-eslint/typescript-estree@npm:^7.1.0": + version: 7.18.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" + dependencies: + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/visitor-keys": "npm:7.18.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/b01e66235a91aa4439d02081d4a5f8b4a7cf9cb24f26b334812f657e3c603493e5f41e5c1e89cf4efae7d64509fa1f73affc16afc5e15cb7f83f724577c82036 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + semver: "npm:^7.5.4" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 10/b404a2c55a425a79d054346ae123087d30c7ecf7ed7abcf680c47bf70c1de4fabadc63434f3f460b2fa63df76bc9e4a0b9fa2383bb8a9fcd62733fb5c4e4f3e3 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^5.10.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@types/json-schema": "npm:^7.0.9" + "@types/semver": "npm:^7.3.12" + "@typescript-eslint/scope-manager": "npm:5.62.0" + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/typescript-estree": "npm:5.62.0" + eslint-scope: "npm:^5.1.1" + semver: "npm:^7.3.7" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/15ef13e43998a082b15f85db979f8d3ceb1f9ce4467b8016c267b1738d5e7cdb12aa90faf4b4e6dd6486c236cf9d33c463200465cf25ff997dbc0f12358550a1 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^6.13.0 || ^7.0.0, @typescript-eslint/utils@npm:^7.1.1": + version: 7.18.0 + resolution: "@typescript-eslint/utils@npm:7.18.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:7.18.0" + "@typescript-eslint/types": "npm:7.18.0" + "@typescript-eslint/typescript-estree": "npm:7.18.0" + peerDependencies: + eslint: ^8.56.0 + checksum: 10/f43fedb4f4d2e3836bdf137889449063a55c0ece74fdb283929cd376197b992313be8ef4df920c1c801b5c3076b92964c84c6c3b9b749d263b648d0011f5926e + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 10/dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": "npm:6.21.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/30422cdc1e2ffad203df40351a031254b272f9c6f2b7e02e9bfa39e3fc2c7b1c6130333b0057412968deda17a3a68a578a78929a8139c6acef44d9d841dc72e1 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:7.18.0": + version: 7.18.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" + dependencies: + "@typescript-eslint/types": "npm:7.18.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10/b7cfe6fdeae86c507357ac6b2357813c64fb2fbf1aaf844393ba82f73a16e2599b41981b34200d9fc7765d70bc3a8181d76b503051e53f04bcb7c9afef637eab + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-darwin-arm64@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-darwin-arm64@npm:1.2.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-darwin-x64@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-darwin-x64@npm:1.2.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-freebsd-x64@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-freebsd-x64@npm:1.2.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-linux-arm-gnueabihf@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-linux-arm-gnueabihf@npm:1.2.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-linux-arm64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-linux-arm64-gnu@npm:1.2.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-linux-arm64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-linux-arm64-musl@npm:1.2.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-linux-x64-gnu@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-linux-x64-gnu@npm:1.2.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-linux-x64-musl@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-linux-x64-musl@npm:1.2.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-wasm32-wasi@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-wasm32-wasi@npm:1.2.2" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.7" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-win32-arm64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-win32-arm64-msvc@npm:1.2.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/rspack-resolver-binding-win32-x64-msvc@npm:1.2.2": + version: 1.2.2 + resolution: "@unrs/rspack-resolver-binding-win32-x64-msvc@npm:1.2.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10/2ceee14efdeda42ef7355178c1069499f183546ff7112b3efe79c1edef09d20ad9c17939752215fb8f7fcf48d10e6a7c0aa00136dc9cf4d293d963718bb1d200 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10/ed84af329f1828327798229578b4fe03a4dd2596ba304083ebd2252666bdc1d7647d66d0b18704477e1f8aa315f055944aa6e859afebd341f12d0a53c37b4b40 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/d4371eaef7995530b5b5ca4183ff6f062ca17901a6d3f673c9ac011b01ede37e7a1f7f61f8f5cfe709e88054757bb8f3277dc4061087cdf4f2a1f90ccbcdb977 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10/871386764e1451c637bb8ab9f76f4995d408057e9909be6fb5ad68537ae3375d85e6a6f170b98989f44ab3ff6c74ad120bc2779a3d577606e7a0cd2b4efcaf77 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.9.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10/d1379bbee224e8d44c3c3946e6ba6973e999fbdd4e22e41c3455d7f9b6f72f7ce18d3dc218002e1e48eea789539cf1cb6d1430c81838c6744799c712fb557d92 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10/3db6d8d4651f2aa1a9e4af35b96ab11a7607af57a24f3bc721a387eaa3b5f674e901f0a648b0caefd48f3fd117c7761b79a3b55854e2aebaa96c3f32cf76af84 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4, ajv@npm:~6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10/8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10/2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10/b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0, ansi-styles@npm:^5.2.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10/d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10/70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10/3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"are-docs-informative@npm:^0.0.2": + version: 0.0.2 + resolution: "are-docs-informative@npm:0.0.2" + checksum: 10/12cdae51a4bb369832ef1a35840604247d4ed0cbc8392f2519988d170f92c3f8c60e465844f41acba1ec3062d0edb2e9133fca38cb9c1214309153d50a25fa29 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10/969b491082f20cad166649fa4d2073ea9e974a4e5ac36247ca23d2e5a8b3cb12d60e9ff70a8acfe26d76566c71fd351ee5e6a9a6595157eb36f92b1fd64e1599 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10/c6a621343a553ff3779390bb5ee9c2263d6643ebcd7843227bdde6cc7adbed796eb5540ca98db19e3fd7b4714e1faa51551f8849b268bb62df27ddb15cbcd91e + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10/18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10/0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + is-string: "npm:^1.0.7" + checksum: 10/290b206c9451f181fb2b1f79a3bf1c0b66bb259791290ffbada760c79b284eef6f5ae2aeb4bcff450ebc9690edd25732c4c73a3c2b340fcc0f4563aed83bf488 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10/5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-shim-unscopables: "npm:^1.1.0" + checksum: 10/5ddb6420e820bef6ddfdcc08ce780d0fd5e627e97457919c27e32359916de5a11ce12f7c55073555e503856618eaaa70845d6ca11dcba724766f38eb1c22f7a2 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/f9b992fa0775d8f7c97abc91eb7f7b2f0ed8430dd9aeb9fdc2967ac4760cdd7fc2ef7ead6528fef40c7261e4d790e117808ce0d3e7e89e91514d4963a531cd01 + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/473534573aa4b37b1d80705d0ce642f5933cccf5617c9f3e8a56686e9815ba93d469138e86a1f25d2fe8af999c3d24f54d703ec1fc2db2e6778d46d0f4ac951e + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.1": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10/874694e5d50e138894ff5b853e639c29b0aa42bbd355acda8e8e9cd337f1c80565f21edc15e8c727fa4c0877fd9d8783c575809e440cc4d2d19acaa048bf967d + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10/4821ebdfe7d699f910c7f09bc9fa996f09b96b80bccb4f5dd4b59deae582f6ad6e505ecef6376f8beac1eda06df2dbc89b70e82835d104d6fcabd33c1aed1ae9 + languageName: node + linkType: hard + +"arrayify-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "arrayify-stream@npm:1.0.0" + checksum: 10/36b266549c247ffd70eb69bd1054e7882451d7737c7252670ee946bd58e903308bf0a09e47f0d5e8bd328fdacaf6075e47e13fadc913cbe4b2b29bed0ce34615 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 10/745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10/1a09379937d846f0ce7614e75071c12826945d4e417db634156bf0e4673c495989302f52186dfa9767a1d9181794554717badd193ca2bbab046ef1da741d8efd + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 + languageName: node + linkType: hard + +"asynciterator@npm:^3.8.1": + version: 3.9.0 + resolution: "asynciterator@npm:3.9.0" + checksum: 10/7be3809e91e80369ca6bc056477ed2f8d8813e1c416e46d67729b78b83de844fe5d34bc1116b69251a30c6e31764d8d1007c27d5a948a3b3e3b70c2b16a479bf + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10/6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10/8a0953bd813b3a8926008f7351611055548869e9a53dd36d6e7e96679001f71e65fd7dbfe253265c3ba6a4e630dc7c845cf3e78b17d758ef1880313ce8fba258 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10/ffd436bb2a77bbe1942a33245d770506ab2262d9c1b3c1f1da7f0592f78ee7445a95bc2efafe619dd9c1b6ee52c10033d6c7d29ddefe6f5383568e60f31dfe8d + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10/9bfa86ec4170bd805ab8ca5001ae50d8afcb30554d236ba4a7ffc156c1a92452e220e4acbd98daefc12bf0216fccd092d0a2efed49e7e384ec59e0597a926d65 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/46331111ae72b7121172fd9e6a4a7830f651ad44bf26dbbf77b3c8a60a18009411a3eacb5e72274004290c110371230272109957d5224d155436b4794ead2f1b + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10/9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10/669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10/3e25c80ef626c3a3487c73dbfc70ac322ec830666c9ad915d11b701142fab25ec1e63eff2c450c74347acfd2de854ccde865cd79ef4db1683f7c7b046ea43bb0 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10/faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10/a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 + languageName: node + linkType: hard + +"bs-logger@npm:^0.2.6": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10/e6d3ff82698bb3f20ce64fb85355c5716a3cf267f3977abe93bf9c32a2e46186b253f48a028ae5b96ab42bacd2c826766d9ae8cf6892f9b944656be9113cf212 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10/edba1b65bae682450be4117b695997972bd9a3c4dfee029cab5bcb72ae5393a79a8f909b8bc77957eb0deec1c7168670f18f4d5c556f46cdd3bca5f3b3a8d020 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10/0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10/b6bc68237ebf29bdacae48ce60e5e28fc53ae886301f2ad9496618efac49427ed79096750033e7eab1897a4f26ae374ace49106a5758f38fb70c78c9fda2c3b1 + languageName: node + linkType: hard + +"builtin-modules@npm:3.2.0": + version: 3.2.0 + resolution: "builtin-modules@npm:3.2.0" + checksum: 10/cb64c436f4d9bf7c5ba5d2672ce8483ba36f6efabaeb11d0ecd534ccd2c82431d52f0e8d01e38de88b225db11fc293561030c8f52abfa2c8e9c63e259d160788 + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: 10/62e063ab40c0c1efccbfa9ffa31873e4f9d57408cb396a2649981a0ecbce56aabc93c28feaccbc5658c95aab2703ad1d11980e62ec2e5e72637404e1eb60f39e + languageName: node + linkType: hard + +"builtins@npm:^5.0.1": + version: 5.1.0 + resolution: "builtins@npm:5.1.0" + dependencies: + semver: "npm:^7.0.0" + checksum: 10/60aa9969f69656bf6eab82cd74b23ab805f112ae46a54b912bccc1533875760f2d2ce95e0a7d13144e35ada9f0386f17ed4961908bc9434b5a5e21375b1902b2 + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10/ea026b27b13656330c2bbaa462a88181dcaa0435c1c2e705db89b31d9bdf7126049d6d0445ba746dca21454a0cfdf1d6f47fd39d34c8c8435296b30bc5738a13 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10/659b03c79bbfccf0cde3a79e7d52570724d7290209823e1ca5088f94b52192dc1836b82a324d0144612f816abb2f1734447438e38d9dafe0b3f82c2a1b9e3bce + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 + languageName: node + linkType: hard + +"call-me-maybe@npm:^1.0.1": + version: 1.0.2 + resolution: "call-me-maybe@npm:1.0.2" + checksum: 10/3d375b6f810a82c751157b199daba60452876186c19ac653e81bfc5fc10d1e2ba7aedb8622367c3a8aca6879f0e6a29435a1193b35edb8f7fd8267a67ea32373 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: 10/c1999f5b6d03bee7be9a36e48eef3da9e93e51b000677348ec8d15d51fc4418375890fb6c7155e387322d2ebb2a2cdebf9cd96607a6753d1d6c170d9b1e2eed5 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10/e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001706 + resolution: "caniuse-lite@npm:1.0.30001706" + checksum: 10/fba85aa9c2e1cd38f4836ddba06fea9984b81541be737290db84f0eda0cdd33f0d68c5371219c723ec4098802b4d33e31c29690641452c7b8abee34143a1d237 + languageName: node + linkType: hard + +"canonicalize@npm:^1.0.1": + version: 1.0.8 + resolution: "canonicalize@npm:1.0.8" + checksum: 10/4087d6de4a2412b9d36f9cbc0825336d97fa61021365d53869b30d3476a348425f193d019e18a21c97ebd042ac9f98f93f6059f14b4105b741c69b4b940bd91a + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10/1ec5c2906adb9f84e7f6732a40baef05d7c85401b82ffcbc44b85fbd0f7a2b0c2a96f2eb9cf55cae3235dc12d4023003b88f09bcae8be9ae894f52ed746f4d48 + languageName: node + linkType: hard + +"character-entities-legacy@npm:^1.0.0": + version: 1.1.4 + resolution: "character-entities-legacy@npm:1.1.4" + checksum: 10/fe03a82c154414da3a0c8ab3188e4237ec68006cbcd681cf23c7cfb9502a0e76cd30ab69a2e50857ca10d984d57de3b307680fff5328ccd427f400e559c3a811 + languageName: node + linkType: hard + +"character-entities@npm:^1.0.0": + version: 1.2.4 + resolution: "character-entities@npm:1.2.4" + checksum: 10/7c11641c48d1891aaba7bc800d4500804d91a28f46d64e88c001c38e6ab2e7eae28873a77ae16e6c55d24cac35ddfbb15efe56c3012b86684a3c4e95c70216b7 + languageName: node + linkType: hard + +"character-reference-invalid@npm:^1.0.0": + version: 1.1.4 + resolution: "character-reference-invalid@npm:1.1.4" + checksum: 10/812ebc5e6e8d08fd2fa5245ae78c1e1a4bea4692e93749d256a135c4a442daf931ca18e067cc61ff4a58a419eae52677126a0bc4f05a511290427d60d3057805 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10/b63cb1f73d171d140a2ed8154ee6566c8ab775d3196b0e03a2a94b5f6a0ce7777ee5685ca56849403c8d17bd457a6540672f9a60696a6137c7a409097495b82c + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 + languageName: node + linkType: hard + +"ci-info@npm:^4.0.0": + version: 4.2.0 + resolution: "ci-info@npm:4.2.0" + checksum: 10/928d8457f3476ffc4a66dec93b9cdf1944d5e60dba69fbd6a0fc95b652386f6ef64857f6e32372533210ef6d8954634af2c7693d7c07778ee015f3629a5e0dd9 + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10/d2b92f919a2dedbfd61d016964fce8da0035f827182ed6839c97cac56e8a8077cfa6a59388adfe2bc588a19cef9bbe830d683a76a6e93c51f65852062cfe2591 + languageName: node + linkType: hard + +"clean-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "clean-regexp@npm:1.0.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10/0b1ce281b07da2463c6882ea2e8409119b6cabbd9f687cdbdcee942c45b2b9049a2084f7b5f228c63ef9f21e722963ae0bfe56a735dbdbdd92512867625a7e40 + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10/db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10/eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10/a5d9f37091c70398a269e625cedff5622f200ed0aa0cff22ee7b55ed74a123834b58711776eb0f1dc58eb6ebbc1185aa7567b57bd5979a948c6e4f85073e2c05 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10/30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.3": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10/fa00c91b4332b294de06b443923246bccebe9fab1b253f7fe1772d37b06a2269b4039a85e309abe1fe11b267b11c08d1d0473fda3badd6167f57313af2887a64 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10/72aa0b81ee71b3f4fb1ac9cd839cdbd7a011a7d318ef58e6cb13b3708dca75c7e45029697260488709f1b1c7ac4e35489a87e528156c1e365917d1c4ccb9b9cd + languageName: node + linkType: hard + +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10/bf70438e0192f4f62f4bfbb303e7231289e8cc0d15ff6b6cbdb722d51f680049f38d4fdfc057a99cb641895cf5e350478c61d98586400b060043afc44285e7ae + languageName: node + linkType: hard + +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10/bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + +"comment-parser@npm:1.4.1, comment-parser@npm:^1.4.0": + version: 1.4.1 + resolution: "comment-parser@npm:1.4.1" + checksum: 10/16a3260b5e77819ebd9c99b0b65c7d6723b1ff73487bac9ce2d8f016a2847dd689e8663b88e1fad1444bbea89847c42f785708ac86a2c55f614f7095249bbf6b + languageName: node + linkType: hard + +"componentsjs-generator@workspace:.": + version: 0.0.0-use.local + resolution: "componentsjs-generator@workspace:." + dependencies: + "@rubensworks/eslint-config": "npm:^3.0.0" + "@types/fs-extra": "npm:^11.0.0" + "@types/jest": "npm:^29.0.0" + "@types/minimist": "npm:^1.2.0" + "@types/node": "npm:^24.0.0" + "@types/rimraf": "npm:^4.0.0" + "@types/semver": "npm:^7.0.0" + "@typescript-eslint/typescript-estree": "npm:^7.1.0" + comment-parser: "npm:^1.4.0" + componentsjs: "npm:^6.3.0" + eslint: "npm:^8.0.0" + fs-extra: "npm:^11.0.0" + husky: "npm:^9.0.0" + jest: "npm:^29.0.0" + jest-extended: "npm:^7.0.0" + jsonld-context-parser: "npm:^3.0.0" + lru-cache: "npm:^11.0.0" + manual-git-changelog: "npm:^1.0.0" + minimist: "npm:^1.2.0" + rdf-object: "npm:^2.0.0" + rimraf: "npm:^6.0.1" + semver: "npm:^7.0.0" + ts-jest: "npm:^29.0.0" + ts-node: "npm:^10.0.0" + typescript: "npm:^5.0.0" + bin: + componentsjs-generator: bin/componentsjs-generator.js + languageName: unknown + linkType: soft + +"componentsjs@npm:^6.3.0": + version: 6.3.0 + resolution: "componentsjs@npm:6.3.0" + dependencies: + "@rdfjs/types": "npm:*" + "@types/minimist": "npm:^1.2.0" + "@types/node": "npm:^18.0.0" + "@types/semver": "npm:^7.3.4" + jsonld-context-parser: "npm:^3.0.0" + minimist: "npm:^1.2.0" + rdf-data-factory: "npm:^1.1.0" + rdf-object: "npm:^2.0.0" + rdf-parse: "npm:^2.0.0" + rdf-quad: "npm:^1.5.0" + rdf-string: "npm:^1.6.0" + rdf-terms: "npm:^1.7.0" + semver: "npm:^7.3.2" + winston: "npm:^3.3.3" + bin: + componentsjs-compile-config: bin/compile-config.js + checksum: 10/edd988d1f8c5e08dbc178ccd38d184f63cea8636eb93e3a32064d3bd28e3384f7e06d16976dd83f99442cc864ecc8eba17786877c759e7671ccb875db3bdaf54 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10/9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 + languageName: node + linkType: hard + +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10/4ebcfb1c6a3b25276734ec5722e88768eb61fc02f98e11960b845c5c62bc27fd05f493d2a8244d9675b24ef95afe4c0d511cdcad02c72f5eeea463cc26687999 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.34.0": + version: 3.41.0 + resolution: "core-js-compat@npm:3.41.0" + dependencies: + browserslist: "npm:^4.24.4" + checksum: 10/a59da111fc437cc7ed1a1448dae6883617cabebd7731433d27ad75e0ff77df5f411204979bd8eb5668d2600f99db46eedf6f87e123109b6de728bef489d4229a + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10/9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10/847b4764451672b4174be4d5c6d7d63442ec3aa5f3de52af924e4d996d87d7801c18e125504f25232fc75840f6625b3ac85860fac6ce799b5efae7bdcaf4a2b7 + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10/a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-fetch@npm:^3.0.6": + version: 3.2.0 + resolution: "cross-fetch@npm:3.2.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10/e4ab1d390a5b6ca8bb0605f028af2ffc1127d2e407b954654949f506d04873c4863ece264662c074865d7874060e35f938cec74fe7b5736d46d545e2685f6aec + languageName: node + linkType: hard + +"cross-fetch@npm:^4.0.0": + version: 4.1.0 + resolution: "cross-fetch@npm:4.1.0" + dependencies: + node-fetch: "npm:^2.7.0" + checksum: 10/07624940607b64777d27ec9c668ddb6649e8c59ee0a5a10e63a51ce857e2bbb1294a45854a31c10eccb91b65909a5b199fcb0217339b44156f85900a7384f489 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10/0e161912c1306861d8f46e1883be1cbc8b1b2879f0f509287c0db71796e4ddfb97ac96bdfca38f77f452e2c10554e1bb5678c99b07a5cf947a12778f73e47e12 + languageName: node + linkType: hard + +"dargs@npm:^7.0.0": + version: 7.0.0 + resolution: "dargs@npm:7.0.0" + checksum: 10/b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/c10b155a4e93999d3a215d08c23eea95f865e1f510b2e7748fcae1882b776df1afe8c99f483ace7fc0e5a3193ab08da138abebc9829d12003746c5a338c4d644 + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10/2a47055fcf1ab3ec41b00b6f738c6461a841391a643c9ed9befec1117c1765b4d492661d97fb7cc899200c328949dca6ff189d2c6537d96d60e8a02dfe3c95f7 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10/fa3bdfa0968bea6711ee50375094b39f561bce3f15f9e558df59de9c25f0bdd4cddc002d9c1d70ac7772ebd36854a7e22d1761e7302a934e6f1c2263bcf44aa2 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10/d86fd7be2b85462297ea16f1934dc219335e802f629ca9a69b63ed8ed041dda492389bb2ee039217c02e5b54792b1c51aa96ae954cf28634d363a2360c7a1639 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 10/71d5898174f17a8d2303cecc98ba0236e842948c4d042a8180d5e749be8442220bca2d16dd93bebd7b49e86c807814273212e4da0fae67be7c58c282ff76057a + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10/ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10/e5277f6268f288649503125b781a7b7a2c9b22d011139688c0b3619fe40121e600eb1f077c891938d4b2428bdb6326cc3c77a763e4b1cc681bd9666ab1bad2a1 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10/ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10/abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10/b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10/ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10/179daf9d2f9af5c57ad66d97cb902a538bcf8ed64963fa7aa0c329b3de3665ce2eb6ffdc2f69f29d445fa4af2517e5e55e5b6e00c00a9ae4f43645f97f7078cb + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10/ec09ec2101934ca5966355a229d77afcad5911c92e2a77413efda5455636c4cf2ce84057e2d7715227a2eeeda04255b849bd3ae3a4dd22eb22e86e76456df069 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10/fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10/555684f77e791b17173ea86e2eea45ef26c22219cb64670669c4f4bebd26dbc95cd90ec1f4159e9349a6bb9eb892ce4dde8cd0139e77bedd8bf4518238618474 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10/b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10/e3bf9027a64450bca0a72297ecdc1e3abb7a2912268a9f3f5d33a2e29c1e2c3502c6e9f860fc6625940bfe0cfb57a44953262b9e94df76872fdfb8151097eeb3 + languageName: node + linkType: hard + +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10/ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10/809b805a50a9c6884a29f38aec0a4e1b4537f40e1c861950ed47d10b049febe6b79ab72adaeeebb3cc8fc1cd33f34e97048a72a9265103426d93efafa78d3e96 + languageName: node + linkType: hard + +"domutils@npm:^3.0.1, domutils@npm:^3.1.0": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + checksum: 10/2e08842151aa406f50fe5e6d494f4ec73c2373199fa00d1f77b56ec604e566b7f226312ae35ab8160bb7f27a27c7285d574c8044779053e499282ca9198be210 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10/5add88a3d68d42d6e6130a0cac450b7c2edbe73364bbd2fc334564418569bea97c6943a8fcd70e27130bf32afc236f30982fc4905039b703f23e9e0433c29934 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10/9b1d3e1baefeaf7d70799db8774149cef33b97183a6addceeba0cf6b85ba23ee2686f302f14482006df32df75d32b17c509c143a3689627929e4a8efaf483952 + languageName: node + linkType: hard + +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: 10/a9cb7d7cd13b7b1cd0be5c4788e44dd10d92f7285d2f65b942f33e127230c054f99a42db4d99f766d8dbc6c57e94799593ee66a14efd7c8dd70c4812bf6aa384 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.122 + resolution: "electron-to-chromium@npm:1.5.122" + checksum: 10/6c26259c8f0be170cd4ee1e08d0e50acbf4103774832b60bc7f7d7ac9af5764af94a57c096b3a0c9cf1f2934f3562ede30e06795f8a8d7f4ad689d68c8909f57 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10/fbe214171d878b924eedf1757badf58a5dce071cd1fa7f620fa841a0901a80d6da47ff05929d53163105e621ce11a71b9d8acb1148ffe1745e045145f6e69521 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10/c72d67a6821be15ec11997877c437491c313d924306b8da5d87d2a2bcc2cec9903cb5b04ee1a088460501d8e5b44f10df82fdc93c444101a7610b80c8b6938e1 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10/915acf859cea7131dac1b2b5c9c8e35c4849e325a1d114c30adb8cd615970f6dca0e27f64f3a4949d7d6ed86ecd79a1c5c63f02e697513cddd7b5835c90948b8 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10/9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10/bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10/ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10/1d20d825cdcce8d811bfbe86340f4755c02655a7feb2f13f8c880566d9d72a3f6c92c192a6867632e490d6da67b678271f46e01044996a6443e870331100dfdd + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10/d547740aa29c34e753fb6fed2c5de81802438529c12b3673bd37b6bb1fe49b9b7abdc3c11e6062fe625d8a296b3cf769a80f878865e25e685f787763eede3ffb + languageName: node + linkType: hard + +"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10/31a321966d760d88fc2ed984104841b42f4f24fc322b246002b9be0af162e03803ee41fcc3cf8be89e07a27ba3033168f877dd983703cb81422ffe5322a27582 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10/f8dc9e660d90919f11084db0a893128f3592b781ce967e4fccfb8f3106cb83e400a4032c559184ec52ee1dbd4b01e7776c7cd0b3327b1961b1a4a7008920fe78 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.0.12": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.6" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.4" + safe-array-concat: "npm:^1.1.3" + checksum: 10/802e0e8427a05ff4a5b0c70c7fdaaeff37cdb81a28694aeb7bfb831c6ab340d8f3deeb67b96732ff9e9699ea240524d5ea8a9a6a335fcd15aa3983b27b06113f + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.5.3": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10/807ee7020cc46a9c970c78cad1f2f3fc139877e5ebad7f66dbfbb124d451189ba1c48c1c632bd5f8ce1b8af2caef3fca340ba044a410fa890d17b080a59024bb + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/54fe77de288451dae51c37bfbfe3ec86732dc3778f98f3eb3bdb4bf48063b2c0b8f9c93542656986149d08aa5be3204286e2276053d19582b76753f1a2728867 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/86814bf8afbcd8966653f731415888019d4bc4aca6b6c354132a7a75bb87566751e320369654a101d23a91c87a85c79b178bcf40332839bd347aff437c4fb65f + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/c351f586c30bbabc62355be49564b2435468b52c3532b8a1663672e3d10dc300197e69c247869dd173e56d86423ab95fc0c10b0939cdae597094e0fdca078cba + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10/17faf35c221aad59a16286cbf58ef6f080bf3c485dff202c490d074d8e74da07884e29b852c245d894eac84f73c58330ec956dfd6d02c0b449d75eb1012a3f9b + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 + languageName: node + linkType: hard + +"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10/98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"eslint-compat-utils@npm:^0.4.0": + version: 0.4.1 + resolution: "eslint-compat-utils@npm:0.4.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/62727af92603b000ecfc533cb5aaaf93ab82865fcbbcf46ee0ab3af77b3a0bb26458dd9eae862ca9c8d9d431531c45f572ec23b9f75753d34a8674b2d7c65791 + languageName: node + linkType: hard + +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/ac65ac1c6107cf19f63f5fc17cea361c9cb1336be7356f23dbb0fac10979974b4622e13e950be43cbf431801f2c07f7dab448573181ccf6edc0b86d5b5304511 + languageName: node + linkType: hard + +"eslint-compat-utils@npm:^0.6.0": + version: 0.6.4 + resolution: "eslint-compat-utils@npm:0.6.4" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/97f08f4aa8d9a1bc1087aaeceab46a5fa65a6d70703c1a2f2cd533562381208fdd0a293ce0f63ad607f1e697ddb348ef1076b02f5afa83c70f4a07ca0dcec90e + languageName: node + linkType: hard + +"eslint-config-flat-gitignore@npm:^0.1.2": + version: 0.1.8 + resolution: "eslint-config-flat-gitignore@npm:0.1.8" + dependencies: + find-up-simple: "npm:^1.0.0" + parse-gitignore: "npm:^2.0.0" + checksum: 10/ed81a620878792796ac9b05a6edab0dd4e4a7f6cac0fc4f97d373b0f1cf78e5fe21fc852597732d752690d850005cc5f4dd83361e8d282d56d53bc432a3db22a + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10/d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.6.1": + version: 3.9.1 + resolution: "eslint-import-resolver-typescript@npm:3.9.1" + dependencies: + "@nolyfill/is-core-module": "npm:1.0.39" + debug: "npm:^4.4.0" + get-tsconfig: "npm:^4.10.0" + is-bun-module: "npm:^1.3.0" + rspack-resolver: "npm:^1.1.0" + stable-hash: "npm:^0.0.5" + tinyglobby: "npm:^0.2.12" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10/12f20c9912a5b14e2df30962b3e7682a0a8928830ad18bd95ecbdac5f1241868cc8bfbd3bb03c580bc7aff9c715524e832936259cb46b46defc5777b957d28f8 + languageName: node + linkType: hard + +"eslint-json-compat-utils@npm:^0.2.1": + version: 0.2.1 + resolution: "eslint-json-compat-utils@npm:0.2.1" + dependencies: + esquery: "npm:^1.6.0" + peerDependencies: + eslint: "*" + jsonc-eslint-parser: ^2.4.0 + peerDependenciesMeta: + "@eslint/json": + optional: true + checksum: 10/083272c0cdbc6acd9fe9bfe939e0c76493a426400141203d7f0e76344d5874c5a88535c59300045e4c6f95baa5084eff512013f82bcd9e7426404c785e2ea55d + languageName: node + linkType: hard + +"eslint-merge-processors@npm:^0.1.0": + version: 0.1.0 + resolution: "eslint-merge-processors@npm:0.1.0" + peerDependencies: + eslint: "*" + checksum: 10/428ae746f4b60e7ad2b05bc12f3724244d601a3e2d8e0fe20f3c213752a6852603b1ed098048bd98b1ad028a834b68e36b3878d87506ec11a5c7baeee9582afd + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.8.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/dd27791147eca17366afcb83f47d6825b6ce164abb256681e5de4ec1d7e87d8605641eb869298a0dbc70665e2446dbcc2f40d3e1631a9475dd64dd23d4ca5dee + languageName: node + linkType: hard + +"eslint-plugin-antfu@npm:^2.1.2": + version: 2.7.0 + resolution: "eslint-plugin-antfu@npm:2.7.0" + dependencies: + "@antfu/utils": "npm:^0.7.10" + peerDependencies: + eslint: "*" + checksum: 10/2adb4bb1f3ebcab77024164a40895c3ae61ab5554dbf8d561e597f406b8c9d1d5654c6c1df692334a11c84a64004cf165783219244b565bf1e7f9ca53d2496ef + languageName: node + linkType: hard + +"eslint-plugin-es-x@npm:^7.5.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.1.2" + "@eslint-community/regexpp": "npm:^4.11.0" + eslint-compat-utils: "npm:^0.5.1" + peerDependencies: + eslint: ">=8" + checksum: 10/1df8d52c4fadc06854ce801af05b05f2642aa2deb918fb7d37738596eabd70b7f21a22b150b78ec9104bac6a1b6b4fb796adea2364ede91b01d20964849ce5f7 + languageName: node + linkType: hard + +"eslint-plugin-eslint-comments@npm:^3.2.0": + version: 3.2.0 + resolution: "eslint-plugin-eslint-comments@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + ignore: "npm:^5.0.5" + peerDependencies: + eslint: ">=4.19.1" + checksum: 10/4aa0d31a78ac7746002e37ca0cb436f3e5b481a97d28be07bad831e161a2ffcc4dedff44820edef9a1e80f6a0ab1ef44ed9a46e3a4c4a050350438451908972b + languageName: node + linkType: hard + +"eslint-plugin-extended@npm:0.2.0": + version: 0.2.0 + resolution: "eslint-plugin-extended@npm:0.2.0" + dependencies: + varname: "npm:2.0.2" + checksum: 10/484e250535b60d2864329e120152bf6b2b8c37d2011bc51cebfd09e789ed8ddf0a8c56e4b47385c587d9bf498678eeef19dc5ae97772e39a4e4496a2936e2e23 + languageName: node + linkType: hard + +"eslint-plugin-i@npm:^2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-i@npm:2.29.1" + dependencies: + debug: "npm:^4.3.4" + doctrine: "npm:^3.0.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + get-tsconfig: "npm:^4.7.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + semver: "npm:^7.5.4" + peerDependencies: + eslint: ^7.2.0 || ^8 + checksum: 10/5dc6c0857abe766f32681706f21090aaa214ad93792e25f746e003f971ee727643a52a71c852851a14646434f9d0308197b7763a63cc5c42bb12681eb4119974 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" + dependencies: + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" + semver: "npm:^6.3.1" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 10/5865f05c38552145423c535326ec9a7113ab2305c7614c8b896ff905cfabc859c8805cac21e979c9f6f742afa333e6f62f812eabf891a7e8f5f0b853a32593c1 + languageName: node + linkType: hard + +"eslint-plugin-jest@npm:^27.9.0": + version: 27.9.0 + resolution: "eslint-plugin-jest@npm:27.9.0" + dependencies: + "@typescript-eslint/utils": "npm:^5.10.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 + checksum: 10/bca54347280c06c56516faea76042134dd74355c2de6c23361ba0e8736ecc01c62b144eea7eda7570ea4f4ee511c583bb8dab00d7153a1bd1740eb77b0038fd4 + languageName: node + linkType: hard + +"eslint-plugin-jsdoc@npm:^48.0.4": + version: 48.11.0 + resolution: "eslint-plugin-jsdoc@npm:48.11.0" + dependencies: + "@es-joy/jsdoccomment": "npm:~0.46.0" + are-docs-informative: "npm:^0.0.2" + comment-parser: "npm:1.4.1" + debug: "npm:^4.3.5" + escape-string-regexp: "npm:^4.0.0" + espree: "npm:^10.1.0" + esquery: "npm:^1.6.0" + parse-imports: "npm:^2.1.1" + semver: "npm:^7.6.3" + spdx-expression-parse: "npm:^4.0.0" + synckit: "npm:^0.9.1" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10/3bc2533656e9ccfdadbcd71a6f7c1ec125b1965c6e399a43c40408b51b4f8c26e44031f077c947b15d68b9cd317e7e8be1e2b222a46fb3c24a25377a2643796b + languageName: node + linkType: hard + +"eslint-plugin-jsonc@npm:^2.13.0": + version: 2.19.1 + resolution: "eslint-plugin-jsonc@npm:2.19.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + eslint-compat-utils: "npm:^0.6.0" + eslint-json-compat-utils: "npm:^0.2.1" + espree: "npm:^9.6.1" + graphemer: "npm:^1.4.0" + jsonc-eslint-parser: "npm:^2.0.4" + natural-compare: "npm:^1.4.0" + synckit: "npm:^0.6.0" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/ff013d5ff00bf5705405ab8ab04729edb540beaf2e3f434a4f92ca0f99416e6df76abdaceef12e60d1133dc08a746c68291634c9dde9c73230ff794b9313ae26 + languageName: node + linkType: hard + +"eslint-plugin-markdown@npm:^3.0.1": + version: 3.0.1 + resolution: "eslint-plugin-markdown@npm:3.0.1" + dependencies: + mdast-util-from-markdown: "npm:^0.8.5" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/1408ccd48f6358dfc528a0fe7abc1f468c913144c74392cc3ed4926ed6556e7c87524a0a1b8a40174135e872979d213d05dcd3edc90a3ad555f12feb31c3c87d + languageName: node + linkType: hard + +"eslint-plugin-n@npm:^16.6.2": + version: 16.6.2 + resolution: "eslint-plugin-n@npm:16.6.2" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + builtins: "npm:^5.0.1" + eslint-plugin-es-x: "npm:^7.5.0" + get-tsconfig: "npm:^4.7.0" + globals: "npm:^13.24.0" + ignore: "npm:^5.2.4" + is-builtin-module: "npm:^3.2.1" + is-core-module: "npm:^2.12.1" + minimatch: "npm:^3.1.2" + resolve: "npm:^1.22.2" + semver: "npm:^7.5.3" + peerDependencies: + eslint: ">=7.0.0" + checksum: 10/e0f600d03d3a3df57e9a811648b1b534a6d67c90ea9406340ddf3763c2b87cf5ef910b390f787ca5cb27c8d8ff36aad42d70209b54e2a1cb4cc2507ca417229a + languageName: node + linkType: hard + +"eslint-plugin-no-only-tests@npm:^3.1.0": + version: 3.3.0 + resolution: "eslint-plugin-no-only-tests@npm:3.3.0" + checksum: 10/1b3a88e392113240758405966047ef40dd742fbd828f3c8d02a207125edaa5303ef9a0319a778551bd88789110423221fff4e9db02896c20836389b13c27b32e + languageName: node + linkType: hard + +"eslint-plugin-perfectionist@npm:^2.5.0": + version: 2.11.0 + resolution: "eslint-plugin-perfectionist@npm:2.11.0" + dependencies: + "@typescript-eslint/utils": "npm:^6.13.0 || ^7.0.0" + minimatch: "npm:^9.0.3" + natural-compare-lite: "npm:^1.4.0" + peerDependencies: + astro-eslint-parser: ^1.0.2 + eslint: ">=8.0.0" + svelte: ">=3.0.0" + svelte-eslint-parser: ^0.37.0 + vue-eslint-parser: ">=9.0.0" + peerDependenciesMeta: + astro-eslint-parser: + optional: true + svelte: + optional: true + svelte-eslint-parser: + optional: true + vue-eslint-parser: + optional: true + checksum: 10/f158e1b48068f7c7378da692d3e1fbe6c18ccf21f2fc22b3a9f0717123e6877824fffe6ff89770150f9561a3b69fbed366a28307c7d4fd7e1d2c61131d6cb5a1 + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:4.6.0": + version: 4.6.0 + resolution: "eslint-plugin-react-hooks@npm:4.6.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 10/3c63134e056a6d98d66e2c475c81f904169db817e89316d14e36269919e31f4876a2588aa0e466ec8ef160465169c627fe823bfdaae7e213946584e4a165a3ac + languageName: node + linkType: hard + +"eslint-plugin-react@npm:7.33.2": + version: 7.33.2 + resolution: "eslint-plugin-react@npm:7.33.2" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flatmap: "npm:^1.3.1" + array.prototype.tosorted: "npm:^1.1.1" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.0.12" + estraverse: "npm:^5.3.0" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.6" + object.fromentries: "npm:^2.0.6" + object.hasown: "npm:^1.1.2" + object.values: "npm:^1.1.6" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.4" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.8" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 10/cb8c5dd5859cace330e24b7d74b9c652c0d93ef1d87957261fe1ac2975c27c918d0d5dc607f25aba4972ce74d04456f4f93883a16ac10cd598680d047fc3495d + languageName: node + linkType: hard + +"eslint-plugin-style@npm:^0.2.0": + version: 0.2.0 + resolution: "eslint-plugin-style@npm:0.2.0" + dependencies: + builtin-modules: "npm:3.2.0" + tslib: "npm:2.3.1" + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + checksum: 10/1ed375e2878d7668b6439e981b69d71b7e3fcf300abc7977d795d494ad334531b1ac79b895d7adb866c1a64df0fa7716597d2d9507add66d2b4a87c29508b517 + languageName: node + linkType: hard + +"eslint-plugin-toml@npm:^0.9.2": + version: 0.9.2 + resolution: "eslint-plugin-toml@npm:0.9.2" + dependencies: + debug: "npm:^4.1.1" + eslint-compat-utils: "npm:^0.4.0" + lodash: "npm:^4.17.19" + toml-eslint-parser: "npm:^0.9.0" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/436564d4348c8d834a6bd3d55c0c74db7435131b76315ca108ffed8b54398433df324304390766ac72cde69a7025e80fc284d6f360ba3deb4e9bff429eb94df2 + languageName: node + linkType: hard + +"eslint-plugin-tsdoc@npm:^0.2.17": + version: 0.2.17 + resolution: "eslint-plugin-tsdoc@npm:0.2.17" + dependencies: + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:0.16.2" + checksum: 10/b2b3a1517a2e8ba01eb65ddfb29992a9141954a883935cac069477659647dcb83603b6661d1ee16f9919007f5082cad0fc2532f5d95620fcc3fb239bde820fe3 + languageName: node + linkType: hard + +"eslint-plugin-unicorn@npm:^50.0.1": + version: 50.0.1 + resolution: "eslint-plugin-unicorn@npm:50.0.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@eslint/eslintrc": "npm:^2.1.4" + ci-info: "npm:^4.0.0" + clean-regexp: "npm:^1.0.0" + core-js-compat: "npm:^3.34.0" + esquery: "npm:^1.5.0" + indent-string: "npm:^4.0.0" + is-builtin-module: "npm:^3.2.1" + jsesc: "npm:^3.0.2" + pluralize: "npm:^8.0.0" + read-pkg-up: "npm:^7.0.1" + regexp-tree: "npm:^0.1.27" + regjsparser: "npm:^0.10.0" + semver: "npm:^7.5.4" + strip-indent: "npm:^3.0.0" + peerDependencies: + eslint: ">=8.56.0" + checksum: 10/dd5e45f624a94172965858d7a15434df0ea98e14a300d90cfe7f0cbbd893883e1488036f77cb49162e2b61802c1d5386facfcaf5fd995357a7065013bfb8fe7f + languageName: node + linkType: hard + +"eslint-plugin-unused-imports@npm:^3.0.0": + version: 3.2.0 + resolution: "eslint-plugin-unused-imports@npm:3.2.0" + dependencies: + eslint-rule-composer: "npm:^0.3.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": 6 - 7 + eslint: 8 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + checksum: 10/05ce3ae4278245caeb25af28aa6832ecd59d664633f31b1dd498798d27cb7f959e2af1b8feeef789a87755541f47b222156c29420f1777d4c5f022e842171ed7 + languageName: node + linkType: hard + +"eslint-plugin-vitest@npm:^0.3.21": + version: 0.3.26 + resolution: "eslint-plugin-vitest@npm:0.3.26" + dependencies: + "@typescript-eslint/utils": "npm:^7.1.1" + peerDependencies: + eslint: ">=8.0.0" + vitest: "*" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + vitest: + optional: true + checksum: 10/9371c088f529f3f91b82162c4be4b080bcbdc088cb1edbaf437d990b218e44b638939f9676430a9f6f88fb0c3ade32918d296cb41c60a9bd5f40a3be40e1eb20 + languageName: node + linkType: hard + +"eslint-plugin-vue@npm:^9.21.1": + version: 9.33.0 + resolution: "eslint-plugin-vue@npm:9.33.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + globals: "npm:^13.24.0" + natural-compare: "npm:^1.4.0" + nth-check: "npm:^2.1.1" + postcss-selector-parser: "npm:^6.0.15" + semver: "npm:^7.6.3" + vue-eslint-parser: "npm:^9.4.3" + xml-name-validator: "npm:^4.0.0" + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 10/c647f1cced248c35f25035b4ec5bb82ef1b5c7dc3778ffb8c95acd44a443bd35de35347f576078c9f588618554e6557cf798f5e560a075a5cfdba47ee81e7fa3 + languageName: node + linkType: hard + +"eslint-plugin-yml@npm:^1.12.2": + version: 1.17.0 + resolution: "eslint-plugin-yml@npm:1.17.0" + dependencies: + debug: "npm:^4.3.2" + escape-string-regexp: "npm:4.0.0" + eslint-compat-utils: "npm:^0.6.0" + natural-compare: "npm:^1.4.0" + yaml-eslint-parser: "npm:^1.2.1" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/e6c1f083b9a1abc24f5a4a5a4c66cbdf56a36fa46adc6ba5667447e5774bc9e153ef894fd07d012107a242bc5266c660e2cdecbdb4bff5f02c66b784d0d28f49 + languageName: node + linkType: hard + +"eslint-processor-vue-blocks@npm:^0.1.1": + version: 0.1.2 + resolution: "eslint-processor-vue-blocks@npm:0.1.2" + peerDependencies: + "@vue/compiler-sfc": ^3.3.0 + eslint: ^8.50.0 || ^9.0.0 + checksum: 10/32e59fa588d425385ac05594d9282c93eb4773fd5f0ebbdcfe7a8a8d5c14230e725efb593165b846e1c49abf0096de4d0ede2e1a4587b0f8e820ecd70bf12a2f + languageName: node + linkType: hard + +"eslint-rule-composer@npm:^0.3.0": + version: 0.3.0 + resolution: "eslint-rule-composer@npm:0.3.0" + checksum: 10/c751e71243c6750de553ca0f586a71c7e9d43864bcbd0536639f287332e3f1ed3337bb0db07020652fa90937ceb63b6cc14c0f71fb227e8fc20ca44ee67e837f + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10/c541ef384c92eb5c999b7d3443d80195fcafb3da335500946f6db76539b87d5826c8f2e1d23bf6afc3154ba8cd7c8e566f8dc00f1eea25fdf3afc8fb9c87b238 + languageName: node + linkType: hard + +"eslint-scope@npm:^7.1.1, eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.0.0, eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 + languageName: node + linkType: hard + +"eslint@npm:^8.0.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c + languageName: node + linkType: hard + +"espree@npm:^10.1.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 + languageName: node + linkType: hard + +"espree@npm:^9.0.0, espree@npm:^9.3.1, espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10/f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb + languageName: node + linkType: hard + +"esquery@npm:^1.4.0, esquery@npm:^1.4.2, esquery@npm:^1.5.0, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10/44ffcd89e714ea6b30143e7f119b104fc4d75e77ee913f34d59076b40ef2d21967f84e019f84e1fd0465b42cdbf725db449f232b5e47f29df29ed76194db8e16 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10/b23acd24791db11d8f65be5ea58fd9a6ce2df5120ae2da65c16cfc5331ff59d5ac4ef50af66cd4bde238881503ec839928a0135b99a036a9cdfa22d17fd56cdb + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10/49ff46c3a7facbad3decb31f597063e761785d7fdb3920d4989d7b08c97a61c2f51183e2f3a03130c9088df88d4b489b1b79ab632219901f184f85158508f4c8 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10/8ada91f2d70f7dff702c861c2c64f21dfdc1525628f3c0454fd6f02fce65f7b958616cbd2b99ca7fa4d474e461a3d363824e91b3eb881705231abbf387470597 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10/387555050c5b3c10e7a9e8df5f43194e95d7737c74532c409910e585d5554eaff34960c166643f5e23d042196529daad059c292dcf1fb61b8ca878d3677f4b87 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10/63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10/ca2f01f1aa4dafd3f3917bd531ab5be08c6f5f4b2389d2e974f903de3cbeb50b9633374353516b6afd70905775e33aba11afab1232d3acf0aa2963b98a611c51 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10/eb7e220ecf2bab5159d157350b81d01f75726a4382f5a9266f42b9150c4523b9795f7f5d9fbbbeaeac09a441b2369f05ee02db48ea938584205530fe5693cfe1 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.19.1 + resolution: "fastq@npm:1.19.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10/75679dc226316341c4f2a6b618571f51eac96779906faecd8921b984e844d6ae42fabb2df69b1071327d398d5716693ea9c9c8941f64ac9e89ec2032ce59d730 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10/4f95d336fb805786759e383fd7fff342ceb7680f53efcc0ef82f502eb479ce35b98e8b207b6dfdfeea0eba845862107dc73813775fc6b56b3098c6e90a2dad77 + languageName: node + linkType: hard + +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/8e6d20f4590dc168de1374a9cadaa37e20ca6e0b822aa247c230e7ea1d9e9674a68cd816146435e4ecc98f9285091462ab7e5e56eebc9510931a1794e4db68b2 + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10/534ce630c8f63c116292145607fc18c0f06bfa2fd74094357bf65daacc5d3f4f2b285bf8eb112c3bbf98c5caa6d386cced797f44b9b1b33da0c0a81020444826 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: "npm:^3.0.4" + checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + languageName: node + linkType: hard + +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10/4b436fa944b1508b95cffdfc8176ae6947b92825483639ef1b9a89b27d82f3f8aa22b21eed471993f92709b431670d4e015b39c087d435a61e1bb04564cf51de + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.1 + resolution: "find-up-simple@npm:1.0.1" + checksum: 10/6e374bffda9f8425314eab47ef79752b6e77dcc95c0ad17d257aef48c32fe07bbc41bcafbd22941c25bb94fffaaaa8e178d928867d844c58100c7fe19ec82f72 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10/4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10/07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 10/02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10/8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10/000198af190ae02f0138ac5fa4310da733224c628e0230c81e3fff7c4e094af7e0e8bb9f4357cabd21db601759d89f3445da744afbae20623cfa41edf3888397 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10/427b33f997a98073c0424e5c07169264a62cda806d8d2ded159b5b903fdfc8f0a1457e06b5fc35506497acb3f1e353f025edee796300209ac6231e80edece835 + languageName: node + linkType: hard + +"fs-extra@npm:^11.0.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/c9fe7b23dded1efe7bbae528d685c3206477e20cc60e9aaceb3f024f9b9ff2ee1f62413c161cb88546cc564009ab516dec99e9781ba782d869bb37e4fe04a97f + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10/e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10/4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10/185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10/25b9e5bea936732a6f0c0c08db58cc0d609ac1ed458c6a07ead46b32e7b9bf3fe5887796c3f83d35994efbc4fdde81c08ac64135b2c399b8f2113968d44082bc + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10/0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10/17d8333460204fbf1f9160d067e1e77f908a5447febb49424b8ab043026049835c9ef3974445c57dbd39161f4d2b04356d7de12b2eecaa27a7a7ea7d871cbedd + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10/b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10/6e9dd920ff054147b6f44cb98104330e87caafae051b6d37b13384a45ba15e71af33c3baeac7cb630a0aaa23142718dcf25b45cfdd86c184c5dcb4e56d953a10 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-pkg-repo@npm:^4.0.0": + version: 4.2.1 + resolution: "get-pkg-repo@npm:4.2.1" + dependencies: + "@hutson/parse-repository-url": "npm:^3.0.0" + hosted-git-info: "npm:^4.0.0" + through2: "npm:^2.0.0" + yargs: "npm:^16.2.0" + bin: + get-pkg-repo: src/cli.js + checksum: 10/033225cf7cdf3f61885f45c492975f412268cf9f3ec68cc42df9af1bec54cf0b0c5ddb7391a6dc973361e7e10df9d432cca0050892ba8856bc50413e0741804f + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10/781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10/a353e3a9595a74720b40fb5bae3ba4a4f826e186e83814d93375182384265676f59e49998b9cdfac4a2225ce95a3d32a68f502a2c5619303987f1c183ab80494 + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.7.0, get-tsconfig@npm:^4.7.2": + version: 4.10.0 + resolution: "get-tsconfig@npm:4.10.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10/5259b5c99a1957114337d9d0603b4a305ec9e29fa6cac7d2fbf634ba6754a0cc88bfd281a02416ce64e604b637d3cb239185381a79a5842b17fb55c097b38c4b + languageName: node + linkType: hard + +"git-raw-commits@npm:^2.0.0": + version: 2.0.11 + resolution: "git-raw-commits@npm:2.0.11" + dependencies: + dargs: "npm:^7.0.0" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" + bin: + git-raw-commits: cli.js + checksum: 10/04e02b3da7c0e13a55f3e6fa8c1c5f06f7d0d641a9f90d896393ef0144bfcf91aa59beede68d14d61ed56aaf09f2c8dba175563c47ec000a8cf70f9df4877577 + languageName: node + linkType: hard + +"git-semver-tags@npm:^4.0.0": + version: 4.1.1 + resolution: "git-semver-tags@npm:4.1.1" + dependencies: + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + bin: + git-semver-tags: cli.js + checksum: 10/ab2ad6c7c81aeb6e703f9c9dd1d590a4c546a86b036540780ca414eb6d327f582a9c2d164899ccf0c20e1e875ec4db13b1e665c12c9d5c802eee79d9c71fdd0f + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10/32cd106ce8c0d83731966d31517adb766d02c3812de49c30cfe0675c7c0ae6630c11214c54a5ae67aca882cf738d27fd7768f21aa19118b9245950554be07247 + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10/c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac + languageName: node + linkType: hard + +"glob@npm:^11.0.0": + version: 11.0.1 + resolution: "glob@npm:11.0.1" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10/57b12a05cc25f1c38f3b24cf6ea7a8bacef11e782c4b9a8c5b0bef3e6c5bcb8c4548cb31eb4115592e0490a024c1bde7359c470565608dd061d3b21179740457 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10/59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 + languageName: node + linkType: hard + +"globals@npm:^13.19.0, globals@npm:^13.24.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: "npm:^0.20.2" + checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10/1f1fd078fb2f7296306ef9dd51019491044ccf17a59ed49d375b576ca108ff37e47f3d29aead7add40763574a992f16a5367dd1e2173b8634ef18556ab719ac4 + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10/288e95e310227bbe037076ea81b7c2598ccbc3122d87abc6dab39e1eec309aa14f0e366a98cdc45237ffcfcbad3db597778c0068217dcb1950fef6249104e1b1 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10/94e296d69f92dc1c0768fcfeecfb3855582ab59a7c75e969d5f96ce50c3d201fd86d5a2857c22565764d5bb8a816c7b1e58f133ec318cd56274da36c5e3fb1a1 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10/6dd60dba97007b21e3a829fab3f771803cc1292977fe610e240ea72afd67e5690ac9eeaafc4a99710e78962e5936ab5a460787c2a1180f1cb0ccfac37d29f897 + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 10/7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10/90fb1b24d40d2472bcd1c8bd9dd479037ec240215869bdbff97b2be83acef57d28f7e96bdd003a21bed218d058b49097f4acc8821c05b1629cc5d48dd7bfcccd + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10/261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10/2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10/7eaed07728eaa28b77fadccabce53f30de467ff186a766872669a833ac2e87d8922b76a22cc58339d7e0277aefe98d6d00762113b27a97cdf65adcf958970935 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10/959385c98696ebbca51e7534e0dc723ada325efa3475350951363cce216d27373e0259b63edb599f72eb94d6cde8577b4b2375f080b303947e560f85692834fa + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10/c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe + languageName: node + linkType: hard + +"hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 10/0c89ee4006606a40f92df5cc3c263342e7fea68110f3e9ef032bd2083650430505db01b6b7926953489517d4027535e4fdc7f970412893d3031c361d3ec8f4b3 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10/96da7d412303704af41c3819207a09ea2cab2de97951db4cf336bb8bce8d8e36b9a6821036ad2e55e67d3be0af8f967a7b57981203fbfb88bc05cd803407b8c3 + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: "npm:^6.0.0" + checksum: 10/4dc67022b7ecb12829966bd731fb9a5f14d351547aafc6520ef3c8e7211f4f0e69452d24e29eae3d9b17df924d660052e53d8ca321cf3008418fb7e6c7c47d6f + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 + languageName: node + linkType: hard + +"htmlparser2@npm:^8.0.0": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + entities: "npm:^4.4.0" + checksum: 10/ea5512956eee06f5835add68b4291d313c745e8407efa63848f4b8a90a2dee45f498a698bca8614e436f1ee0cfdd609938b71d67c693794545982b76e53e6f11 + languageName: node + linkType: hard + +"htmlparser2@npm:^9.0.0": + version: 9.1.0 + resolution: "htmlparser2@npm:9.1.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.1.0" + entities: "npm:^4.5.0" + checksum: 10/6352fa2a5495781fa9a02c9049908334cd068ff36d753870d30cd13b841e99c19646717567a2f9e9c44075bbe43d364e102f9d013a731ce962226d63746b794f + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f + languageName: node + linkType: hard + +"http-link-header@npm:^1.0.2": + version: 1.1.3 + resolution: "http-link-header@npm:1.1.3" + checksum: 10/fae99528f5477eb3cd054b56db5d2d95496bde2d8ce6a85f145f523eb5050051fc9723b293e07135c86fcfaca0a38f7d0c6232bd4191725dc767a30744e0c804 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10/d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10/df59be9e0af479036798a881d1f136c4a29e0b518d4abb863afbd11bf30efa3eeb1d0425fc65942dcc05ab3bf40205ea436b0ff389f2cd20b75b8643d539bf86 + languageName: node + linkType: hard + +"husky@npm:^9.0.0": + version: 9.1.7 + resolution: "husky@npm:9.1.7" + bin: + husky: bin.js + checksum: 10/c2412753f15695db369634ba70f50f5c0b7e5cb13b673d0826c411ec1bd9ddef08c1dad89ea154f57da2521d2605bd64308af748749b27d08c5f563bcd89975f + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10/24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 + languageName: node + linkType: hard + +"ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 + languageName: node + linkType: hard + +"immutable@npm:^4.1.0": + version: 4.3.7 + resolution: "immutable@npm:4.3.7" + checksum: 10/37d963c5050f03ae5f3714ba7a43d469aa482051087f4c65d673d1501c309ea231d87480c792e19fa85e2eaf965f76af5d0aa92726505f3cfe4af91619dfb80b + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10/0b0b0b412b2521739fbb85eeed834a3c34de9bc67e670b3d0b86248fc460d990a7b116ad056c084b87a693ef73d1f17268d6a5be626bb43c998a8b1c8a230004 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10/2d30b157a91fe1c1d7c6f653cbf263f039be6c5bfa959245a16d4ee191fc0f2af86c08545b6e6beeb041c56b574d2d5b9f95343d378ab49c0f37394d541e7fc8 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10/cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10/d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10/1d5219273a3dab61b165eddf358815eefc463207db33c20fcfca54717da02e3f492003757721f972fd0bf21e4b426cab389c5427b99ceea4b8b670dc88ee6d4a + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10/1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c + languageName: node + linkType: hard + +"is-alphabetical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphabetical@npm:1.0.4" + checksum: 10/6508cce44fd348f06705d377b260974f4ce68c74000e7da4045f0d919e568226dc3ce9685c5a2af272195384df6930f748ce9213fc9f399b5d31b362c66312cb + languageName: node + linkType: hard + +"is-alphanumerical@npm:^1.0.0": + version: 1.0.4 + resolution: "is-alphanumerical@npm:1.0.4" + dependencies: + is-alphabetical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + checksum: 10/e2e491acc16fcf5b363f7c726f666a9538dba0a043665740feb45bba1652457a73441e7c5179c6768a638ed396db3437e9905f403644ec7c468fb41f4813d03f + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/ef1095c55b963cd0dcf6f88a113e44a0aeca91e30d767c475e7d746d28d1195b10c5076b94491a7a0cd85020ca6a4923070021d74651d093dc909e9932cf689b + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10/73ced84fa35e59e2c57da2d01e12cd01479f381d7f122ce41dcbb713f09dbfc651315832cd2bf8accba7681a69e4d6f1e03941d94dd10040d415086360e7005e + languageName: node + linkType: hard + +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10/81a78d518ebd8b834523e25d102684ee0f7e98637136d3bdc93fd09636350fa06f1d8ca997ea28143d4d13cb1b69c0824f082db0ac13e1ab3311c10ffea60ade + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/7c2ac7efdf671e03265e74a043bcb1c0a32e226bc2a42dfc5ec8644667df668bbe14b91c08e6c1414f392f8cf86cd1d489b3af97756e2c7a49dd1ba63fd40ca6 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10/10cf327310d712fe227cfaa32d8b11814c214392b6ac18c827f157e1e85363cf9c8e2a22df526689bd5d25e53b58cc110894787afb54e138e7c504174dba15fd + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/051fa95fdb99d7fbf653165a7e6b2cba5d2eb62f7ffa81e793a790f3fb5366c91c1b7b6af6820aa2937dd86c73aa3ca9d9ca98f500988457b1c59692c52ba911 + languageName: node + linkType: hard + +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: "npm:^3.3.0" + checksum: 10/e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + languageName: node + linkType: hard + +"is-bun-module@npm:^1.3.0": + version: 1.3.0 + resolution: "is-bun-module@npm:1.3.0" + dependencies: + semver: "npm:^7.6.3" + checksum: 10/b23d9ec7b4d4bfd89e4e72b5cd52e1bc153facad59fdd7394c656f8859a78740ef35996a2066240a32f39cc9a9da4b4eb69e68df3c71755a61ebbaf56d3daef0 + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 + languageName: node + linkType: hard + +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.12.1, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10/357e9a48fa38f369fd6c4c3b632a3ab2b8adca14997db2e4b3fe94c4cd0a709af48e0fb61b02c64a90c0dd542fd489d49c2d03157b05ae6c07f5e4dec9e730a8 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10/3a811b2c3176fb31abee1d23d3dc78b6c65fd9c07d591fcb67553cab9e7f272728c3dd077d2d738b53f9a2103255b0a6e8dfc9568a7805c56a78b2563e8d1dec + languageName: node + linkType: hard + +"is-decimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-decimal@npm:1.0.4" + checksum: 10/ed483a387517856dc395c68403a10201fddcc1b63dc56513fbe2fe86ab38766120090ecdbfed89223d84ca8b1cd28b0641b93cb6597b6e8f4c097a7c24e3fb96 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10/df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0bfb145e9a1ba852ddde423b0926d2169ae5fe9e37882cde9e8f69031281a986308df4d982283e152396e88b86562ed2256cbaa5e6390fb840a4c25ab54b8a80 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10/44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10/a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10/5906ff51a856a5fbc6b90a90fce32040b0a6870da905f98818f1350f9acadfc9884f7c3dec833fce04b83dd883937b86a190b6593ede82e8b1af8b6c4ecf7cbd + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10/3ed74f2b0cdf4f401f38edb0442ddfde3092d79d7d35c9919c86641efdbcbb32e45aa3c0f70ce5eecc946896cd5a0f26e4188b9f2b881876f7cb6c505b82da11 + languageName: node + linkType: hard + +"is-hexadecimal@npm:^1.0.0": + version: 1.0.4 + resolution: "is-hexadecimal@npm:1.0.4" + checksum: 10/a452e047587b6069332d83130f54d30da4faf2f2ebaa2ce6d073c27b5703d030d58ed9e0b729c8e4e5b52c6f1dab26781bb77b7bc6c7805f14f320e328ff8cd5 + languageName: node + linkType: hard + +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10/8de7b41715b08bcb0e5edb0fb9384b80d2d5bcd10e142188f33247d19ff078abaf8e9b6f858e2302d8d05376a26a55cd23a3c9f8ab93292b02fcd2cc9e4e92bb + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/a5922fb8779ab1ea3b8a9c144522b3d0bea5d9f8f23f7a72470e61e1e4df47714e28e0154ac011998b709cce260c3c9447ad3cd24a96c2f2a0abfdb2cbdc76c8 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10/6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10/0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/c42b7efc5868a5c9a4d8e6d3e9816e8815c611b09535c00fead18a1138455c5cb5e1887f0023a467ad3f9c419d62ba4dc3d9ba8bafe55053914d6d6454a945d2 + languageName: node + linkType: hard + +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10/5685df33f0a4a6098a98c72d94d67cad81b2bc72f1fb2091f3d9283c4a1c582123cd709145b02a9745f0ce6b41e3e43f1c944496d1d74d4ea43358be61308669 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/0380d7c60cc692856871526ffcd38a8133818a2ee42d47bb8008248a0cd2121d8c8b5f66b6da3cac24bc5784553cacb6faaf678f66bc88c6615b42af2825230e + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10/b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10/5277cb9e225a7cc8a368a72623b44a99f2cfa139659c6b203553540681ad4276bfc078420767aad0e73eef5f0bd07d4abf39a35d37ec216917879d11cebc1f8b + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10/db495c0d8cd0a7a66b4f4ef7fccee3ab5bd954cb63396e8ac4d32efe0e9b12fdfceb851d6c501216a71f4f21e5ff20fc2ee845a3d52d455e021c466ac5eb2db2 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10/e8cf60b9ea85667097a6ad68c209c9722cfe8c8edf04d6218366469e51944c5cc25bae45ffb845c23f811d262e4314d3b0168748eb16711aa34d12724cdf0735 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10/a7b7e23206c542dcf2fa0abc483142731788771527e90e7e24f658c0833a0d91948a4f7b30d78f7a65255a48512e41a0288b778ba7fc396137515c12e201fd11 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10/543506fd8259038b371bb083aac25b16cb4fd8b12fc58053aa3d45ac28dfd001cd5c6dffbba7aeea4213c74732d46b6cb2cfb5b412eed11f2db524f3f97d09a0 + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10/1d5e1d0179beeed3661125a6faa2e59bfb48afda06fc70db807f178aa0ebebc3758fb6358d76b3d528090d5ef85148c345dcfbf90839592fe293e3e5e82f2134 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10/1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10/f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10/7c9f715c03aff08f35e98b1fadae1b9267b38f0615d501824f9743f3aab99ef10e303ce7db3f186763a0b70a19de5791ebfc854ff884d5a8c4d92211f642ec92 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10/7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10/bbc4496c2f304d799f8ec22202ab38c010ac265c441947f075c0f7d46bd440b45c00e46017cf9053453d42182d768b1d6ed0e70a142c95ab00df9843aa5ab80e + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10/86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10/5526983462799aced011d776af166e350191b816821ea7bcf71cab3e5272657b062c47dc30697a22a43656e3ced78893a42de677f9ccf276a28c913190953b82 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10/f1faaa4684efaf57d64087776018d7426312a59aa6eeb4e0e3a777347d23cd286ad18f427e98f0e3dee666103d7404c9d7abc5f240406a912fa16bd6695437fa + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10/352bcf333f42189e65cc8cb2dcb94a5c47cf0a9110ce12aba788d405a980b5f5f3a06c79bf915377e1d480647169babd842ded0d898bed181bf6686e8e6823f6 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10/96f8786eaab98e4bf5b2a5d6d9588ea46c4d06bbc4f2eb861fdd7b6b182b16f71d8a70e79820f335d52653b16d4843b29dd9cdcf38ae80406756db9199497cf3 + languageName: node + linkType: hard + +"jackspeak@npm:^4.0.1": + version: 4.1.0 + resolution: "jackspeak@npm:4.1.0" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10/d3ad964e87a3d66ec86b6d466ff150cf3472bbda738a9c4f882ece96c7fb59f0013be1f6cad17cbedd36260741db6cf8912b8e037cd7c7eb72b3532246e54f77 + languageName: node + linkType: hard + +"jake@npm:^10.8.5": + version: 10.9.2 + resolution: "jake@npm:10.9.2" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: 10/3be324708f99f031e0aec49ef8fd872eb4583cbe8a29a0c875f554f6ac638ee4ea5aa759bb63723fd54f77ca6d7db851eaa78353301734ed3700db9cb109a0cd + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10/3d93742e56b1a73a145d55b66e96711fbf87ef89b96c2fab7cfdfba8ec06612591a982111ca2b712bb853dbc16831ec8b43585a2a96b83862d6767de59cbf83d + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10/716a8e3f40572fd0213bcfc1da90274bf30d856e5133af58089a6ce45089b63f4d679bd44e6be9d320e8390483ebc3ae9921981993986d21639d9019b523123d + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10/6cc62b34d002c034203065a31e5e9a19e7c76d9e8ef447a6f70f759c0714cb212c6245f75e270ba458620f9c7b26063cd8cf6cd1f7e3afd659a7cc08add17307 + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10/6bdf570e9592e7d7dd5124fc0e21f5fe92bd15033513632431b211797e3ab57eaa312f83cc6481b3094b72324e369e876f163579d60016677c117ec4853cf02b + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10/6f3a7eb9cd9de5ea9e5aa94aed535631fa6f80221832952839b3cb59dd419b91c20b73887deb0b62230d06d02d6b6cf34ebb810b88d904bb4fe1e2e4f0905c98 + languageName: node + linkType: hard + +"jest-diff@npm:^30.0.0": + version: 30.2.0 + resolution: "jest-diff@npm:30.2.0" + dependencies: + "@jest/diff-sequences": "npm:30.0.1" + "@jest/get-type": "npm:30.1.0" + chalk: "npm:^4.1.2" + pretty-format: "npm:30.2.0" + checksum: 10/1fb9e4fb7dff81814b4f69eaa7db28e184d62306a3a8ea2447d02ca53d2cfa771e83ede513f67ec5239dffacfaac32ff2b49866d211e4c7516f51c1fc06ede42 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10/8d48818055bc96c9e4ec2e217a5a375623c0d0bfae8d22c26e011074940c202aa2534a3362294c81d981046885c05d304376afba9f2874143025981148f3e96d + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10/bd1a077654bdaa013b590deb5f7e7ade68f2e3289180a8c8f53bc8a49f3b40740c0ec2d3a3c1aee906f682775be2bebbac37491d80b634d15276b0aa0f2e3fda + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10/9cf7045adf2307cc93aed2f8488942e39388bff47ec1df149a997c6f714bfc66b2056768973770d3f8b1bf47396c19aa564877eb10ec978b952c6018ed1bd637 + languageName: node + linkType: hard + +"jest-extended@npm:^7.0.0": + version: 7.0.0 + resolution: "jest-extended@npm:7.0.0" + dependencies: + jest-diff: "npm:^30.0.0" + peerDependencies: + jest: ">=27.2.5" + typescript: ">=5.0.0" + peerDependenciesMeta: + jest: + optional: true + typescript: + optional: false + checksum: 10/9f0cfca09f7c25aca82ed060de049105bd11e1a2b969d304223c87ef58fe514ae8ee35d6c4c532fc94ae262ac397913bc9d1c3c484d9c5980a924f0de45559c6 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10/88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/8531b42003581cb18a69a2774e68c456fb5a5c3280b1b9b77475af9e346b6a457250f9d756bfeeae2fe6cbc9ef28434c205edab9390ee970a919baddfa08bb85 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10/e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10/981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10/31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10/ae51d1b4f898724be5e0e52b2268a68fcd876d9b20633c864a6dd6b1994cbc48d62402b0f40f3a1b669b30ebd648821f086c26c08ffde192ced951ff4670d51c + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10/db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10/0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10/1e206f94a660d81e977bcfb1baae6450cb4a81c92e06fad376cc5ea16b8e8c6ea78c383f39e95591a9eb7f925b6a1021086c38941aa7c1b8a6a813c2f6e93675 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10/faa466fd9bc69ea6c37a545a7c6e808e073c66f46ab7d3d8a6ef084f8708f201b85d5fe1799789578b8b47fa1de47b9ee47b414d1863bc117a49e032ba77b7c7 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10/9d8748a494bd90f5c82acea99be9e99f21358263ce6feae44d3f1b0cd90991b5df5d18d607e73c07be95861ee86d1cbab2a3fc6ca4b21805f07ac29d47c1da1e + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10/59eb58eb7e150e0834a2d0c0d94f2a0b963ae7182cfa6c63f2b49b9c6ef794e5193ef1634e01db41420c36a94cefc512cdd67a055cd3e6fa2f41eaf0f82f5a20 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10/cb19a3948256de5f922d52f251821f99657339969bf86843bd26cf3332eae94883e8260e3d2fba46129a27c3971c1aa522490e460e16c7fad516e82d10bbf9f8 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10/30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 + languageName: node + linkType: hard + +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10/8ee1163666d8eaa16d90a989edba2b4a3c8ab0ffaa95ad91b08ca42b015bfb70e164b247a5b17f9de32d096987cada63ed8491ab82761bfb9a28bc34b27ae161 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10/4f616e0345676631a7034b1d94971aaa719f0cd4a6041be2aa299be437ea047afd4fe05c48873b7963f5687a2f6c7cbf51244be8b14e313b97bfe32b1e127e55 + languageName: node + linkType: hard + +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10/364cbaef00d8a2729fc760227ad34b5e60829e0869bd84976bdfbd8c0d0f9c2f22677b3e6dd8afa76ed174765351cd12bae3d4530c62eefb3791055127ca9745 + languageName: node + linkType: hard + +"jest@npm:^29.0.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10/97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 10/1067ff8ce02221faac5a842116ed0ec79a53312a111d0bf8342a80bd02c0a3fdf0b8449694a65947db0a3e8420e8b326dffb489c7dd5866efc380c0d1708a707 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10/af37d0d913fb56aec6dc0074c163cc71cd23c0b8aad5c2350747b6721d37ba118af35abdd8b33c47ec2800de07dedb16a527ca9c530ee004093e04958bd0cbf2 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10/bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef + languageName: node + linkType: hard + +"jsdoc-type-pratt-parser@npm:~4.0.0": + version: 4.0.0 + resolution: "jsdoc-type-pratt-parser@npm:4.0.0" + checksum: 10/a225ab874e56612730dd6c0466ce9f09e8a0e7d85896e9e5f0fa53cfb2e897128a7ec702fd99ed3854b3fbf5a89ad6dce72ca4f4f6149da69f130c2874f06b75 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 + languageName: node + linkType: hard + +"jsesc@npm:~0.5.0": + version: 0.5.0 + resolution: "jsesc@npm:0.5.0" + bin: + jsesc: bin/jsesc + checksum: 10/fab949f585c71e169c5cbe00f049f20de74f067081bbd64a55443bad1c71e1b5a5b448f2359bf2fe06f5ed7c07e2e4a9101843b01c823c30b6afc11f5bfaf724 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10/82876154521b7b68ba71c4f969b91572d1beabadd87bd3a6b236f85fbc7dc4695089191ed60bb59f9340993c51b33d479f45b6ba9f3548beb519705281c32c3c + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10/5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10/7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10/12786c2e2f22c27439e6db0532ba321f1d0617c27ad8cb1c352a0e9249a50182fd1ba8b52a18899291604b0c32eafa8afd09e51203f19109a0537f68db2b652d + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10/a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10/1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da + languageName: node + linkType: hard + +"jsonc-eslint-parser@npm:^2.0.4, jsonc-eslint-parser@npm:^2.4.0": + version: 2.4.0 + resolution: "jsonc-eslint-parser@npm:2.4.0" + dependencies: + acorn: "npm:^8.5.0" + eslint-visitor-keys: "npm:^3.0.0" + espree: "npm:^9.0.0" + semver: "npm:^7.3.5" + checksum: 10/bd1d41c852c3488414605a1754617aa7c240ed6730a25a7fd7fb76473e92efdc5ba1728ad3f08f8069de3a19abf1fd275c2b145eb51e2f7f6ca293c8105e1ffe + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10/03014769e7dc77d4cf05fa0b534907270b60890085dd5e4d60a382ff09328580651da0b8b4cdf44d91e4c8ae64d91791d965f05707beff000ed494a38b6fec85 + languageName: node + linkType: hard + +"jsonld-context-parser@npm:^2.2.2, jsonld-context-parser@npm:^2.4.0": + version: 2.4.0 + resolution: "jsonld-context-parser@npm:2.4.0" + dependencies: + "@types/http-link-header": "npm:^1.0.1" + "@types/node": "npm:^18.0.0" + cross-fetch: "npm:^3.0.6" + http-link-header: "npm:^1.0.2" + relative-to-absolute-iri: "npm:^1.0.5" + bin: + jsonld-context-parse: bin/jsonld-context-parse.js + checksum: 10/878f4356033d9f72490b5b2f645d9945323672928808f379275dc580d4b0070cec629a6194b3b6adb56f251968b6f5f1d4cb00fd370525ae39bcba33c24eb53a + languageName: node + linkType: hard + +"jsonld-context-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "jsonld-context-parser@npm:3.0.0" + dependencies: + "@types/http-link-header": "npm:^1.0.1" + "@types/node": "npm:^18.0.0" + http-link-header: "npm:^1.0.2" + relative-to-absolute-iri: "npm:^1.0.5" + bin: + jsonld-context-parse: bin/jsonld-context-parse.js + checksum: 10/234cbf2d721dca294631095bee91ce681f7dc8f53525a31c178a58d0fb8cbfdf469b06fb7fe473a68fe265be27f0a0649fdd648611261a7330144a1758264618 + languageName: node + linkType: hard + +"jsonld-streaming-parser@npm:^3.0.1": + version: 3.4.0 + resolution: "jsonld-streaming-parser@npm:3.4.0" + dependencies: + "@bergos/jsonparse": "npm:^1.4.0" + "@rdfjs/types": "npm:*" + "@types/http-link-header": "npm:^1.0.1" + "@types/readable-stream": "npm:^2.3.13" + buffer: "npm:^6.0.3" + canonicalize: "npm:^1.0.1" + http-link-header: "npm:^1.0.2" + jsonld-context-parser: "npm:^2.4.0" + rdf-data-factory: "npm:^1.1.0" + readable-stream: "npm:^4.0.0" + checksum: 10/28bed279f7d60aa886e717d2936fc649b4a9c81563a31a68290ce92883e148f07fd280b824cede564b7996cdd6de340da6837075004d8c6903430f8a5ec3a0ee + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10/b61d44613687dfe4cc8ad4b4fbf3711bf26c60b8d5ed1f494d723e0808415c59b24a7c0ed8ab10736a40ff84eef38cbbfb68b395e05d31117b44ffc59d31edfc + languageName: node + linkType: hard + +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10/0c0ecaf00a5c6173d25059c7db2113850b5457016dfa1d0e3ef26da4704fbb186b4938d7611246d86f0ddf1bccf26828daa5877b1f232a65e7373d0122a83e7f + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10/9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10/638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10/2e4720ff79f21ae08d42374b0a5c2f664c5be8b6c8f565bb4e1315c96ed3a8acaa9de788ffed82d7f2378cf36958573de07ef92336cb5255ed74d08b8318c9ee + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10/0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"local-pkg@npm:^0.5.0": + version: 0.5.1 + resolution: "local-pkg@npm:0.5.1" + dependencies: + mlly: "npm:^1.7.3" + pkg-types: "npm:^1.2.1" + checksum: 10/d74aa7226b8cbbf4d7e587332ecb7d7e54e3380b834084eeec3fecfb072a3fc7db27fb0415cb3f4304d4b4055184eb0af43841000b76d33a32f8f3b49108dd20 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10/83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10/72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10/192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10/d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 + languageName: node + linkType: hard + +"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 + languageName: node + linkType: hard + +"logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10/4b861bfd67efe599ab41113ae3ffe92b1873bf86793fb442f58971852430d8f416f9904da69e5043071fb3725690e2499a13acbfe92a57ba7d21690004f9edc0 + languageName: node + linkType: hard + +"loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10/6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0": + version: 11.0.2 + resolution: "lru-cache@npm:11.0.2" + checksum: 10/25fcb66e9d91eaf17227c6abfe526a7bed5903de74f93bfde380eb8a13410c5e8d3f14fe447293f3f322a7493adf6f9f015c6f1df7a235ff24ec30f366e1c058 + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10/951d2673dcc64a7fb888bf3d13bc2fdf923faca97d89cdb405ba3dfff77e2b26e5798d405e78fcd7094c9e7b8b4dab2ddc5a4f8a11928af24a207b7c738ca3f8 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10/fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10/bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10/b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10/fce0385840b6d86b735053dfe941edc2dd6468fda80fe74da1eeff10cbd82a75760f406194f2bc2fa85b99545b2bc1f84c08ddf994b21830775ba2d1a87e8bdf + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10/4c66ddfc654537333da952c084f507fa4c30c707b1635344eb35be894d797ba44c901a9cebe914aa29a7f61357543ba09b09dddbd7f65b4aee756b450f169f40 + languageName: node + linkType: hard + +"manual-git-changelog@npm:^1.0.0": + version: 1.0.2 + resolution: "manual-git-changelog@npm:1.0.2" + dependencies: + arrayify-stream: "npm:^1.0.0" + get-pkg-repo: "npm:^4.0.0" + git-raw-commits: "npm:^2.0.0" + git-semver-tags: "npm:^4.0.0" + minimist: "npm:^1.2.0" + bin: + manual-git-changelog: bin/cli.js + checksum: 10/834b07b16abf1baca070ff3428416685116b18999db37778e9ed2e5d1b2e21318d284f3c5a109cd9f19d1ef697cb2058e385ed6a9484e5dcd6286a531d1e0f71 + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 10/f8e6fc7f6137329c376c4524f6d25b3c243c17019bc8f621d15a2dcb855919e482a9298a78ae58b00dbd0e76b640bf6533aa343a9e993cfc16e0346a2507e7f8 + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: 10/fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10/11df2eda46d092a6035479632e1ec865b8134bdfc4bd9e571a656f4191525404f13a283a515938c3a8de934dbfd9c09674d9da9fa831e6eb7e22b50b197d2edd + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^0.8.5": + version: 0.8.5 + resolution: "mdast-util-from-markdown@npm:0.8.5" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-to-string: "npm:^2.0.0" + micromark: "npm:~2.11.0" + parse-entities: "npm:^2.0.0" + unist-util-stringify-position: "npm:^2.0.0" + checksum: 10/f42166eb7a3c2a8cf17dffd868a6dfdab6a77d4e4c8f35d7c3d63247a16ddfeae45a59d9f5fa5eacc48d76d82d18cb0157961d03d1732bc616f9ddf3bb450984 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^2.0.0": + version: 2.0.0 + resolution: "mdast-util-to-string@npm:2.0.0" + checksum: 10/0b2113ada10e002fbccb014170506dabe2f2ddacaacbe4bc1045c33f986652c5a162732a2c057c5335cdb58419e2ad23e368e5be226855d4d4e280b81c4e9ec2 + languageName: node + linkType: hard + +"meow@npm:^8.0.0": + version: 8.1.2 + resolution: "meow@npm:8.1.2" + dependencies: + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: 10/d4770f90135c0ef4d0f4fa4f4310a18c07bbbe408221fa79a68fda93944134001ffc24ed605e7668f61e920dd8db30936548e927d2331b0e30699d56247f9873 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10/6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10/7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"microdata-rdf-streaming-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "microdata-rdf-streaming-parser@npm:2.0.1" + dependencies: + "@rdfjs/types": "npm:*" + htmlparser2: "npm:^8.0.0" + rdf-data-factory: "npm:^1.1.0" + readable-stream: "npm:^4.1.0" + relative-to-absolute-iri: "npm:^1.0.2" + checksum: 10/c2328ce6307159145808e4e8125d5379900fd07dd6ecaf043cbf87b7b95ed21ed1e9300bd7da7c3812990c867568edb620232f1316cf2fb26c8f5d29860fed13 + languageName: node + linkType: hard + +"micromark@npm:~2.11.0": + version: 2.11.4 + resolution: "micromark@npm:2.11.4" + dependencies: + debug: "npm:^4.0.0" + parse-entities: "npm:^2.0.0" + checksum: 10/cd3bcbc4c113c74d0897e7787103eb9c92c86974b0af1f87d2079b34f1543511a1e72face3f80c1d47c6614c2eaf860d94eee8c06f80dc48bc2441691576364b + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10/d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10/cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + languageName: node + linkType: hard + +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/c81b47d28153e77521877649f4bab48348d10938df9e8147a58111fe00ef89559a2938de9f6632910c4f7bf7bb5cd81191a546167e58d357f0cfb1e18cecc1c5 + languageName: node + linkType: hard + +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/082e7ccbc090d5f8c4e4e029255d5a1d1e3af37bda837da2b8b0085b1503a1210c91ac90d9ebfe741d8a5f286ece820a1abb4f61dc1f82ce602a055d461d93f3 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10/e0b25b04cd4ec6732830344e5739b13f8690f8a012d73445a4a19fbc623f5dd481ef7a5827fde25954cd6026fede7574cc54dc4643c99d6c6b653d6203f94634 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" + checksum: 10/8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10/7ddfebdbb87d9866e7b5f7eead5a9e3d9d507992af932a11d275551f60006cf7d9178e66d586dbb910894f3e3458d27c0ddf93c76e94d49d0a54a541ddc1263d + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10/40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10/a5c6ef069f70d9a524d3428af39f2b117ff8cd84172e19b754e7264a33df460873e6eb3d6e55758531580970de50ae950c496256bb4ad3691a2974cddff189f0 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10/622cb85f51e5c206a080a62d20db0d7b4066f308cb6ce82a9644da112367c3416ae7062017e631eb7ac8588191cfa4a9a279b8651c399265202b298e98c4acef + languageName: node + linkType: hard + +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba + languageName: node + linkType: hard + +"mlly@npm:^1.7.3, mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^2.0.1" + pkg-types: "npm:^1.3.0" + ufo: "npm:^1.5.4" + checksum: 10/1b36163d38c2331f8ae480e6a11da3d15927a2148d729fcd9df6d0059ca74869aa693931bd1f762f82eb534b84c921bdfbc036eb0e4da4faeb55f1349d254f35 + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"n3@npm:^1.16.3, n3@npm:^1.17.0": + version: 1.24.2 + resolution: "n3@npm:1.24.2" + dependencies: + buffer: "npm:^6.0.3" + queue-microtask: "npm:^1.1.2" + readable-stream: "npm:^4.0.0" + checksum: 10/618470455af24120234fb9dcb3ddd7c5d59c08a1f34082ac4d4920dee8c025e002980363494e850e9164a6c814076a2903ee316a7f7ed24cb7ffffab9b7a308c + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 10/5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10/23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10/b5734e87295324fabf868e36fb97c84b7d7f3156ec5f4ee5bf6e488079c11054f818290fc33804cef7b1ee21f55eeb14caea83e7dafae6492a409b3e573153e5 + languageName: node + linkType: hard + +"node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10/b24f8a3dc937f388192e59bcf9d0857d7b6940a2496f328381641cb616efccc9866e89ec43f2ec956bbd6c3d3ee05524ce77fe7b29ccd34692b3a16f237d6676 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10/3314ebfeb99dbcdf9e8c810df1ee52294045399873d4ab1e6740608c4fbe63adaf6580c0610b23c6eda125e298536553f5bb6fb0df714016a5c721ed31095e42 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10/b7afc2b65e56f7035b1a2eec57ae0fbdee7d742b1cdcd0f4387562b6527a011ab1cbe9f64cc8b3cca61e3297c9637c8bf61cec2e6b8d3a711d4b5267dfafbe02 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10/26ab456c51a96f02a9e5aa8d1b80ef3219f2070f3f3528a040e32fb735b1e651e17bdf0f1476988d3a46d498f35c65ed662d122f340d38ce4a7e71dd7b20c4bc + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10/644f830a8bb9b7cc9bf2f6150618727659ee27cdd0840d1c1f97e8e6cab0803a098a2c19f31c6247ad9d3a0792e61521a13a6e8cd87cc6bb676e3150612c03d4 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.0": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10/3cd3b438c9c7b15d72ed2d1bbf0f8cc2d07bfe27702fc9e95d039f0af4e069dc75c0646e75068f9f9255a8aae64b59aa4fe2177e65787145fb996c3d38d48acb + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10/5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"nth-check@npm:^2.1.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10/5afc3dafcd1573b08877ca8e6148c52abd565f1d06b1eb08caf982e3fa289a82f2cae697ffb55b5021e146d60443f1590a5d6b944844e944714a5b549675bcd3 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10/3d81d02674115973df0b7117628ea4110d56042e5326413e4b4313f0bcdf7dd78d4a3acef2c831463fa3796a66762c49daef306f4a0ea1af44877d7086d73bde + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10/3fe28cdd779f2a728a9a66bd688679ba231a2b16646cd1e46b528fe7c947494387dda4bc189eff3417f3717ef4f0a8f2439347cf9a9aa3cef722fbfd9f615587 + languageName: node + linkType: hard + +"object.entries@npm:^1.1.6": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10/24163ab1e1e013796693fc5f5d349e8b3ac0b6a34a7edb6c17d3dd45c6a8854145780c57d302a82512c1582f63720f4b4779d6c1cfba12cbb1420b978802d8a3 + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/5b2e80f7af1778b885e3d06aeb335dcc86965e39464671adb7167ab06ac3b0f5dd2e637a90d8ebd7426d69c6f135a4753ba3dd7d0fe2a7030cf718dcb910fd92 + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.1": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10/44cb86dd2c660434be65f7585c54b62f0425b0c96b5c948d2756be253ef06737da7e68d7106e35506ce4a44d16aa85a413d11c5034eb7ce5579ec28752eb42d0 + languageName: node + linkType: hard + +"object.hasown@npm:^1.1.2": + version: 1.1.4 + resolution: "object.hasown@npm:1.1.4" + dependencies: + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10/797385577b3ef3c0d19333e03ed34bc7987978ae1ee1245069c9922e17d1128265187f729dc610260d03f8d418af26fcd7919b423793bf0af9099d9f08367d69 + languageName: node + linkType: hard + +"object.values@npm:^1.1.6, object.values@npm:^1.1.7": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/f5ec9eccdefeaaa834b089c525663436812a65ff13de7964a1c3a9110f32054f2d58aa476a645bb14f75a79f3fe1154fb3e7bfdae7ac1e80affe171b2ef74bce + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10/cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10/64d0160480eeae4e3b2a6fc0a02f452e05bb0cc8373a4ed56a4fc08c3939dcb91bc20075003ed499655bd16919feb63ca56f86eee7932c5251f7d629b55dfc90 + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10/e9fd0695a01cf226652f0385bf16b7a24153dbbb2039f764c8ba6d2306a8506b0e4ce570de6ad99c7a6eb49520743afdb66edd95ee979c1a342554ed49a9aadd + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10/a8398559c60aef88d7f353a4f98dcdff6090a4e70f874c827302bf1213d9106a1c4d5fcb68dacb1feb3c30a04c4102f41047aa55d4c576b863d6fc876e001af6 + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10/ab4bb3b8636908554fc19bf899e225444195092864cb61503a0d048fdaf662b04be2605b636a4ffeaf6e8811f6fcfa8cbb210ec964c0eb1a41eb853e1d5d2f41 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10/84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10/7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10/513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10/1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10/2ef48ccfc6dd387253d71bf502604f7893ed62090b2c9d73387f10006c342606b05233da0e4f29388227b61eb5aeface6197e166520c465c234552eeab2fe633 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10/f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10/6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-entities@npm:^2.0.0": + version: 2.0.0 + resolution: "parse-entities@npm:2.0.0" + dependencies: + character-entities: "npm:^1.0.0" + character-entities-legacy: "npm:^1.0.0" + character-reference-invalid: "npm:^1.0.0" + is-alphanumerical: "npm:^1.0.0" + is-decimal: "npm:^1.0.0" + is-hexadecimal: "npm:^1.0.0" + checksum: 10/feb46b516722474797d72331421f3e62856750cfb4f70ba098b36447bf0b169e819cc4fdee53e022874d5f0c81b605d86e1912b9842a70e59a54de2fee81589d + languageName: node + linkType: hard + +"parse-gitignore@npm:^2.0.0": + version: 2.0.0 + resolution: "parse-gitignore@npm:2.0.0" + checksum: 10/f9c7d9980aab47de7818ee3a61d64b80241bd99243d1aaf50518665510537da7fbe8998be5f7a6e88b013385f93e686ae262b1f4f73cfb4c16e12d22dc5a2dd2 + languageName: node + linkType: hard + +"parse-imports@npm:^2.1.1": + version: 2.2.1 + resolution: "parse-imports@npm:2.2.1" + dependencies: + es-module-lexer: "npm:^1.5.3" + slashes: "npm:^3.0.12" + checksum: 10/db1d98077587d23bfa1f136abae158ea08e1e588d0260dfc0769092be86b842c798ae47466742b1d9bc106d3430cebbd9730fc34872a2c0e72b9ff720986e82e + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10/62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10/505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10/060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10/55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10/49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/285ae0c2d6c34ae91dc1d5378ede21981c9a2f6de1ea9ca5a88b5a270ce9763b83dbadc7a324d512211d8d36b0c540427d3d0817030849d97a60fa840a2c59ec + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10/5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"pathe@npm:^2.0.1": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc + languageName: node + linkType: hard + +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10/ce617b8da36797d09c0baacb96ca8a44460452c89362d7cb8f70ca46b4158ba8bc3606912de7c818eb4a939f7f9015cef3c766ec8a0c6bfc725fdc078e39c717 + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10/d02dda76f4fec1cbdf395c36c11cf26f76a644f9f9a1bfa84d3167d0d3154d5289aacc72677aa20d599bb4a6937a471de1b65c995e2aea2d8687cbcd7e43ea5f + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10/9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"pkg-types@npm:^1.2.1, pkg-types@npm:^1.3.0": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10/6d491f2244597b24fb59a50e3c258f27da3839555d2a4e112b31bcf536e9359fc4edc98639cd74d2cf16fcd4269e5a09d99fc05d89e2acc896a2f027c2f6ec44 + languageName: node + linkType: hard + +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10/17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10/2f44137b8d3dd35f4a7ba7469eec1cd9cfbb46ec164b93a5bc1f4c3d68599c9910ee3b91da1d28b4560e9cc8414c3cd56fedc07259c67e52cc774476270d3302 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.15": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/190034c94d809c115cd2f32ee6aade84e933450a43ec3899c3e78e7d7b33efd3a2a975bb45d7700b6c5b196c06a7d9acf3f1ba6f1d87032d9675a29d8bca1dd3 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10/0b9d2c76801ca652a7f64892dd37b7e3fab149a37d2424920099bf894acccc62abb4424af2155ab36dea8744843060a2d8ddc983518d0b1e22265a22324b72ed + languageName: node + linkType: hard + +"pretty-format@npm:30.2.0": + version: 30.2.0 + resolution: "pretty-format@npm:30.2.0" + dependencies: + "@jest/schemas": "npm:30.0.5" + ansi-styles: "npm:^5.2.0" + react-is: "npm:^18.3.1" + checksum: 10/725890d648e3400575eebc99a334a4cd1498e0d36746313913706bbeea20ada27e17c184a3cd45c50f705c16111afa829f3450233fc0fda5eed293c69757e926 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10/dea96bc83c83cd91b2bfc55757b6b2747edcaac45b568e46de29deee80742f17bc76fe8898135a70d904f4928eafd8bb693cd1da4896e8bdd3c5e82cadf1d2bb + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10/35610bdb0177d3ab5d35f8827a429fb1dc2518d9e639f2151ac9007f01a061c30e0c635a970c9b00c39102216160f6ec54b62377c92fac3b7bfc2ad4b98d195c + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10/1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10/dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b + languageName: node + linkType: hard + +"promise-polyfill@npm:^1.1.6": + version: 1.1.6 + resolution: "promise-polyfill@npm:1.1.6" + checksum: 10/84a07ab5a34395ca7dbf104f9e4d89b8dc2853e9e441a3c997a246c1af1e634d49cddc8be4d201440911a2a4912f8f60e1d9331da0d64ac16edb8787f15bb62e + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10/96e1a82453c6c96eef53a37a1d6134c9f2482f94068f98a59145d0986ca4e497bf110a410adf73857e588165eab3899f0ebcf7b3890c1b3ce802abc0d65967d4 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1, prompts@npm:^2.4.2": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10/c52536521a4d21eff4f2f2aa4572446cad227464066365a7167e52ccf8d9839c099f9afec1aba0eed3d5a2514b3e79e0b3e7a1dc326b9acde6b75d27ed74b1a9 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10/7d959caec002bc964c86cdc461ec93108b27337dabe6192fb97d69e16a0c799a03462713868b40749bfc1caf5f57ef80ac3e4ffad3effa636ee667582a75e2c0 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10/256aa4bcaf9297256f552914e03cbdb0039c8fe1db11fa1e6d3f80790e16e563eb0a859a1e61082a95e224fc0c608661839439f8ecc6a3db4e48d46d99216ee4 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.1.2, queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10/72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b + languageName: node + linkType: hard + +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: 10/5c7c75f1c696750f619b165cc9957382f919e4207dabf04597a64f0298861391cdc5ee91a1dde1a5d460ecf7ee1af7fc36fef6d155bef2be66f05d43fd63d4f0 + languageName: node + linkType: hard + +"rdf-data-factory@npm:^1.0.1, rdf-data-factory@npm:^1.1.0, rdf-data-factory@npm:^1.1.2": + version: 1.1.3 + resolution: "rdf-data-factory@npm:1.1.3" + dependencies: + "@rdfjs/types": "npm:^1.0.0" + checksum: 10/0ee59ab7cb86632751f2f6460bcf2ad98895402941102a0abe58843bdd8c52ac287525045eef520d9dceed1e3f318539e5eeae57f427f0e4f22af63acd2d6e78 + languageName: node + linkType: hard + +"rdf-isomorphic@npm:^1.3.0": + version: 1.3.1 + resolution: "rdf-isomorphic@npm:1.3.1" + dependencies: + "@rdfjs/types": "npm:*" + hash.js: "npm:^1.1.7" + rdf-string: "npm:^1.6.0" + rdf-terms: "npm:^1.7.0" + checksum: 10/8fa688dce01254afdda90cbb5099b2124d67a66991d8b504d518725f09e517ffaa6b0535374f61aa6bda19788f4f6138a6e340d81145e79b67a008a355f5a4f7 + languageName: node + linkType: hard + +"rdf-literal@npm:^1.2.0": + version: 1.3.2 + resolution: "rdf-literal@npm:1.3.2" + dependencies: + "@rdfjs/types": "npm:*" + rdf-data-factory: "npm:^1.1.0" + checksum: 10/10dc3f91e7bf5b979df4c4b57406e4dff268cce5418533c54bfd52b053e2a37acbd0f30b348eeb05339248592bff46014d59f3cc42b8398ad37d260feeb0f9c6 + languageName: node + linkType: hard + +"rdf-object@npm:^2.0.0": + version: 2.0.0 + resolution: "rdf-object@npm:2.0.0" + dependencies: + "@rdfjs/types": "npm:*" + jsonld-context-parser: "npm:^3.0.0" + rdf-data-factory: "npm:^1.1.0" + rdf-string: "npm:^1.6.0" + streamify-array: "npm:^1.0.1" + checksum: 10/246016461aa3bab62209289fa033d5f9bd9432f8c804f29685a97215718637c272c5b34f09d4487619ed97eb7b5096dead6b39f1303891e1fe916de81c6b1c03 + languageName: node + linkType: hard + +"rdf-parse@npm:^2.0.0": + version: 2.3.3 + resolution: "rdf-parse@npm:2.3.3" + dependencies: + "@comunica/actor-http-fetch": "npm:^2.0.1" + "@comunica/actor-http-proxy": "npm:^2.0.1" + "@comunica/actor-rdf-parse-html": "npm:^2.0.1" + "@comunica/actor-rdf-parse-html-microdata": "npm:^2.0.1" + "@comunica/actor-rdf-parse-html-rdfa": "npm:^2.0.1" + "@comunica/actor-rdf-parse-html-script": "npm:^2.0.1" + "@comunica/actor-rdf-parse-jsonld": "npm:^2.0.1" + "@comunica/actor-rdf-parse-n3": "npm:^2.0.1" + "@comunica/actor-rdf-parse-rdfxml": "npm:^2.0.1" + "@comunica/actor-rdf-parse-shaclc": "npm:^2.6.2" + "@comunica/actor-rdf-parse-xml-rdfa": "npm:^2.0.1" + "@comunica/bus-http": "npm:^2.0.1" + "@comunica/bus-init": "npm:^2.0.1" + "@comunica/bus-rdf-parse": "npm:^2.0.1" + "@comunica/bus-rdf-parse-html": "npm:^2.0.1" + "@comunica/config-query-sparql": "npm:^2.0.1" + "@comunica/core": "npm:^2.0.1" + "@comunica/mediator-combine-pipeline": "npm:^2.0.1" + "@comunica/mediator-combine-union": "npm:^2.0.1" + "@comunica/mediator-number": "npm:^2.0.1" + "@comunica/mediator-race": "npm:^2.0.1" + "@rdfjs/types": "npm:*" + readable-stream: "npm:^4.3.0" + stream-to-string: "npm:^1.2.0" + checksum: 10/d922d8becf579ebcf72841350c8cfd560aa5e3662684671ad1576e9c2467d50361be238ea0f8b449929d0ed8d9dc8ea83ac4105ddfab563497b2727171efc8fc + languageName: node + linkType: hard + +"rdf-quad@npm:^1.5.0": + version: 1.5.0 + resolution: "rdf-quad@npm:1.5.0" + dependencies: + rdf-data-factory: "npm:^1.0.1" + rdf-literal: "npm:^1.2.0" + rdf-string: "npm:^1.5.0" + checksum: 10/3ecaaa0a3139bf0c96767935386b152e65abc2b9e51f30c141072eaa00c6f1748df77fb99ce18a62693fd48c4a6e9dfce1ab4f31935f287a08f8952663beace4 + languageName: node + linkType: hard + +"rdf-string@npm:^1.5.0, rdf-string@npm:^1.6.0": + version: 1.6.3 + resolution: "rdf-string@npm:1.6.3" + dependencies: + "@rdfjs/types": "npm:*" + rdf-data-factory: "npm:^1.1.0" + checksum: 10/bb3b565e50556a77442945c2d0f7a3b1a60fae02d21c7b9d3d682d042c374da09a65cea36f7799f5cc637eccafec98fb559d64c124ca9507cf94841dddf1a109 + languageName: node + linkType: hard + +"rdf-terms@npm:^1.10.0, rdf-terms@npm:^1.7.0": + version: 1.11.0 + resolution: "rdf-terms@npm:1.11.0" + dependencies: + "@rdfjs/types": "npm:*" + rdf-data-factory: "npm:^1.1.0" + rdf-string: "npm:^1.6.0" + checksum: 10/3038f02d6a252408ffbc1486b4e7ccd6331028e00613ee43b69684b01d89debcdcd467749014ee1c057cac441125d3f6f1c99296be19f22d690d8528a3b2f33a + languageName: node + linkType: hard + +"rdfa-streaming-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "rdfa-streaming-parser@npm:2.0.1" + dependencies: + "@rdfjs/types": "npm:*" + htmlparser2: "npm:^8.0.0" + rdf-data-factory: "npm:^1.1.0" + readable-stream: "npm:^4.0.0" + relative-to-absolute-iri: "npm:^1.0.2" + checksum: 10/d85b5cd5b34e3f07c80611da7072d7dc254a82a5ec1211c61a4a766ca9071a2b4429cd060c40aa58a791158d5ae0d019338aafc7f0206eb8ba41d112d9650ed7 + languageName: node + linkType: hard + +"rdfxml-streaming-parser@npm:^2.2.3": + version: 2.4.0 + resolution: "rdfxml-streaming-parser@npm:2.4.0" + dependencies: + "@rdfjs/types": "npm:*" + "@rubensworks/saxes": "npm:^6.0.1" + "@types/readable-stream": "npm:^2.3.13" + buffer: "npm:^6.0.3" + rdf-data-factory: "npm:^1.1.0" + readable-stream: "npm:^4.4.2" + relative-to-absolute-iri: "npm:^1.0.0" + validate-iri: "npm:^1.0.0" + checksum: 10/91ab82a6fa0cc130d75093f9f226e0062bf2a9ffcd933d20980dc065dcd9563a3710a613d930063432b27e91d82ca38a4c32d5339dac00da4980498c683f9a9f + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf + languageName: node + linkType: hard + +"react-is@npm:^18.0.0, react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 + languageName: node + linkType: hard + +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 10/e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: 10/eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 + languageName: node + linkType: hard + +"readable-stream-node-to-web@npm:^1.0.1": + version: 1.0.1 + resolution: "readable-stream-node-to-web@npm:1.0.1" + checksum: 10/36cf32aa844c5de00a4bff22513583472aeeb39390bf9a2ae95ae87649e9fce85f0091a336abc71703290f0ddb7d332e78b8eb423a531a8902a6493954fa715b + languageName: node + linkType: hard + +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10/d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0, readable-stream@npm:^4.1.0, readable-stream@npm:^4.3.0, readable-stream@npm:^4.4.2, readable-stream@npm:^4.5.1": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10/bdf096c8ff59452ce5d08f13da9597f9fcfe400b4facfaa88e74ec057e5ad1fdfa140ffe28e5ed806cf4d2055f0b812806e962bca91dce31bc4cef08e53be3a4 + languageName: node + linkType: hard + +"readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10/8500dd3a90e391d6c5d889256d50ec6026c059fadee98ae9aa9b86757d60ac46fff24fafb7a39fa41d54cb39d8be56cc77be202ebd4cd8ffcf4cb226cbaa40d4 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10/fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10/80a4e2be716f4fe46a89a08ccad0863b47e8ce0f49616cab2d65dab0fbd53c6fdba0f52935fd41d37a2e4e22355c272004f920d63070de849f66eea7aeb4a081 + languageName: node + linkType: hard + +"regexp-tree@npm:^0.1.27": + version: 0.1.27 + resolution: "regexp-tree@npm:0.1.27" + bin: + regexp-tree: bin/regexp-tree + checksum: 10/08c70c8adb5a0d4af1061bf9eb05d3b6e1d948c433d6b7008e4b5eb12a49429c2d6ca8e9106339a432aa0d07bd6e1bccc638d8f4ab0d045f3adad22182b300a2 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10/8ab897ca445968e0b96f6237641510f3243e59c180ee2ee8d83889c52ff735dd1bf3657fcd36db053e35e1d823dd53f2565d0b8021ea282c9fe62401c6c3bd6d + languageName: node + linkType: hard + +"regjsparser@npm:^0.10.0": + version: 0.10.0 + resolution: "regjsparser@npm:0.10.0" + dependencies: + jsesc: "npm:~0.5.0" + bin: + regjsparser: bin/parser + checksum: 10/06f7f0e59598de20769ce5637bbd8879387f67c0eeb8ccc8857331c623332718c25d8d20bd74df210bf636dde061474e8bd365cf73af20470f0b3cb42cd42019 + languageName: node + linkType: hard + +"relative-to-absolute-iri@npm:^1.0.0, relative-to-absolute-iri@npm:^1.0.2, relative-to-absolute-iri@npm:^1.0.5, relative-to-absolute-iri@npm:^1.0.7": + version: 1.0.7 + resolution: "relative-to-absolute-iri@npm:1.0.7" + checksum: 10/47862ead28576fd42f43a801fbca8e1be787436c2d8bc2e86bbee6a1a93aebc4f10a244b19d62cd5cc5a1ce19945fac05f3405ca822d91b1be69c5234bcf3717 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10/a72468e2589270d91f06c7d36ec97a88db53ae5d6fe3787fadc943f0b0276b10347f89b363b2a82285f650bdcc135ad4a257c61bdd4d00d6df1fa24875b0ddaf + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10/546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10/91eb76ce83621eea7bbdd9b55121a5c1c4a39e54a9ce04a9ad4517f102f8b5131c2cf07622c738a6683991bf54f2ce178f5a42803ecbd527ddc5105f362cc9e3 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10/be18a5e4d76dd711778664829841cde690971d02b6cbae277735a09c1c28f407b99ef6ef3cd585a1e6546d4097b28df40ed32c4a287b9699dcf6d7f208495e23 + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10/0763150adf303040c304009231314d1e84c6e5ebfa2d82b7d94e96a6e82bacd1dcc0b58ae257315f3c8adb89a91d8d0f12928241cba2df1680fbe6f60bf99b0e + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: 10/536efee0f30a10fac8604e6cdc7844dbc3f4313568d09f06db4f7ed8a5b8aeb8585966fe975083d1f2dfbc87cf5f8bc7ab65a5c23385c14acbb535ca79f8398a + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.2, resolve@npm:^1.22.4": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/0a398b44da5c05e6e421d70108822c327675febb880eebe905587628de401854c61d5df02866ff34fc4cb1173a51c9f0e84a94702738df3611a62e2acdc68181 + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.4": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/2d6fd28699f901744368e6f2032b4268b4c7b9185fd8beb64f68c93ac6b22e52ae13560ceefc96241a665b985edf9ffd393ae26d2946a7d3a07b7007b7d51e79 + languageName: node + linkType: hard + +"resolve@npm:~1.19.0": + version: 1.19.0 + resolution: "resolve@npm:1.19.0" + dependencies: + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 10/b0f326a85422ebc4db8524957990d49d89e028bd6c10f23f2e89db5ee923678c6c08eae596e594031a5cda20f1e19d4a371e22cd772907b0bcf3c932e2205753 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/d4d878bfe3702d215ea23e75e0e9caf99468e3db76f5ca100d27ebdc527366fee3877e54bce7d47cc72ca8952fc2782a070d238bfa79a550eeb0082384c3b81a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.4#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/05fa778de9d0347c8b889eb7a18f1f06bf0f801b0eb4610b4871a4b2f22e220900cf0ad525e94f990bb8d8921c07754ab2122c0c225ab4cdcea98f36e64fa4c2 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A~1.19.0#optional!builtin": + version: 1.19.0 + resolution: "resolve@patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 10/eb8853b1b7b9ef25f0156304c7c21e2a0d2b2ce247169282542e76565f460986e10adbb770eeb2549c06197fb546b433906cbf3700a3232c567aaaaa53490b88 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10/1f914879f97e7ee931ad05fe3afa629bd55270fc6cf1c1e589b6a99fab96d15daad0fa1a52a00c729ec0078045fe3e399bd4fd0c93bcc906957bdc17f89cb8e6 + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10/af47851b547e8a8dc89af144fceee17b80d5beaf5e6f57ed086432d79943434ff67ca526e92275be6f54b6189f6920a24eace75c2657eed32d02c400312b21ec + languageName: node + linkType: hard + +"rimraf@npm:*, rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: "npm:^11.0.0" + package-json-from-dist: "npm:^1.0.0" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/0eb7edf08aa39017496c99ba675552dda11a20811ba78f8232da2ba945308c91e9cd673f95998b1a8202bc7436d33390831d23ea38ae52751038d56373ad99e2 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10/063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/f3b8ce81eecbde4628b07bdf9e2fa8b684e0caea4999acb1e3b0402c695cd41f28cd075609a808e61ce2672f528ca079f675ab1d8e8d5f86d56643a03e0b8d2e + languageName: node + linkType: hard + +"rspack-resolver@npm:^1.1.0": + version: 1.2.2 + resolution: "rspack-resolver@npm:1.2.2" + dependencies: + "@unrs/rspack-resolver-binding-darwin-arm64": "npm:1.2.2" + "@unrs/rspack-resolver-binding-darwin-x64": "npm:1.2.2" + "@unrs/rspack-resolver-binding-freebsd-x64": "npm:1.2.2" + "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "npm:1.2.2" + "@unrs/rspack-resolver-binding-linux-arm64-gnu": "npm:1.2.2" + "@unrs/rspack-resolver-binding-linux-arm64-musl": "npm:1.2.2" + "@unrs/rspack-resolver-binding-linux-x64-gnu": "npm:1.2.2" + "@unrs/rspack-resolver-binding-linux-x64-musl": "npm:1.2.2" + "@unrs/rspack-resolver-binding-wasm32-wasi": "npm:1.2.2" + "@unrs/rspack-resolver-binding-win32-arm64-msvc": "npm:1.2.2" + "@unrs/rspack-resolver-binding-win32-x64-msvc": "npm:1.2.2" + dependenciesMeta: + "@unrs/rspack-resolver-binding-darwin-arm64": + optional: true + "@unrs/rspack-resolver-binding-darwin-x64": + optional: true + "@unrs/rspack-resolver-binding-freebsd-x64": + optional: true + "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/rspack-resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/rspack-resolver-binding-linux-arm64-musl": + optional: true + "@unrs/rspack-resolver-binding-linux-x64-gnu": + optional: true + "@unrs/rspack-resolver-binding-linux-x64-musl": + optional: true + "@unrs/rspack-resolver-binding-wasm32-wasi": + optional: true + "@unrs/rspack-resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/rspack-resolver-binding-win32-x64-msvc": + optional: true + checksum: 10/c6e3ef9e97d26de98d8a6701c7fb5933b137a7bb1bd2a3ac939f0f44258b0f0a25cd0de86150bd840cb8d7abc8dce9f429a61c8928abad45bad91e4d5a462ee7 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10/cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10/fac4f40f20a3f7da024b54792fcc61059e814566dcbb04586bfefef4d3b942b2408933f25b7b3dd024affd3f2a6bbc916bef04807855e4f192413941369db864 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10/2bd4e53b6694f7134b9cf93631480e7fafc8637165f0ee91d5a4af5e7f33d37de9562d1af5021178dd4217d0230cde8d6530fa28cfa1ebff9a431bf8fff124b4 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10/ebdb61f305bf4756a5b023ad86067df5a11b26898573afe9e52a548a63c3bd594825d9b0e2dde2eb3c94e57e0e04ac9929d4107c394f7b8e56a4613bed46c69a + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10/2697fa186c17c38c3ca5309637b4ac6de2f1c3d282da27cd5e1e3c88eca0fb1f9aea568a6aabdf284111592c8782b94ee07176f17126031be72ab1313ed46c5c + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10/fca14418a174d4b4ef1fecb32c5941e3412d52a4d3d85165924ce3a47fbc7073372c26faf7484ceb4bbc2bde25880c6b97e492473dc7e9708fdfb1c6a02d546e + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10/1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/c7614154a53ebf8c0428a6c40a3b0b47dac30587c1a19703d1b75f003803f73cdfa6a93474a9ba678fa565ef5fbddc2fae79bca03b7d22ab5fd5163dbe571a74 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10/b87f8187bca595ddc3c0721ece4635015fd9d7cb294e6dd2e394ce5186a71bbfa4dc8a35010958c65e43ad83cde09642660e61a952883c24fd6b45ead15f045c + languageName: node + linkType: hard + +"shaclc-parse@npm:^1.4.0": + version: 1.4.0 + resolution: "shaclc-parse@npm:1.4.0" + dependencies: + "@rdfjs/types": "npm:^1.1.0" + n3: "npm:^1.16.3" + checksum: 10/d1c1e3bffb4b58e0a21cc9cae6fd8ab5d13541b17fba8270212600a6e672c2c511b1b2840c0a9384d04f3d994a81b3b9eef61a26b0925ad192bf9bb18a156189 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10/6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10/1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10/603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10/5771861f77feefe44f6195ed077a9e4f389acc188f895f570d56445e251b861754b547ea9ef73ecee4e01fdada6568bfe9020d2ec2dfc5571e9fa1bbc4a10615 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10/a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10/7d53b9db292c6262f326b6ff3bc1611db84ece36c2c7dc0e937954c13c73185b0406c56589e2bb8d071d6fee468e14c39fb5d203ee39be66b7b8174f179afaba + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10/c6dffff17aaa383dae7e5c056fbf10cf9855a9f79949f20ee225c04f06ddde56323600e0f3d6797e82d08d006e93761122527438ee9531620031c08c9e0d73cc + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10/aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10/94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slashes@npm:^3.0.12": + version: 3.0.12 + resolution: "slashes@npm:3.0.12" + checksum: 10/c221d73765013db64f3eaf49dacc6b99a5d5477e63720c1bb71d1af647965dda23ab100ca1eb622e080f11ffe68e1e0a233b7b908073260bed4ec819ff1d3e42 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10/927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10/ee99e1dacab0985b52cbe5a75640be6e604135e9489ebdc3048635d186012fbaecc20fbbe04b177dee434c319ba20f09b3e7dfefb7d932466c0d707744eac05c + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10/ab3af97aeb162f32c80e176c717ccf16a11a6ebb4656a62b94c0f96495ea2a1f4a8206c04b54438558485d83d0c5f61920c07a1a5d3963892a589b40cc6107dd + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10/d1514a922ac9c7e4786037eeff6c3322f461cd25da34bb9fefb15387b3490531774e6e31d95ab6d5b84a3e139af9c3a570ccaee6b47bd7ea262691ed3a8bc34e + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff + languageName: node + linkType: hard + +"sparqlalgebrajs@npm:^4.2.0": + version: 4.3.8 + resolution: "sparqlalgebrajs@npm:4.3.8" + dependencies: + "@rdfjs/types": "npm:*" + "@types/sparqljs": "npm:^3.1.3" + fast-deep-equal: "npm:^3.1.3" + minimist: "npm:^1.2.6" + rdf-data-factory: "npm:^1.1.0" + rdf-isomorphic: "npm:^1.3.0" + rdf-string: "npm:^1.6.0" + rdf-terms: "npm:^1.10.0" + sparqljs: "npm:^3.7.1" + bin: + sparqlalgebrajs: bin/sparqlalgebrajs.js + checksum: 10/c1c7cd256f12eb9f0d5db3470d59a67118b20dd01b86bb7d052112cdd598093299cc27417a4e179392ab02e4fb29100c3f4af2a7c1f4ebe4d59b0d6996860474 + languageName: node + linkType: hard + +"sparqljs@npm:^3.7.1": + version: 3.7.3 + resolution: "sparqljs@npm:3.7.3" + dependencies: + rdf-data-factory: "npm:^1.1.2" + bin: + sparqljs: bin/sparql-to-json + checksum: 10/4c84b3ecaa76e84785252fbb55f8d0f0a20bfd8748a443f6d34defe3d313598b6e48d9118f0978c2991bb614c4c49a3ca584aa2dc033a3bd7d05d7aea331fd7b + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10/cc2e4dbef822f6d12142116557d63f5facf3300e92a6bd24e907e4865e17b7e1abd0ee6b67f305cae6790fc2194175a24dc394bfcc01eea84e2bdad728e9ae9a + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10/bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10/a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "spdx-expression-parse@npm:4.0.0" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10/936be681fbf5edeec3a79c023136479f70d6edb3fd3875089ac86cd324c6c8c81add47399edead296d1d0af17ae5ce88c7f88885eb150b62c2ff6e535841ca6a + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10/17a033b4c3485f081fc9faa1729dde8782a85d9131b156f2397c71256c2e1663132857d3cba1457c4965f179a4dcf1b69458a31e9d3d0c766d057ef0e3a0b4f2 + languageName: node + linkType: hard + +"split2@npm:^3.0.0": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: "npm:^3.0.0" + checksum: 10/a426e1e6718e2f7e50f102d5ec3525063d885e3d9cec021a81175fd3497fdb8b867a89c99e70bef4daeef4f2f5e544f7b92df8c1a30b4254e10a9cfdcc3dae87 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10/e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10/c34828732ab8509c2741e5fd1af6b767c3daf2c642f267788f933a65b1614943c282e74c4284f4fa749c264b18ee016a0d37a3e5b73aee446da46277d3a85daa + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/7024c1a6e39b3f18aa8f1c8290e884fe91b0f9ca5a6c6d410544daad54de0ba664db879afe16412e187c6c292fd60b937f047ee44292e5c2af2dcc6d8e1a9b48 + languageName: node + linkType: hard + +"stable-hash@npm:^0.0.5": + version: 0.0.5 + resolution: "stable-hash@npm:0.0.5" + checksum: 10/9222ea2c558e37c4a576cb4e406966b9e6aa05b93f5c4f09ef4aaabe3577439b9b8fbff407b16840b63e2ae83de74290c7b1c2da7360d571e480e46a4aec0a56 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10/7bd633f0e9ac46e81a0b0fe6538482c1d77031959cf94478228731709db4672fbbed59176f5b9a9fd89fec656b5dae03d084ef2d1b0c4c2f5683e05f2dbb1405 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10/cdc988acbc99075b4b036ac6014e5f1e9afa7e564482b687da6384eee6a1909d7eaffde85b0a17ffbe186c5247faf6c2b7544e802109f63b72c7be69b13151bb + languageName: node + linkType: hard + +"stream-to-string@npm:^1.2.0": + version: 1.2.1 + resolution: "stream-to-string@npm:1.2.1" + dependencies: + promise-polyfill: "npm:^1.1.6" + checksum: 10/1b1e201be89f21c0202c4d59177bfbaa6071b6ac7094e7af09767c464a1c861aea343bc35911df6417e1b1f581c026db655c3602442b9f031bcc172c5b0ed912 + languageName: node + linkType: hard + +"streamify-array@npm:^1.0.1": + version: 1.0.1 + resolution: "streamify-array@npm:1.0.1" + checksum: 10/2af68af440ba6f38decb318f95072224c97b766576e8642758a60884878c8e3f2ff323668e215b6bebb5ebe124250fecd915b9c0f29ab8e9e332894cb79b0ffa + languageName: node + linkType: hard + +"string-argv@npm:^0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10/f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10/ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10/e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10/7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.8": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.3" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10/e4ab34b9e7639211e6c5e9759adb063028c5c5c4fc32ad967838b2bd1e5ce83a66ae8ec755d24a79302849f090b59194571b2c33471e86e7821b21c0f56df316 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/47bb63cd2470a64bc5e2da1e570d369c016ccaa85c918c3a8bb4ab5965120f35e66d1f85ea544496fac84b9207a6b722adf007e6c548acd0813e5f8a82f9712a + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/140c73899b6747de9e499c7c2e7a83d549c47a26fa06045b69492be9cfb9e2a95187499a373983a08a115ecff8bc3bd7b0fb09b8ff72fb2172abe766849272ef + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/160167dfbd68e6f7cb9f51a16074eebfce1571656fc31d40c3738ca9e30e35496f2c046fe57b6ad49f65f238a152be8c86fd9a2dd58682b5eba39dad995b3674 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10/54d23f4a6acae0e93f999a585e673be9e561b65cd4cca37714af1e893ab8cd8dfa52a9e4f58f48f87b4a44918d3a9254326cb80ed194bf2e4c226e2b21767e56 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10/7c41c17ed4dea105231f6df208002ebddd732e8e9e2d619d133cecd8e0087ddfd9587d2feb3c8caf3213cbd841ada6d057f5142cae68a4e62d3540778d9819b4 + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10/ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10/475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10/8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10/9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10/69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 10/18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10/c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10/157b534df88e39c5518c5e78c35580c1eca848d7dbaf31bbe06cdfc048e22c7ff1a9d046ae17b25691128f631a51d9ec373c1b740c12ae4f0de6e292037e4282 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10/a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e + languageName: node + linkType: hard + +"synckit@npm:^0.6.0": + version: 0.6.2 + resolution: "synckit@npm:0.6.2" + dependencies: + tslib: "npm:^2.3.1" + checksum: 10/9641f4a4f113b7d6a810c34870947c1f19b7a736b510211c0ea69b05aed530d9aa52cb4942f0988a72514ce9fda61011e913c52fa86c58ebf56901d54c2fe241 + languageName: node + linkType: hard + +"synckit@npm:^0.9.1": + version: 0.9.2 + resolution: "synckit@npm:0.9.2" + dependencies: + "@pkgr/core": "npm:^0.1.0" + tslib: "npm:^2.6.2" + checksum: 10/d45c4288be9c0232343650643892a7edafb79152c0c08d7ae5d33ca2c296b67a0e15f8cb5c9153969612c4ea5cd5686297542384aab977db23cfa6653fe02027 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10/12a2a4fc6dee23e07cc47f1aeb3a14a1afd3f16397e1350036a8f4cdfee8dcac7ef5978337a4e7b2ac2c27a9a6d46388fc2088ea7c80cb6878c814b1425f8ecf + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10/8fccb2cb6c8fcb6bb4115394feb833f8b6cf4b9503ec2485c2c90febf435cac62abe882a0c5c51a37b9bbe70640cdd05acf5f45e486ac4583389f4b0855f69e5 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10/1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 + languageName: node + linkType: hard + +"through2@npm:^2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10/cd71f7dcdc7a8204fea003a14a433ef99384b7d4e31f5497e1f9f622b3cf3be3691f908455f98723bdc80922a53af7fa10c3b7abbe51c6fd3d536dbc7850e2c4 + languageName: node + linkType: hard + +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: "npm:3" + checksum: 10/72c246233d9a989bbebeb6b698ef0b7b9064cb1c47930f79b25d87b6c867e075432811f69b7b2ac8da00ca308191c507bdab913944be8019ac43b036ce88f6ba + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10/4ad28701fa9118b32ef0e27f409e0a6c5741e8b02286d50425c1f6f71e6d6c6ded9dd5bbbbb714784b08623c4ec4d150151f1d3d996cfabe0495f908ab4f7002 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10/cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10/10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a + languageName: node + linkType: hard + +"toml-eslint-parser@npm:^0.9.0, toml-eslint-parser@npm:^0.9.3": + version: 0.9.3 + resolution: "toml-eslint-parser@npm:0.9.3" + dependencies: + eslint-visitor-keys: "npm:^3.0.0" + checksum: 10/ec9eb81c51966e7fdea32e5772d9f8e9f07f224843e1c8a4b223cd35d73fcd4e0f493a1153cfff4f9d8be77dc8be9122570a909df27f7ab72fc785734cc97ef8 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10/8f1f5aa6cb232f9e1bdc86f485f916b7aa38caee8a778b378ffec0b70d9307873f253f5cbadbe2955ece2ac5c83d0dc14a77513166ccd0a0c7fe197e21396695 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: 10/b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10/2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 10/713c51e7392323305bd4867422ba130fbf70873ef6edbf80ea6d7e9c8f41eeeb13e40e8e7fe7cd321d74e4864777329797077268c9f570464303a1723f1eed39 + languageName: node + linkType: hard + +"ts-jest@npm:^29.0.0": + version: 29.2.6 + resolution: "ts-jest@npm:29.2.6" + dependencies: + bs-logger: "npm:^0.2.6" + ejs: "npm:^3.1.10" + fast-json-stable-stringify: "npm:^2.1.0" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.7.1" + yargs-parser: "npm:^21.1.1" + 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 + bin: + ts-jest: cli.js + checksum: 10/9cb6804266be7c9384cecace346f65d2ab5a685d252c5275b53b5958f6545951328a5c4d48c49c5f92d1e04187ca31e348e5a3540d20cb365c33d1eb89371e22 + languageName: node + linkType: hard + +"ts-node@npm:^10.0.0": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + 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 + 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 + checksum: 10/a91a15b3c9f76ac462f006fa88b6bfa528130dcfb849dd7ef7f9d640832ab681e235b8a2bc58ecde42f72851cc1d5d4e22c901b0c11aa51001ea1d395074b794 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10/2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 + languageName: node + linkType: hard + +"tslib@npm:2.3.1": + version: 2.3.1 + resolution: "tslib@npm:2.3.1" + checksum: 10/5e7de59ed9f2b705b399bda28326b7c3e7526deb48bbe1716e2e17fbd4cecbb610253d09c7b8fd0a6e76cfed9304e2e608cdb81bb1ee812d69e5089d1a94c71a + languageName: node + linkType: hard + +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb + languageName: node + linkType: hard + +"tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: "npm:^1.8.1" + 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" + checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10/14687776479d048e3c1dbfe58a2409e00367810d6960c0f619b33793271ff2a27f81b52461f14a162f1f89a9b1d8da1b237fc7c99b0e1fdcec28ec63a86b1fec + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10/5179e3b8ebc51fce1b13efb75fdea4595484433f9683bbc2dca6d99789dba4e602ab7922d2656f2ce8383987467f7770131d4a7f06a26287db0615d2f4c4ce7d + languageName: node + linkType: hard + +"type-detect@npm:^4.0.8": + version: 4.1.0 + resolution: "type-detect@npm:4.1.0" + checksum: 10/e363bf0352427a79301f26a7795a27718624c49c576965076624eb5495d87515030b207217845f7018093adcbe169b2d119bb9b7f1a31a92bfbb1ab9639ca8dd + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: 10/08844377058435c2b0e633ba01bab6102dba0ed63d85417d8e18feff265eed6f5c9f8f9a25d405ea9db88a41a569be73a3c4c0d4e29150bf89fb145bb23114a2 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10/f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 10/9ecbf4ba279402b14c1a0614b6761bbe95626fab11377291fecd7e32b196109551e0350dcec6af74d97ced1b000ba8060a23eca33157091e642b409c2054ba82 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: 10/fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10/269dad101dda73e3110117a9b84db86f0b5c07dad3a9418116fd38d580cab7fc628a4fc167e29b6d7c39da2f53374b78e7cb578b3c5ec7a556689d985d193519 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10/c2869aa584cdae24ecfd282f20a0f556b13a49a9d5bca1713370bb3c89dff0ccbc5ceb45cb5b784c98f4579e5e3e2a07e438c3a5b8294583e2bd4abbd5104fb5 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10/d6b2f0e81161682d2726eb92b1dc2b0890890f9930f33f9bcf6fc7272895ce66bc368066d273e6677776de167608adc53fcf81f1be39a146d64b630edbf2081c + languageName: node + linkType: hard + +"typescript@npm:^5.0.0": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/dbc2168a55d56771f4d581997be52bab5cbc09734fec976cfbaabd787e61fb4c6cf9125fd48c6f98054ce549c77ecedefc7f64252a830dd8e9c3381f61fbeb78 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.0.0#optional!builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/97920a082ffc57583b1cb6bc4faa502acc156358e03f54c7fc7fdf0b61c439a717f4c9070c449ee9ee683d4cfc3bb203127c2b9794b2950f66d9d307a4ff262c + languageName: node + linkType: hard + +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: 10/a885ed421e656aea6ca64e9727b8118a9488715460b6f1a0f0427118adfe2f2830fe7c1d5bd9c5c754a332e6807516551cd663ea67ce9ed6a4e3edc739916335 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10/fadb347020f66b2c8aeacf8b9a79826fa34cc5e5457af4eb0bbc4e79bd87fed0fa795949825df534320f7c13f199259516ad30abc55a6e7b91d8d996ca069e50 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10/0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd + languageName: node + linkType: hard + +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10/583ac7bbf4ff69931d3985f4762cde2690bb607844c16a5e2fbb92ed312fe4fa1b365e953032d469fa28ba8b224e88a595f0b10a449332f83fa77c695e567dbe + languageName: node + linkType: hard + +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10/db43439f69c2d94cc29f75cbfe9de86df87061d6b0c577ebe9bb3255f49b22c50162a7d7eb413b0458b6510b8ca299ac7cff38c3a29fbd31af9f504bcf7fbc0d + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10/6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10/beafdf3d6f44990e0a5ce560f8f881b4ee811be70b6ba0db25298c31c8cf525ed963572b48cd03be1c1349084f9e339be4241666d7cf1ebdad20598d3c652b27 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^2.0.0": + version: 2.0.3 + resolution: "unist-util-stringify-position@npm:2.0.3" + dependencies: + "@types/unist": "npm:^2.0.2" + checksum: 10/affbfd151f0df055ce0dddf443fc41353ab3870cdba6b3805865bd6a41ce22d9d8e65be0ed8839a8731d05b61421d2df9fd8c35b67adf86040bf4b1f8a04a42c + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10/ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/87af2776054ffb9194cf95e0201547d041f72ee44ce54b144da110e65ea7ca01379367407ba21de5c9edd52c74d95395366790de67f3eb4cc4afa0fe4424e76f + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10/b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10/474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10/88d3423a52b6aaf1836be779cab12f7016d47ad8430dffba6edf766695e6d90ad4adaa3d8eeb512cc05924f3e246c4a4ca51e089dccf4402caa536b5e5be8961 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10/fb1d70f1176cb9dc46cabbb3fd5c52c8f3e8738b61877b6e7266029aed0870b04140e3f9f4550ac32aebcfe1d0f38b0bac57e1e8fb97d68fec82f2b416148166 + languageName: node + linkType: hard + +"validate-iri@npm:^1.0.0": + version: 1.0.1 + resolution: "validate-iri@npm:1.0.1" + checksum: 10/a7b449bc9a7b5156208f001019391c9a5b267488bf7664d51f3a38db25db463ee51a3971c1d21e8dccade28957b7d94ad3b5241d1033cc51037cd117ce11d3fe + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10/86242519b2538bb8aeb12330edebb61b4eb37fd35ef65220ab0b03a26c0592c1c8a7300d32da3cde5abd08d18d95e8dabfad684b5116336f6de9e6f207eec224 + languageName: node + linkType: hard + +"varname@npm:2.0.2": + version: 2.0.2 + resolution: "varname@npm:2.0.2" + checksum: 10/ec6f12f8b0f47ac45de3db76df6185afac57ded8435809e948b36e9bce9f5c5f25ae277e47a9dfc26f95a56ac44e7d29be6f1e67556ef052d8fc83cd3fd4faa3 + languageName: node + linkType: hard + +"vue-eslint-parser@npm:^9.4.2, vue-eslint-parser@npm:^9.4.3": + version: 9.4.3 + resolution: "vue-eslint-parser@npm:9.4.3" + dependencies: + debug: "npm:^4.3.4" + eslint-scope: "npm:^7.1.1" + eslint-visitor-keys: "npm:^3.3.0" + espree: "npm:^9.3.1" + esquery: "npm:^1.4.0" + lodash: "npm:^4.17.21" + semver: "npm:^7.3.6" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10/228e43f0067e5f1fa87a4192f355ebbb4a224f0c7e170b1fbd4205fdf42fe7b3c6820a7e467496a8174e51ba351bc9caed00389d05519206cfa1615cac44516c + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: 10/ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"web-streams-ponyfill@npm:^1.4.2": + version: 1.4.2 + resolution: "web-streams-ponyfill@npm:1.4.2" + checksum: 10/a99359dea544873c2982bac4bb2b6ddb75c57d1a6dcca752fe25492b5d72c4527d284882f126214a5b793df813aa7a9eb377583b7b4b9ee827ddf3a8c8882b75 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10/b65b9f8d6854572a84a5c69615152b63371395f0c5dcd6729c45789052296df54314db2bc3e977df41705eacb8bc79c247cee139a63fa695192f95816ed528ad + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10/f95adbc1e80820828b45cc671d97da7cd5e4ef9deb426c31bcd5ab00dc7103042291613b3ef3caec0a2335ed09e0d5ed026c940755dbb6d404e2b27f940fdf07 + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10/a877c0667bc089518c83ad4d845cf8296b03efe3565c1de1940c646e00a2a1ae9ed8a185bcfa27cbf352de7906f0616d83b9d2f19ca500ee02a551fb5cf40740 + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10/22c81c5cb7a896c5171742cd30c90d992ff13fb1ea7693e6cf80af077791613fb3f89aa9b4b7f890bd47b6ce09c6322c409932359580a2a2a54057f7b52d1cbe + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10/674bf659b9bcfe4055f08634b48a8588e879161b9fefed57e9ec4ff5601e4d50a05ccd76cf10f698ef5873784e5df3223336d56c7ce88e13bcf52ebe582fc8d7 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10/12be30fb88567f9863186bee1777f11bea09dd59ed8b3ce4afa7dd5cade75e2f4cc56191a2da165113cc7cf79987ba021dac1e22b5b62aa7e5c56949f2469a68 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10/4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10/6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + languageName: node + linkType: hard + +"winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10/5946918720baadd7447823929e94cf0935f92c4cff6d9451c6fcb009bd9d20a3b3df9ad606109e79d1e9f4d2ff678477bf09f81cfefce2025baaf27a617129bb + languageName: node + linkType: hard + +"winston@npm:^3.3.3": + version: 3.17.0 + resolution: "winston@npm:3.17.0" + dependencies: + "@colors/colors": "npm:^1.6.0" + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.7.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.9.0" + checksum: 10/220309a0ead36c1171158ab28cb9133f8597fba19c8c1c190df9329555530565b58f3af0037c1b80e0c49f7f9b6b3b01791d0c56536eb0be38678d36e316c2a3 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10/1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10/cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10/7b1e4b35e9bb2312d2ee9ee7dc95b8cb5f8b4b5a89f7dde5543fe66c1e3715663094defa50d75454ac900bd210f702d575f15f3f17fa9ec0291806d2578d1ddf + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10/159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10/3be1f5508a46c190619d5386b1ac8f3af3dbe951ed0f7b0b4a0961eed6fc626bd84b50cf4be768dabc0a05b672f5d0c5ee7f42daa557b14415d18c3a13c7d246 + languageName: node + linkType: hard + +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: 10/f9582a3f281f790344a471c207516e29e293c6041b2c20d84dd6e58832cd7c19796c47e108fd4fd4b164a5e72ad94f2268f8ace8231cde4a2c6428d6aa220f92 + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10/4ad5924974efd004a47cce6acf5c0269aee0e62f9a805a426db3337af7bcbd331099df174b024ace4fb18971b8a56de386d2e73a1c4b020e3abd63a4a9b917f1 + languageName: node + linkType: hard + +"xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10/ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10/5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10/9af0a4329c3c6b779ac4736c69fae4190ac03029fa27c1aef4e6bcc92119b73dea6fe5db5fe881fb0ce2a0e9539a42cdf60c7c21eda04d1a0b8c082e38509efb + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10/4cb02b42b8a93b5cf50caf5d8e9beb409400a8a4d85e83bb0685c1457e9ac0b7a00819e9f5991ac25ffabb56a78e2f017c1acc010b3a1babfe6de690ba531abd + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10/1884d272d485845ad04759a255c71775db0fac56308764b4c77ea56a20d56679fad340213054c8c9c9c26fcfd4c4b2a90df993b7e0aaf3cdb73c618d1d1a802a + languageName: node + linkType: hard + +"yaml-eslint-parser@npm:^1.2.1, yaml-eslint-parser@npm:^1.2.2": + version: 1.3.0 + resolution: "yaml-eslint-parser@npm:1.3.0" + dependencies: + eslint-visitor-keys: "npm:^3.0.0" + yaml: "npm:^2.0.0" + checksum: 10/ef2cecd5b97e14e8022fccddbd56f624033e1a101723f0acf2bfd78be7bc6f68b654be2acbed803b13692ec8ab650261c067051a7411978778f8af1d44cd8b4f + languageName: node + linkType: hard + +"yaml@npm:^2.0.0": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" + bin: + yaml: bin.mjs + checksum: 10/c8c314c62fbd49244a6a51b06482f6d495b37ab10fa685fcafa1bbaae7841b7233ee7d12cab087bcca5a0b28adc92868b6e437322276430c28d00f1c1732eeec + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e + languageName: node + linkType: hard + +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 10/807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e + languageName: node + linkType: hard + +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10/abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10/2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard