├── index.js ├── tslint.json ├── .prettierrc ├── .gitignore ├── .travis.yml ├── typedoc.json ├── jestconfig.json ├── tsconfig.json ├── .changeset ├── config.json └── README.md ├── src ├── operators.ts ├── __tests__ │ ├── Qs.test.ts │ ├── OverloadedInitializer.test.ts │ ├── Filter.test.ts │ ├── CustomParam.test.ts │ ├── PackUnpackString.test.ts │ ├── PackUnpackObject.test.ts │ ├── Shortner.test.ts │ └── DefaultValues.test.ts └── index.ts ├── .github └── workflows │ ├── codecov.yml │ ├── typedoc.yml │ └── codeql-analysis.yml ├── SECURITY.md ├── LICENSE ├── package.json ├── CHANGELOG.md ├── README.md └── pnpm-lock.yaml /index.js: -------------------------------------------------------------------------------- 1 | import "lib/"; -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:recommended", "tslint-config-prettier"] 3 | } -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "trailingComma": "all", 4 | "singleQuote": true 5 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /lib 3 | /coverage 4 | /api 5 | *.gcno 6 | *.gcda 7 | *.gcov 8 | .DS_Store 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "13.8" 4 | scripts: 5 | - npm install codecov -g 6 | after_success: 7 | - codecov 8 | -------------------------------------------------------------------------------- /typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://typedoc.org/schema.json", 3 | "entryPoints": ["./src/index.ts"], 4 | "sort": ["source-order"] 5 | } 6 | -------------------------------------------------------------------------------- /jestconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "transform": { 3 | "^.+\\.(t|j)sx?$": "ts-jest" 4 | }, 5 | "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", 6 | "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"], 7 | "collectCoverage": true 8 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "commonjs", 5 | "declaration": true, 6 | "outDir": "./lib", 7 | "strict": true 8 | }, 9 | "include": ["src"], 10 | "exclude": ["node_modules", "**/__tests__/*"] 11 | } -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "restricted", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /src/operators.ts: -------------------------------------------------------------------------------- 1 | const Operators = { 2 | equal: '=', 3 | notEqual: '<>', 4 | greaterThan: '>', 5 | greaterThanOrEqual: '>=', 6 | lessThan: '<', 7 | lessThanOrEqual: '<=', 8 | startsWith: 'STARTS_WITH', 9 | contains: 'CONTAINS', 10 | endsWith: 'ENDS_WITH', 11 | in: 'IN', 12 | notIn: 'NOT IN', 13 | between: 'BETWEEN', 14 | notBetween: 'NOT BETWEEN', 15 | isNull: 'IS NULL', 16 | isNotNull: 'IS NOT NULL', 17 | }; 18 | 19 | export default Operators; 20 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.github/workflows/codecov.yml: -------------------------------------------------------------------------------- 1 | name: Codecov 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | name: Test drupal-jsonapi-params 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Setup pnpm 14 | uses: pnpm/action-setup@v3 15 | with: 16 | version: 8 17 | - name: Install requirements 18 | run: pnpm install 19 | - name: Run tests and collect coverage 20 | run: pnpm run test 21 | - name: Upload coverage reports to Codecov with GitHub Action 22 | uses: codecov/codecov-action@v2 23 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ------- | ------------------ | 7 | | 2.0.0 | :white_check_mark: | 8 | | < 1.x | :x: | 9 | 10 | ## Reporting a Vulnerability 11 | 12 | For reporting a bug in drupal-jsonapi-params please send an email to shibinkidd@gmail.com with subject title "SECURITY ISSUE IN DRUPAL-JSONAPI-PARAMS". 13 | I would try to respond to the issue within a week's time. 14 | 15 | ## Comments on this policy 16 | 17 | If you have suggestions on how this process could be improved please submit a pull request or file an issue to discuss. 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2024 Shibin Das 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 14 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /.github/workflows/typedoc.yml: -------------------------------------------------------------------------------- 1 | name: GitHub pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - 'src/**' 9 | - '.github/**' 10 | - 'README.md' 11 | 12 | jobs: 13 | publish: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | - name: Setup pnpm 18 | uses: pnpm/action-setup@v3 19 | with: 20 | version: 8 21 | 22 | - name: Install dependencies 23 | run: pnpm install 24 | 25 | - name: Build 26 | run: pnpm run build 27 | 28 | - name: Generate typedoc 29 | run: pnpm run docs 30 | 31 | - name: Publish to GitHub Pages 32 | uses: peaceiris/actions-gh-pages@v3 33 | with: 34 | deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} 35 | github_token: ${{ secrets.GITHUB_TOKEN }} 36 | publish_dir: ./api -------------------------------------------------------------------------------- /src/__tests__/Qs.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | 3 | test('Test getter and setter for `qs` options', () => { 4 | let api = new DrupalJsonApiParams(); 5 | api.setQsOption({ a: 'b' }); 6 | expect(api.getQsOption()).toStrictEqual({ a: 'b' }); 7 | }); 8 | 9 | test('Test qs.tringify options', () => { 10 | let api = new DrupalJsonApiParams(); 11 | api.addFilter('status', '1'); 12 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 13 | api.setQsOption({ addQueryPrefix: true, encode: false }); 14 | expect(api.getQueryString()).toBe('?filter[status]=1'); 15 | expect(api.getQueryString({})).toBe('filter%5Bstatus%5D=1'); 16 | expect(api.getQueryString()).toBe('?filter[status]=1'); 17 | }); 18 | 19 | test('Test qs.parse options', () => { 20 | let api = new DrupalJsonApiParams(); 21 | api.setQsOption({ encode: false, ignoreQueryPrefix: true }); 22 | api.initializeWithQueryString('?a=b&c=d'); 23 | expect(api.getQueryString()).toBe('a=b&c=d'); 24 | 25 | let api2 = new DrupalJsonApiParams(); 26 | api.setQsOption({ encode: false }); 27 | api.initializeWithQueryString('?a=b&c=d'); 28 | expect(api.getQueryString()).toBe('?a=b&c=d'); 29 | }); 30 | 31 | test('Test initializeWithQueryString with options', () => { 32 | let api = new DrupalJsonApiParams(); 33 | api.initializeWithQueryString('?a=b&c=d', { ignoreQueryPrefix: true }); 34 | expect(api.getQueryString({ encode: false })).toBe('a=b&c=d'); 35 | }); 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drupal-jsonapi-params", 3 | "version": "3.0.0", 4 | "description": "Drupal JSON-API params", 5 | "main": "lib/index.js", 6 | "types": "lib/index.d.ts", 7 | "files": [ 8 | "lib/**/*" 9 | ], 10 | "scripts": { 11 | "test": "jest --config jestconfig.json", 12 | "build": "tsc", 13 | "format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"", 14 | "lint": "tslint -p tsconfig.json", 15 | "prepare": "pnpm run build", 16 | "prepublishOnly": "pnpm test && pnpm run lint", 17 | "preversion": "pnpm run lint", 18 | "version": "pnpm run format && git add -A src", 19 | "postversion": "git push && git push --tags", 20 | "docs": "typedoc --options typedoc.json --out api" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/d34dman/drupal-jsonapi-params.git" 25 | }, 26 | "keywords": [ 27 | "Drupal", 28 | "JSON-API", 29 | "javascript" 30 | ], 31 | "author": "D34dMan", 32 | "license": "ISC", 33 | "bugs": { 34 | "url": "https://github.com/d34dman/drupal-jsonapi-params/issues" 35 | }, 36 | "homepage": "https://github.com/d34dman/drupal-jsonapi-params#readme", 37 | "devDependencies": { 38 | "@changesets/cli": "^2.29.5", 39 | "@types/jest": "^27.5.2", 40 | "@types/qs": "^6.14.0", 41 | "jest": "^27.5.1", 42 | "prettier": "^1.19.1", 43 | "ts-jest": "^27.1.5", 44 | "tslint": "^6.1.3", 45 | "tslint-config-prettier": "^1.18.0", 46 | "typedoc": "^0.22.18", 47 | "typescript": "^4.9.5" 48 | }, 49 | "dependencies": { 50 | "qs": "^6.14.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/__tests__/OverloadedInitializer.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | 3 | describe('Overload initializer', () => { 4 | test('function signature', () => { 5 | let api = new DrupalJsonApiParams(); 6 | expect(api.initialize('').getQueryString()).toBe(''); 7 | expect(api.initialize({}).getQueryString()).toBe(''); 8 | expect(api.initialize(api).getQueryString()).toBe(''); 9 | }); 10 | 11 | test('Filter for `status = 1`', () => { 12 | const api = new DrupalJsonApiParams(); 13 | api.addFilter('status', '1'); 14 | expect(api.getQueryString()).toBe('filter%5Bstatus%5D=1'); 15 | const newApi = new DrupalJsonApiParams(); 16 | expect(newApi.initialize('').getQueryString()).toBe(''); 17 | expect(newApi.initialize('filter%5Bstatus%5D=1').getQueryString()).toBe('filter%5Bstatus%5D=1'); 18 | expect(newApi.initialize({}).getQueryString()).toBe(''); 19 | expect(newApi.initialize(api.getQueryObject()).getQueryString()).toBe('filter%5Bstatus%5D=1'); 20 | expect(newApi.initialize(api).getQueryString()).toBe('filter%5Bstatus%5D=1'); 21 | }); 22 | 23 | test('should not corrupt parent instance', () => { 24 | const api = new DrupalJsonApiParams(); 25 | api.addFilter('status', '1'); 26 | expect(api.getQueryString()).toBe('filter%5Bstatus%5D=1'); 27 | const newApi = new DrupalJsonApiParams().initialize(api.getQueryString()); 28 | api.addFilter('id', ['1', '2', '3'], 'IN'); 29 | expect(newApi.getQueryString()).toBe('filter%5Bstatus%5D=1'); 30 | expect(api.getQueryString()).toBe( 31 | 'filter%5Bstatus%5D=1&filter%5Bid%5D%5Bcondition%5D%5Bpath%5D=id&filter%5Bid%5D%5Bcondition%5D%5Bvalue%5D%5B0%5D=1&filter%5Bid%5D%5Bcondition%5D%5Bvalue%5D%5B1%5D=2&filter%5Bid%5D%5Bcondition%5D%5Bvalue%5D%5B2%5D=3&filter%5Bid%5D%5Bcondition%5D%5Boperator%5D=IN', 32 | ); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 3.0.0 4 | 5 | ### Major Changes 6 | 7 | - - **BREAKING CHANGE**: Changed internal properties and methods from `private` to `protected` to enable inheritance scenarios 8 | - `data` property is now accessible to subclasses for query state management 9 | - `qsOptions` property is now accessible to subclasses for query string options 10 | - `config` property is now accessible to subclasses for configuration settings 11 | - `generateKeyName` method is now accessible to subclasses 12 | - `getIndexId` method is now accessible to subclasses 13 | - This change affects consumers who subclass `DrupalJsonApiParams` 14 | 15 | ## 2.3.2 16 | 17 | ### Patch Changes 18 | 19 | - Fixed return for custom params method [#44](https://github.com/d34dman/drupal-jsonapi-params/pull/44). 20 | 21 | ## 2.3.1 22 | 23 | ### Patch Changes 24 | 25 | - Dev dependency update. 26 | 27 | ## 2.3.0 28 | 29 | ### Minor Changes 30 | 31 | - Introduce configurations to control query generation behaviour. 32 | - `addFilter` now supports an optional parameter to use a specific key 33 | 34 | ### Patch Changes 35 | 36 | - Use TypeScript `this` return type for fluent setters 37 | 38 | ## 2.2.0 39 | 40 | ### Minor Changes 41 | 42 | - Introduced `setQsOption` and `getQsOption` to set and get default options passed to `qs` library. 43 | 44 | ### Patch Changes 45 | 46 | - Switched primary development branch to use `main` instead of `master` 47 | - Fixed a bug when non null values were supplied to `IS NULL` and `IS NOT NULL` operator, which used to generate buggy query. 48 | 49 | ## [2.1.0] 50 | 51 | - `addPageOffset` method added. 52 | 53 | ## [2.0.0] 54 | 55 | ## Changed 56 | 57 | - BREAKING CHANGE! FilterItem interface has been replaced by FilterItemType 58 | 59 | ## Fixed 60 | 61 | - Fixed short query generation for cases where operator is other than "=" 62 | 63 | ## [1.2.3] 64 | 65 | ### Changed 66 | 67 | - Switched to version 2 for package-lock.json 68 | - Updated testing tools (jest) from 25._ to 27._ 69 | 70 | ## [1.2.2] - 2021-06-14 71 | 72 | ### Added 73 | 74 | - Added CHANGELOG.md 75 | 76 | ### Changed 77 | 78 | - `constructor` for `DrupalJsonApiParams` accepts same parameter as `initialize` method, and also calls it. 79 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '45 20 * * 0' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v2 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v2 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v2 71 | -------------------------------------------------------------------------------- /src/__tests__/Filter.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | 3 | test('Filter for `status = 1` with custom key', () => { 4 | let api = new DrupalJsonApiParams(); 5 | api.addFilter('status', '1', '=', '', 'foo'); 6 | expect(api.getQueryString({ encode: false })).toBe( 7 | 'filter[foo][condition][path]=status&filter[foo][condition][value]=1&filter[foo][condition][memberOf]=', 8 | ); 9 | }); 10 | 11 | test('Filter for `status = 1` with custom key used twice', () => { 12 | let api = new DrupalJsonApiParams(); 13 | api.addFilter('status', '1', '=', '', 'foo'); 14 | api.addFilter('status', '1', '=', '', 'foo'); 15 | expect(api.getQueryString({ encode: false })).toBe( 16 | 'filter[foo][condition][path]=status&filter[foo][condition][value]=1&filter[foo][condition][memberOf]=&filter[foo--1][condition][path]=status&filter[foo--1][condition][value]=1&filter[foo--1][condition][memberOf]=', 17 | ); 18 | }); 19 | 20 | test('Implement placeholder using FilterFunc in qs', () => { 21 | let api = new DrupalJsonApiParams( 22 | {}, 23 | { 24 | useShortCutForQueryGeneration: false, 25 | }, 26 | ); 27 | api.setQsOption({ encode: false }); 28 | api.addFilter('changed', ['0', '@current_date'], 'BETWEEN'); 29 | { 30 | let qsParam = api.getQsOption(); 31 | const now = (Date.now() / 1000).toFixed(); 32 | qsParam = { 33 | ...qsParam, 34 | filter: (prefix: string, value: any) => { 35 | switch (prefix) { 36 | case 'filter[changed][condition][value][1]': 37 | return now; 38 | default: 39 | return value; 40 | } 41 | }, 42 | }; 43 | expect(api.getQueryString(qsParam)).toBe( 44 | `filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=${now}&filter[changed][condition][operator]=BETWEEN`, 45 | ); 46 | } 47 | { 48 | let qsParam = api.getQsOption(); 49 | qsParam = { 50 | ...qsParam, 51 | filter: (prefix: string, value: any) => { 52 | switch (prefix) { 53 | case 'filter[changed][condition][value][1]': 54 | return 'baz'; 55 | default: 56 | return value; 57 | } 58 | }, 59 | }; 60 | expect(api.getQueryString(qsParam)).toBe( 61 | 'filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=baz&filter[changed][condition][operator]=BETWEEN', 62 | ); 63 | } 64 | { 65 | let qsParam = api.getQsOption(); 66 | const now = (Date.now() / 1000).toFixed(); 67 | qsParam = { 68 | ...qsParam, 69 | filter: (prefix: string, value: any) => { 70 | switch (value) { 71 | case '@current_date': 72 | return now; 73 | default: 74 | return value; 75 | } 76 | }, 77 | }; 78 | expect(api.getQueryString(qsParam)).toBe( 79 | `filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=${now}&filter[changed][condition][operator]=BETWEEN`, 80 | ); 81 | } 82 | }); 83 | -------------------------------------------------------------------------------- /src/__tests__/CustomParam.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | test('Custom parameters', () => { 3 | let api = new DrupalJsonApiParams(); 4 | api.clear(); 5 | api.addCustomParam({ foo: 'bar' }); 6 | expect(api.getQueryString({ encode: false })).toBe('foo=bar'); 7 | api.addCustomParam({ foo: { bar: 'baz' } }); 8 | api.addCustomParam({ bar: ['a', 'b', 'c'] }); 9 | expect(api.getQueryString({ encode: false })).toBe('foo[bar]=baz&bar[0]=a&bar[1]=b&bar[2]=c'); 10 | api.clear(); 11 | expect(api.getQueryString()).toBe(''); 12 | expect(api.addCustomParam({ foo: 'bar' })).toBeInstanceOf(DrupalJsonApiParams); 13 | }); 14 | 15 | test("Nova's Ark with custom params", () => { 16 | let api = new DrupalJsonApiParams(); 17 | api 18 | // Add Group within Groups. 19 | .addGroup('publish_status', 'OR', 'parent_group') 20 | .addGroup('child_group_B', 'AND', 'parent_group') 21 | .addGroup('parent_group', 'AND') 22 | // Add Filters. 23 | .addFilter('status', '1') 24 | // Add Filter to Group. 25 | .addFilter('status', '2', '!=', 'publish_status') 26 | // Add Page Limit. 27 | .addPageLimit(5) 28 | // Add Fields. 29 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 30 | // Add Includes. 31 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 32 | // Add multiple sort criterion. 33 | .addSort('id', 'DESC') 34 | .addSort('uid') 35 | .addSort('status'); 36 | api.clear(); 37 | expect(api.getQueryString()).toBe(''); 38 | api 39 | // Add Group within Groups. 40 | .addGroup('publish_status', 'OR', 'parent_group') 41 | .addGroup('child_group_B', 'AND', 'parent_group') 42 | .addGroup('parent_group', 'AND') 43 | // Add Filters. 44 | .addFilter('status', '1') 45 | // Add Filter to Group. 46 | .addFilter('status', '2', '!=', 'publish_status') 47 | // Add Page Limit. 48 | .addPageLimit(5) 49 | // Add Fields. 50 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 51 | // Add Includes. 52 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 53 | // Add multiple sort criterion. 54 | .addSort('id', 'DESC') 55 | .addSort('uid') 56 | .addSort('status') 57 | .addCustomParam({ foo: 'bar' }); 58 | let queryString = api.getQueryString(); 59 | expect(api.getQueryString({ encode: false })).toBe( 60 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid&foo=bar', 61 | ); 62 | api.clear(); 63 | expect(api.getQueryString()).toBe(''); 64 | api.initializeWithQueryString(queryString); 65 | expect(api.getQueryString({ encode: false })).toBe( 66 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid&foo=bar', 67 | ); 68 | }); 69 | -------------------------------------------------------------------------------- /src/__tests__/PackUnpackString.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | test('Empty Default Values', () => { 3 | let api = new DrupalJsonApiParams(); 4 | let queryString = api.getQueryString(); 5 | expect(api.getQueryString()).toBe(''); 6 | api.clear(); 7 | expect(api.getQueryString()).toBe(''); 8 | api.initializeWithQueryString(queryString); 9 | expect(api.getQueryString()).toBe(''); 10 | api.initializeWithQueryString(''); 11 | expect(api.getQueryString()).toBe(''); 12 | }); 13 | 14 | test('Filter for `status = 1`', () => { 15 | let api = new DrupalJsonApiParams(); 16 | api.addFilter('status', '1'); 17 | let queryString = api.getQueryString(); 18 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 19 | api.clear(); 20 | expect(api.getQueryString()).toBe(''); 21 | api.initializeWithQueryString(queryString); 22 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 23 | }); 24 | 25 | test('Filter for `text = "\\/ []&?"` URI encoded', () => { 26 | let api = new DrupalJsonApiParams(); 27 | api.addFilter('text', `\/ []&?`); 28 | let queryString = api.getQueryString(); 29 | expect(api.getQueryString()).toBe(`filter%5Btext%5D=%2F%20%5B%5D%26%3F`); 30 | }); 31 | 32 | test("Nova's Ark", () => { 33 | let api = new DrupalJsonApiParams(); 34 | api 35 | // Add Group within Groups. 36 | .addGroup('publish_status', 'OR', 'parent_group') 37 | .addGroup('child_group_B', 'AND', 'parent_group') 38 | .addGroup('parent_group', 'AND') 39 | // Add Filters. 40 | .addFilter('status', '1') 41 | // Add Filter to Group. 42 | .addFilter('status', '2', '!=', 'publish_status') 43 | // Add Page Limit. 44 | .addPageLimit(5) 45 | // Add Fields. 46 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 47 | // Add Includes. 48 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 49 | // Add multiple sort criterion. 50 | .addSort('id', 'DESC') 51 | .addSort('uid') 52 | .addSort('status'); 53 | api.clear(); 54 | expect(api.getQueryString()).toBe(''); 55 | api 56 | // Add Group within Groups. 57 | .addGroup('publish_status', 'OR', 'parent_group') 58 | .addGroup('child_group_B', 'AND', 'parent_group') 59 | .addGroup('parent_group', 'AND') 60 | // Add Filters. 61 | .addFilter('status', '1') 62 | // Add Filter to Group. 63 | .addFilter('status', '2', '!=', 'publish_status') 64 | // Add Page Limit. 65 | .addPageLimit(5) 66 | // Add Fields. 67 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 68 | // Add Includes. 69 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 70 | // Add multiple sort criterion. 71 | .addSort('id', 'DESC') 72 | .addSort('uid') 73 | .addSort('status'); 74 | let queryString = api.getQueryString(); 75 | expect(api.getQueryString({ encode: false })).toBe( 76 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid', 77 | ); 78 | api.clear(); 79 | expect(api.getQueryString()).toBe(''); 80 | api.initializeWithQueryString(queryString); 81 | expect(api.getQueryString({ encode: false })).toBe( 82 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid', 83 | ); 84 | }); 85 | -------------------------------------------------------------------------------- /src/__tests__/PackUnpackObject.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | test('Empty Default Values', () => { 3 | let api = new DrupalJsonApiParams(); 4 | let obj = api.getQueryObject(); 5 | expect(api.getQueryString()).toBe(''); 6 | api.clear(); 7 | expect(api.getQueryString()).toBe(''); 8 | api.initializeWithQueryObject(obj); 9 | expect(api.getQueryString()).toBe(''); 10 | api.initializeWithQueryObject({}); 11 | expect(api.getQueryString()).toBe(''); 12 | }); 13 | 14 | test('getDrupalJsonApiParams', () => { 15 | const getDrupalJsonApiParams = function(input: any = undefined) { 16 | return new DrupalJsonApiParams().initialize(input); 17 | }; 18 | // Defaults. 19 | expect(getDrupalJsonApiParams()).toStrictEqual(expect.any(DrupalJsonApiParams)); 20 | expect(getDrupalJsonApiParams('')).toStrictEqual(expect.any(DrupalJsonApiParams)); 21 | expect(getDrupalJsonApiParams({})).toStrictEqual(expect.any(DrupalJsonApiParams)); 22 | expect(getDrupalJsonApiParams(new DrupalJsonApiParams().getQueryString())).toStrictEqual( 23 | expect.any(DrupalJsonApiParams), 24 | ); 25 | expect(getDrupalJsonApiParams(new DrupalJsonApiParams().getQueryObject())).toStrictEqual( 26 | expect.any(DrupalJsonApiParams), 27 | ); 28 | // Incorrectly normalized query object. 29 | const badObject = { include: [], sort: [] }; 30 | expect(getDrupalJsonApiParams(badObject)).toStrictEqual(expect.any(DrupalJsonApiParams)); 31 | }); 32 | 33 | test('Filter for `status = 1`', () => { 34 | let api = new DrupalJsonApiParams(); 35 | api.addFilter('status', '1'); 36 | let obj = api.getQueryObject(); 37 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 38 | api.clear(); 39 | expect(api.getQueryString()).toBe(''); 40 | api.initializeWithQueryObject(obj); 41 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 42 | }); 43 | 44 | test("Nova's Ark", () => { 45 | let api = new DrupalJsonApiParams(); 46 | api 47 | // Add Group within Groups. 48 | .addGroup('publish_status', 'OR', 'parent_group') 49 | .addGroup('child_group_B', 'AND', 'parent_group') 50 | .addGroup('parent_group', 'AND') 51 | // Add Filters. 52 | .addFilter('status', '1') 53 | // Add Filter to Group. 54 | .addFilter('status', '2', '!=', 'publish_status') 55 | // Add Page Limit. 56 | .addPageLimit(5) 57 | // Add Fields. 58 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 59 | // Add Includes. 60 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 61 | // Add multiple sort criterion. 62 | .addSort('id', 'DESC') 63 | .addSort('uid') 64 | .addSort('status'); 65 | api.clear(); 66 | expect(api.getQueryString()).toBe(''); 67 | api 68 | // Add Group within Groups. 69 | .addGroup('publish_status', 'OR', 'parent_group') 70 | .addGroup('child_group_B', 'AND', 'parent_group') 71 | .addGroup('parent_group', 'AND') 72 | // Add Filters. 73 | .addFilter('status', '1') 74 | // Add Filter to Group. 75 | .addFilter('status', '2', '!=', 'publish_status') 76 | // Add Page Limit. 77 | .addPageLimit(5) 78 | // Add Fields. 79 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 80 | // Add Includes. 81 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 82 | // Add multiple sort criterion. 83 | .addSort('id', 'DESC') 84 | .addSort('uid') 85 | .addSort('status'); 86 | let obj = api.getQueryObject(); 87 | expect(api.getQueryString({ encode: false })).toBe( 88 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid', 89 | ); 90 | api.clear(); 91 | expect(api.getQueryString()).toBe(''); 92 | api.initializeWithQueryObject(obj); 93 | expect(api.getQueryString({ encode: false })).toBe( 94 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid', 95 | ); 96 | }); 97 | -------------------------------------------------------------------------------- /src/__tests__/Shortner.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '..'; 2 | test(' 1. Only get published nodes', () => { 3 | let api = new DrupalJsonApiParams(); 4 | api.addFilter('status', '1'); 5 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 6 | }); 7 | 8 | test(' 2. Get nodes by a value of a entity reference', () => { 9 | let api = new DrupalJsonApiParams(); 10 | api.addFilter('uid.id', 'BB09E2CD-9487-44BC-B219-3DC03D6820CD'); 11 | expect(api.getQueryString({ encode: false })).toBe('filter[uid.id]=BB09E2CD-9487-44BC-B219-3DC03D6820CD'); 12 | api.clear(); 13 | api.addFilter('field_tags.meta.drupal_internal__target_id', '1'); 14 | expect(api.getQueryString({ encode: false })).toBe('filter[field_tags.meta.drupal_internal__target_id]=1'); 15 | }); 16 | 17 | test(' 3. Nested Filters: Get nodes created by user admin', () => { 18 | let api = new DrupalJsonApiParams(); 19 | api.addFilter('uid.name', 'admin'); 20 | expect(api.getQueryString({ encode: false })).toBe('filter[uid.name]=admin'); 21 | }); 22 | 23 | test(' 4. Filtering with arrays: Get nodes created by users [admin, john]', () => { 24 | let api = new DrupalJsonApiParams(); 25 | api.addFilter('uid.name', ['admin', 'john'], 'IN'); 26 | expect(api.getQueryString({ encode: false })).toBe( 27 | 'filter[uid.name][condition][path]=uid.name&filter[uid.name][condition][value][0]=admin&filter[uid.name][condition][value][1]=john&filter[uid.name][condition][operator]=IN', 28 | ); 29 | }); 30 | 31 | test(' 5. Grouping filters: Get nodes that are published and create by admin', () => { 32 | let api = new DrupalJsonApiParams(); 33 | // WHERE user.name = admin AND node.status = 1; 34 | api 35 | .addGroup('and-group', 'AND') 36 | .addFilter('uid.name', 'admin', '=', 'and-group') 37 | .addFilter('status', '1', '=', 'and-group'); 38 | expect(api.getQueryString({ encode: false })).toBe( 39 | 'filter[and-group][group][conjunction]=AND&filter[uid.name][condition][path]=uid.name&filter[uid.name][condition][value]=admin&filter[uid.name][condition][memberOf]=and-group&filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][memberOf]=and-group', 40 | ); 41 | }); 42 | test(' 6. Grouping grouped filters: Get nodes that are promoted or sticky and created by admin', () => { 43 | let api = new DrupalJsonApiParams(); 44 | // WHERE (user.name = admin) AND (node.sticky = 1 OR node.promoted = 1) 45 | api 46 | // Create an AND GROUP 47 | .addGroup('and-group', 'AND') 48 | // Put the OR group into the AND GROUP 49 | .addGroup('or-group', 'OR', 'and-group') 50 | // Create the admin filter and put it in the AND GROUP 51 | .addFilter('uid.name', 'admin', '=', 'and-group') 52 | // Create the sticky filter and put it in the OR GROUP 53 | .addFilter('sticky', '1', '=', 'or-group') 54 | // Create the promoted filter and put it in the OR GROUP 55 | .addFilter('promote', '1', '=', 'or-group'); 56 | expect(api.getQueryString({ encode: false })).toBe( 57 | 'filter[and-group][group][conjunction]=AND&filter[or-group][group][conjunction]=OR&filter[or-group][group][memberOf]=and-group&filter[uid.name][condition][path]=uid.name&filter[uid.name][condition][value]=admin&filter[uid.name][condition][memberOf]=and-group&filter[sticky][condition][path]=sticky&filter[sticky][condition][value]=1&filter[sticky][condition][memberOf]=or-group&filter[promote][condition][path]=promote&filter[promote][condition][value]=1&filter[promote][condition][memberOf]=or-group', 58 | ); 59 | }); 60 | 61 | test(' 7. Filter for nodes where "title" CONTAINS "Foo"', () => { 62 | let api = new DrupalJsonApiParams(); 63 | api.addFilter('title', 'Foo', 'CONTAINS'); 64 | expect(api.getQueryString({ encode: false })).toBe('filter[title][value]=Foo&filter[title][operator]=CONTAINS'); 65 | }); 66 | 67 | test(' 8. Filter by non-standard complex fields (e.g. addressfield)', () => { 68 | let api = new DrupalJsonApiParams(); 69 | // FILTER BY LOCALITY 70 | api.addFilter('field_address.locality', 'Mordor'); 71 | expect(api.getQueryString({ encode: false })).toBe('filter[field_address.locality]=Mordor'); 72 | api.clear(); 73 | // FILTER BY ADDRESS LINE 74 | api.addFilter('field_address.address_line1', 'Rings Street'); 75 | expect(api.getQueryString({ encode: false })).toBe('filter[field_address.address_line1]=Rings Street'); 76 | }); 77 | 78 | test(' 9. Filtering on Taxonomy term values (e.g. tags)', () => { 79 | let api = new DrupalJsonApiParams(); 80 | api.addFilter('field_tags.name', 'tagname', 'IN'); 81 | expect(api.getQueryString({ encode: false })).toBe( 82 | 'filter[field_tags.name][value]=tagname&filter[field_tags.name][operator]=IN', 83 | ); 84 | }); 85 | 86 | test('10. Filtering on Date (Date only, no time)', () => { 87 | let api = new DrupalJsonApiParams(); 88 | // This example is for a Date field that is set to be date only (no time). 89 | api.addFilter('field_test_date', '2019-06-27'); 90 | expect(api.getQueryString({ encode: false })).toBe('filter[field_test_date]=2019-06-27'); 91 | 92 | api.clear(); 93 | // This example is for a Date field that supports date and time. 94 | api.addFilter('field_test_date', '2019-06-27T16:00:00'); 95 | expect(api.getQueryString({ encode: false })).toBe('filter[field_test_date]=2019-06-27T16:00:00'); 96 | api.clear(); 97 | // Note that timestamp fields (like created or changed) 98 | // currently must use a timestamp for filtering: 99 | api.addFilter('created', '448365617'); 100 | expect(api.getQueryString({ encode: false })).toBe('filter[created]=448365617'); 101 | }); 102 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Drupal JSON-API Params 2 | 3 | ![GitHub pages build status](https://img.shields.io/github/actions/workflow/status/d34dman/drupal-jsonapi-params/typedoc.yml?style=flat-square&label=Build) 4 | ![Codecov](https://img.shields.io/codecov/c/github/d34dman/drupal-jsonapi-params?style=flat-square&logo=codecov) 5 | [![npm](https://img.shields.io/npm/v/drupal-jsonapi-params?style=flat-square)](https://www.npmjs.com/package/drupal-jsonapi-params) 6 | ![npm package minimized gzipped size](https://img.shields.io/bundlejs/size/drupal-jsonapi-params?style=flat-square) 7 | ![npm type definitions](https://img.shields.io/npm/types/drupal-jsonapi-params?style=flat-square) 8 | [![npm downloads](https://img.shields.io/npm/dt/drupal-jsonapi-params.svg?maxAge=2592000&style=flat-square)](http://npmjs.com/package/drupal-jsonapi-params) 9 | 10 | The [JSON:API](https://jsonapi.org/) is part of [Drupal](https://www.drupal.org/) Core. 11 | 12 | The JSON:API specifications defines standard query parameters to be used to do filtering, sorting, restricting fields that are returned, pagination and so on. 13 | 14 | This module provides a helper Class to create the required query. While doing so, it also tries to optimise the query by using the short form, whenever possible. 15 | 16 | [![API Reference](https://img.shields.io/github/actions/workflow/status/d34dman/drupal-jsonapi-params/typedoc.yml?label=API%20Reference&logo=GitHub&style=for-the-badge)](https://d34dman.github.io/drupal-jsonapi-params/) 17 | ## Installation 18 | 19 | Install the package via `npm`: 20 | 21 | ```sh 22 | $ npm i drupal-jsonapi-params 23 | ``` 24 | 25 | ## Usage 26 | 27 | ### import 28 | 29 | Import `DrupalJsonApiParams` from `drupal-jsonapi-params` 30 | ```js 31 | import {DrupalJsonApiParams} from 'drupal-jsonapi-params'; 32 | 33 | const apiParams = new DrupalJsonApiParams(); 34 | ``` 35 | 36 | ### require 37 | 38 | ```js 39 | var drupalJsonapiParams = require("drupal-jsonapi-params") 40 | 41 | const apiParams = new drupalJsonapiParams.DrupalJsonApiParams(); 42 | ``` 43 | 44 | ```js 45 | apiParams 46 | // Add Group within Groups. 47 | .addGroup('publish_status', 'OR', 'parent_group') 48 | .addGroup('child_group_B', 'AND', 'parent_group') 49 | .addGroup('parent_group', 'AND') 50 | // Add Filters. 51 | .addFilter('status', '1') 52 | // Add Filter to Group. 53 | .addFilter('status', '2', '!=', 'publish_status') 54 | // Add Page Limit. 55 | .addPageLimit(5) 56 | // Add Page Offset. 57 | .addPageOffset(20) 58 | // Add Fields. 59 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 60 | // Add Includes. 61 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 62 | // Add multiple sort criterion. 63 | .addSort('id', 'DESC') 64 | .addSort('uid') 65 | .addSort('status'); 66 | 67 | const urlencodedQueryString = apiParams.getQueryString(); 68 | const queryString = apiParams.getQueryString({ encode: false }); 69 | 70 | ``` 71 | 72 | ## API 73 | 74 | ### getQueryString [options?] 75 | 76 | Returns query string which can be used in api calls. By default the output is URI encoded. Options can be passed to control the [qs.stringifying](https://github.com/ljharb/qs#stringifying) internally used. 77 | 78 | ### addFilter 79 | 80 | Used to restrict items returned in a listing. 81 | 82 | | Params | Type | Description | 83 | | --- | --- | --- | 84 | | path | `string` | A 'path' identifies a field on a resource 85 | | value | `string` | string[] | null` | A 'value' is the thing you compare against. For operators like "IN" which supports multiple parameters, you can supply an array. 86 | | operator | `string` | (Optional) An 'operator' is a method of comparison 87 | | group | `string` | (Optional) Name of the group, the filter belongs to 88 | 89 | 90 | Following values can be used for the operator. If none is provided, it assumes "`=`" by default. 91 | 92 | ``` 93 | '=', '<>', 94 | '>', '>=', '<', '<=', 95 | 'STARTS_WITH', 'CONTAINS', 'ENDS_WITH', 96 | 'IN', 'NOT IN', 97 | 'BETWEEN', 'NOT BETWEEN', 98 | 'IS NULL', 'IS NOT NULL' 99 | ``` 100 | 101 | **NOTE: Make sure you match the value supplied based on the operators used as per the table below** 102 | 103 | | Value Type | Operator | Description | 104 | | --- | --- | --- | 105 | | `string` | `=`, `<>`, `>`, `>=`, `<`, `<=`, `STARTS_WITH`, `CONTAINS`, `ENDS_WITH` | | 106 | | `string[]` | `IN`, `NOT IN` | | 107 | | `string[]` _size 2_ | `BETWEEN`, `NOT BETWEEN` | The first item is used for min (start of the range), and the second item is used for max (end of the range). 108 | | `null` | `IS NULL`, `IS NOT NULL` | Must use `null` 109 | 110 | 111 | [Read more about filter in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/filtering) 112 | 113 | ### addGroup 114 | 115 | Used to group Filters. Groups can be nested too. 116 | 117 | |Params | Type | Description | 118 | | --- | --- | --- | 119 | | name | `string` | Name of the group 120 | | conjunction | `string` | (Optional) All groups have conjunctions and a conjunction is either `AND` or `OR`. 121 | | memberOf | `string` | (Optional) Name of the group, this group belongs to 122 | 123 | ### addInclude 124 | 125 | Used to add referenced resources inside same request. Thereby preventing additional api calls. 126 | 127 | |Params | Type | Description | 128 | | --- | --- | --- | 129 | | fields | `string[]` | Array of field names 130 | 131 | [Read more about Includes in Drupal.org Documentation](https://www.drupal.org/docs/8/modules/jsonapi/includes) 132 | 133 | ### addSort 134 | 135 | Used to return the list of items in specific order. 136 | 137 | |Params | Type | Description | 138 | | --- | --- | --- | 139 | | path | `string` | A 'path' identifies a field on a resource 140 | | direction | `string` | Sort direction `ASC` or `DESC` 141 | 142 | [Read more about Sort in Drupal.org Documentation](https://www.drupal.org/docs/8/modules/jsonapi/sorting) 143 | 144 | ### addPageLimit 145 | 146 | Use to restrict max amount of items returned in the listing. Using this for pagination is tricky, and make sure you read the following document on Drupal.org to implement it correctly. 147 | 148 | |Params | Type | Description | 149 | | --- | --- | --- | 150 | | limit | `number` | Number of items to limit to | 151 | 152 | [Read more about Pagination in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/pagination) 153 | 154 | 155 | ### addPageOffset 156 | 157 | Use to skip some items items from start of the listing. Please note that this is not the page number. To get the offset number for a page you can 158 | multiply the number of pages you want to skip with items per page. 159 | 160 | |Params | Type | Description | 161 | | --- | --- | --- | 162 | | offset | `number` | Number of items to skip to | 163 | 164 | [Read more about Pagination in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/pagination) 165 | 166 | **NOTE** 167 | 168 | JSON:API response have pagination information build into the response. Based on the results in the response, you can get "previous" and "next" links which can be used 169 | to get further items when results overflows into multiple pages. 170 | 171 | If you are looking for a practical guide, you can check out the example in this issue on GitHub https://github.com/d34dman/drupal-jsonapi-params/issues/40 172 | 173 | 174 | ### addFields 175 | 176 | The name of this method might be misleading. Use this to explicitely request for specific fields on an entity. 177 | 178 | |Params | Type | Description | 179 | | --- | --- | --- | 180 | | type | `string` | Resource type 181 | | fields | ``string[]`` | Array of field names in the given resource type 182 | 183 | --- 184 | ### addCustomParam 185 | 186 | Use to add custom parameter to the query. 187 | 188 | |Params | Type | Description | 189 | | --- | --- | --- | 190 | | input | `object` | The parameter object | 191 | 192 | E.g. usage 193 | 194 | ```js 195 | apiParams 196 | // To add `foo=bar` to the query. 197 | .addCustomParam({foo: 'bar'}) 198 | // To add `foo[bar]=baz` to the query. 199 | .addCustomParam({ foo: {bar: 'baz'}}) 200 | // To add `bar[0]=a&bar[1]=b&bar[2]=c` to the query. 201 | .addCustomParam({ bar: ['a', 'b', 'c']}) 202 | ``` 203 | 204 | 205 | ## Helper methods 206 | 207 | ### clear 208 | 209 | Clears all query parameter constructed so far. 210 | 211 | ### getQueryObject 212 | 213 | Get object representation of the query object generated so far. 214 | 215 | ### initialize 216 | 217 | Re-initialize with a query string/object or another instance of DrupalJsonApiParams 218 | 219 | ### initializeWithQueryObject 220 | 221 | Re-initialize with previously stored data from `getQueryObject` 222 | 223 | ### initializeWithQueryString 224 | 225 | Re-initialize with previously stored data from `getQueryString`. 226 | This method accepts an optional parameter to pass options to `qs` library when parsing the given query. 227 | 228 | Please refer to https://www.npmjs.com/package/qs for more info about available options. 229 | 230 | This would override any options set using setQsOptions during the given call. 231 | 232 | ### setQsOption 233 | 234 | Set options that is passed to `qs` library when parsing/serializing query paramters. 235 | Please refer to https://www.npmjs.com/package/qs for more info about available options. 236 | 237 | ### getQsOption 238 | 239 | Get options that is passed to qs library when parsing/serializing query paramters. The value should match whatever was previously set via `setQsOptions` method. 240 | -------------------------------------------------------------------------------- /src/__tests__/DefaultValues.test.ts: -------------------------------------------------------------------------------- 1 | import { DrupalJsonApiParams } from '../index'; 2 | 3 | test('Empty Default Values', () => { 4 | let api = new DrupalJsonApiParams(); 5 | expect(api.getQueryString()).toBe(''); 6 | }); 7 | 8 | test('Filter for `status = 1`', () => { 9 | let api = new DrupalJsonApiParams(); 10 | api.addFilter('status', '1'); 11 | expect(api.getQueryString({ encode: false })).toBe('filter[status]=1'); 12 | }); 13 | 14 | test('Filter for `status = 1` twice', () => { 15 | let api = new DrupalJsonApiParams(); 16 | api.addFilter('status', '1'); 17 | api.addFilter('status', '1'); 18 | expect(api.getQueryString({ encode: false })).toBe( 19 | 'filter[1][condition][path]=status&filter[1][condition][value]=1&filter[status]=1', 20 | ); 21 | }); 22 | 23 | test('Filter for `status = 1` without using shortcuts', () => { 24 | let api = new DrupalJsonApiParams( 25 | {}, 26 | { 27 | useShortCutForQueryGeneration: false, 28 | }, 29 | ); 30 | api.addFilter('status', '1'); 31 | api.addFilter('status', '1'); 32 | expect(api.getQueryString({ encode: false })).toBe( 33 | 'filter[1][condition][path]=status&filter[1][condition][value]=1&filter[1][condition][operator]==&filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][operator]==', 34 | ); 35 | }); 36 | 37 | test('Filter for `status = 1` with field names for keys and no shortcuts', () => { 38 | let api = new DrupalJsonApiParams( 39 | 'filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][operator]==&filter[status--2][condition][path]=status&filter[status--2][condition][value]=1&filter[status--2][condition][operator]==', 40 | { 41 | useShortCutForQueryGeneration: false, 42 | alwaysUseFieldNameForKeys: true, 43 | }, 44 | ); 45 | api.addFilter('status', '1'); 46 | api.addFilter('status', '1'); 47 | expect(api.getQueryString({ encode: false })).toBe( 48 | 'filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][operator]==&filter[status--2][condition][path]=status&filter[status--2][condition][value]=1&filter[status--2][condition][operator]==&filter[status--1][condition][path]=status&filter[status--1][condition][value]=1&filter[status--1][condition][operator]==&filter[status--3][condition][path]=status&filter[status--3][condition][value]=1&filter[status--3][condition][operator]==', 49 | ); 50 | }); 51 | 52 | test('Filter for `status = 1` && `status = 2`', () => { 53 | let api = new DrupalJsonApiParams(); 54 | api.addFilter('status', '1').addFilter('status', '2'); 55 | expect(api.getQueryString({ encode: false })).toBe( 56 | 'filter[1][condition][path]=status&filter[1][condition][value]=2&filter[status]=1', 57 | ); 58 | }); 59 | 60 | test('Filter for `status = null`', () => { 61 | let api = new DrupalJsonApiParams(); 62 | expect(() => { 63 | api.addFilter('status', null); 64 | }).toThrow(TypeError); 65 | }); 66 | 67 | test('Filter for `status = [1, 20]`', () => { 68 | let api = new DrupalJsonApiParams(); 69 | expect(() => { 70 | api.addFilter('status', ['1', '20']); 71 | }).toThrow(TypeError); 72 | }); 73 | 74 | test('Filter for `status IS NULL`', () => { 75 | let api = new DrupalJsonApiParams(); 76 | api.addFilter('status', null, 'IS NULL'); 77 | expect(api.getQueryString({ encode: false })).toBe( 78 | 'filter[status][condition][path]=status&filter[status][condition][operator]=IS NULL', 79 | ); 80 | }); 81 | 82 | test('Filter for `status IS NULL` for non-null values', () => { 83 | let api = new DrupalJsonApiParams(); 84 | api.addFilter('status', ['random'], 'IS NULL'); 85 | expect(api.getQueryString({ encode: false })).toBe( 86 | 'filter[status][condition][path]=status&filter[status][condition][operator]=IS NULL', 87 | ); 88 | 89 | let api2 = new DrupalJsonApiParams(); 90 | api2.addFilter('status', '', 'IS NULL'); 91 | expect(api2.getQueryString({ encode: false })).toBe( 92 | 'filter[status][condition][path]=status&filter[status][condition][operator]=IS NULL', 93 | ); 94 | }); 95 | 96 | test('Filter for `status IS NULL` in valid', () => { 97 | let api = new DrupalJsonApiParams(); 98 | api.addFilter('status', null, 'IS NULL', 'valid'); 99 | expect(api.getQueryString({ encode: false })).toBe( 100 | 'filter[status][condition][path]=status&filter[status][condition][operator]=IS NULL&filter[status][condition][memberOf]=valid', 101 | ); 102 | }); 103 | 104 | test('Filter for `status IS NOT NULL`', () => { 105 | let api = new DrupalJsonApiParams(); 106 | api.addFilter('status', null, 'IS NOT NULL'); 107 | expect(api.getQueryString({ encode: false })).toBe( 108 | 'filter[status][condition][path]=status&filter[status][condition][operator]=IS NOT NULL', 109 | ); 110 | }); 111 | 112 | test('Filter for `changed is BETWEEN 0 AND 123456789`', () => { 113 | let api = new DrupalJsonApiParams(); 114 | api.addFilter('changed', ['0', '123456789'], 'BETWEEN'); 115 | expect(api.getQueryString({ encode: false })).toBe( 116 | 'filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=123456789&filter[changed][condition][operator]=BETWEEN', 117 | ); 118 | }); 119 | 120 | test('Filter for `changed is BETWEEN 0 AND 123456789` in range', () => { 121 | let api = new DrupalJsonApiParams(); 122 | api.addFilter('changed', ['0', '123456789'], 'BETWEEN', 'range'); 123 | expect(api.getQueryString({ encode: false })).toBe( 124 | 'filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=123456789&filter[changed][condition][operator]=BETWEEN&filter[changed][condition][memberOf]=range', 125 | ); 126 | }); 127 | 128 | test('Filter for `changed is BETWEEN 0 AND 2 AND 2` in range', () => { 129 | let api = new DrupalJsonApiParams(); 130 | expect(() => { 131 | api.addFilter('changed', ['0', '1', '2'], 'BETWEEN', 'range'); 132 | }).toThrow(TypeError); 133 | }); 134 | 135 | test('Filter for `changed is BETWEEN 0` in range', () => { 136 | let api = new DrupalJsonApiParams(); 137 | expect(() => { 138 | api.addFilter('changed', ['0'], 'BETWEEN', 'range'); 139 | }).toThrow(TypeError); 140 | }); 141 | 142 | test('Filter for `changed is NOT BETWEEN 0 AND 123456789`', () => { 143 | let api = new DrupalJsonApiParams(); 144 | api.addFilter('changed', ['0', '123456789'], 'NOT BETWEEN'); 145 | expect(api.getQueryString({ encode: false })).toBe( 146 | 'filter[changed][condition][path]=changed&filter[changed][condition][value][0]=0&filter[changed][condition][value][1]=123456789&filter[changed][condition][operator]=NOT BETWEEN', 147 | ); 148 | }); 149 | 150 | test('Filter for `id IN ["1", "2", "3"]`', () => { 151 | let api = new DrupalJsonApiParams(); 152 | api.addFilter('id', ['1', '2', '3'], 'IN'); 153 | expect(api.getQueryString({ encode: false })).toBe( 154 | 'filter[id][condition][path]=id&filter[id][condition][value][0]=1&filter[id][condition][value][1]=2&filter[id][condition][value][2]=3&filter[id][condition][operator]=IN', 155 | ); 156 | }); 157 | 158 | test('Filter for `status = 1` && `status != 2` in group=publish_status', () => { 159 | let api = new DrupalJsonApiParams(); 160 | api 161 | .addGroup('publish_status') 162 | .addFilter('status', '1', '=', 'publish_status') 163 | .addFilter('status', '2', '!=', 'publish_status'); 164 | expect(api.getQueryString({ encode: false })).toBe( 165 | 'filter[2][condition][path]=status&filter[2][condition][value]=2&filter[2][condition][operator]=!=&filter[2][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][memberOf]=publish_status', 166 | ); 167 | }); 168 | 169 | test('Add Group for `status = 1` in group publish_status', () => { 170 | let api = new DrupalJsonApiParams(); 171 | api.addGroup('publish_status').addFilter('status', '1', '=', 'publish_status'); 172 | expect(api.getQueryString({ encode: false })).toBe( 173 | 'filter[publish_status][group][conjunction]=OR&filter[status][condition][path]=status&filter[status][condition][value]=1&filter[status][condition][memberOf]=publish_status', 174 | ); 175 | }); 176 | 177 | test('Add Groups to Group', () => { 178 | let api = new DrupalJsonApiParams(); 179 | api 180 | .addGroup('child_group_A', 'OR', 'parent_group') 181 | .addGroup('child_group_B', 'AND', 'parent_group') 182 | .addGroup('parent_group', 'AND'); 183 | expect(api.getQueryString({ encode: false })).toBe( 184 | 'filter[child_group_A][group][conjunction]=OR&filter[child_group_A][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND', 185 | ); 186 | }); 187 | 188 | test('Add Include', () => { 189 | let api = new DrupalJsonApiParams(); 190 | api.addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']); 191 | expect(api.getQueryString({ encode: false })).toBe('include=field_a.id,field_b.uid,field_c.tid'); 192 | }); 193 | 194 | test('Add Fields', () => { 195 | let api = new DrupalJsonApiParams(); 196 | api.addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']).addFields('node--blog', ['a', 'b', 'c']); 197 | expect(api.getQueryString({ encode: false })).toBe( 198 | 'fields[node--article]=field_a.id,field_b.uid,field_c.tid&fields[node--blog]=a,b,c', 199 | ); 200 | }); 201 | 202 | test('Add Pager with limit 5', () => { 203 | let api = new DrupalJsonApiParams(); 204 | api.addPageLimit(5); 205 | expect(api.getQueryString({ encode: false })).toBe('page[limit]=5'); 206 | }); 207 | 208 | test('Add Pager with offset 3', () => { 209 | let api = new DrupalJsonApiParams(); 210 | api.addPageOffset(3); 211 | expect(api.getQueryString({ encode: false })).toBe('page[offset]=3'); 212 | }); 213 | 214 | test('Point pager to 3rd page with 5 items per page', () => { 215 | let api = new DrupalJsonApiParams(); 216 | // Page limit is 5, because we take 5 items per page. 217 | api.addPageLimit(5); 218 | // Offset is 10, which is a way of saying skip all items from 219 | // first two pages. Since there are two pages with 5 items each 220 | // we skip 5*2 items, i.e. 10 items. 221 | api.addPageOffset(10); 222 | expect(api.getQueryString({ encode: false })).toBe('page[limit]=5&page[offset]=10'); 223 | }); 224 | 225 | test('Point pager to 3rd page with 5 items per page - alternate approach', () => { 226 | // This test is to check that irrespective of the order in which 227 | // the offset/limit are entered, the query is generated properly. 228 | let api = new DrupalJsonApiParams(); 229 | api.addPageOffset(10); 230 | api.addPageLimit(5); 231 | expect(api.getQueryString({ encode: false })).toBe('page[offset]=10&page[limit]=5'); 232 | }); 233 | 234 | test('Add sort by status', () => { 235 | let api = new DrupalJsonApiParams(); 236 | api.addSort('status'); 237 | expect(api.getQueryString({ encode: false })).toBe('sort=status'); 238 | }); 239 | 240 | test('Add sort by status DESC', () => { 241 | let api = new DrupalJsonApiParams(); 242 | api.addSort('status', 'DESC'); 243 | expect(api.getQueryString({ encode: false })).toBe('sort=-status'); 244 | }); 245 | 246 | test('Add multiple sort criterion', () => { 247 | let api = new DrupalJsonApiParams(); 248 | api 249 | .addSort('id', 'DESC') 250 | .addSort('uid') 251 | .addSort('status'); 252 | expect(api.getQueryString({ encode: false })).toBe('sort=-id,uid,status'); 253 | }); 254 | 255 | test("Nova's Ark", () => { 256 | let api = new DrupalJsonApiParams(); 257 | api 258 | // Add Group within Groups. 259 | .addGroup('publish_status', 'OR', 'parent_group') 260 | .addGroup('child_group_B', 'AND', 'parent_group') 261 | .addGroup('parent_group', 'AND') 262 | // Add Filters. 263 | .addFilter('status', '1') 264 | // Add Filter to Group. 265 | .addFilter('status', '2', '!=', 'publish_status') 266 | // Add Page Limit. 267 | .addPageLimit(5) 268 | .addPageOffset(3) 269 | // Add Fields. 270 | .addFields('node--article', ['field_a.id', 'field_b.uid', 'field_c.tid']) 271 | // Add Includes. 272 | .addInclude(['field_a.id', 'field_b.uid', 'field_c.tid']) 273 | // Add multiple sort criterion. 274 | .addSort('id', 'DESC') 275 | .addSort('uid') 276 | .addSort('status'); 277 | expect(api.getQueryString({ encode: false })).toBe( 278 | 'filter[4][condition][path]=status&filter[4][condition][value]=2&filter[4][condition][operator]=!=&filter[4][condition][memberOf]=publish_status&filter[publish_status][group][conjunction]=OR&filter[publish_status][group][memberOf]=parent_group&filter[child_group_B][group][conjunction]=AND&filter[child_group_B][group][memberOf]=parent_group&filter[parent_group][group][conjunction]=AND&filter[status]=1&include=field_a.id,field_b.uid,field_c.tid&page[limit]=5&page[offset]=3&sort=-id,uid,status&fields[node--article]=field_a.id,field_b.uid,field_c.tid', 279 | ); 280 | }); 281 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import qs = require('qs'); 2 | 3 | export interface FilterItems { 4 | [key: string]: FilterItemType; 5 | } 6 | 7 | export type FilterItemShortest = string; 8 | export type FilterItemShort = { 9 | operator: string; 10 | value: string; 11 | }; 12 | export type FilterItem = { 13 | condition?: { 14 | operator?: string; 15 | path: string; 16 | value?: string | string[]; 17 | memberOf?: string; 18 | }; 19 | group?: GroupItem; 20 | }; 21 | 22 | export type DrupalJsonApiParamConfig = { 23 | useShortCutForQueryGeneration?: boolean; 24 | alwaysUseFieldNameForKeys?: boolean; 25 | }; 26 | 27 | export type FilterItemType = FilterItem | FilterItemShort | FilterItemShortest; 28 | 29 | export interface GroupItem { 30 | conjunction: string; 31 | memberOf?: string; 32 | } 33 | 34 | export interface PageItem { 35 | limit?: number; 36 | offset?: number; 37 | } 38 | 39 | export interface FieldItems { 40 | [key: string]: string; 41 | } 42 | 43 | export interface DrupalJsonApiParamsStore { 44 | filter: FilterItems; 45 | sort: string[]; 46 | include: string[]; 47 | page: PageItem | undefined; 48 | fields: FieldItems; 49 | } 50 | 51 | /** 52 | * Object representation of Query string. 53 | */ 54 | export interface ParamBag { 55 | [id: string]: TValue; 56 | } 57 | 58 | export interface DrupalJsonApiParamsInterface { 59 | initialize(input: string | object | DrupalJsonApiParamsInterface): this; 60 | getQueryObject(): object; 61 | } 62 | export class DrupalJsonApiParams implements DrupalJsonApiParamsInterface { 63 | protected data: DrupalJsonApiParamsStore = { 64 | filter: {}, 65 | include: [], 66 | page: undefined, 67 | sort: [], 68 | fields: {}, 69 | }; 70 | 71 | protected qsOptions: object = {}; 72 | 73 | protected config: DrupalJsonApiParamConfig = { 74 | useShortCutForQueryGeneration: true, 75 | alwaysUseFieldNameForKeys: false, 76 | }; 77 | 78 | /** 79 | * Optionaly initialize with a previously stored query/object/query string. 80 | * 81 | * @category Init 82 | */ 83 | public constructor(input?: string | object | DrupalJsonApiParamsInterface, config?: DrupalJsonApiParamConfig) { 84 | if (config !== undefined) { 85 | this.config = config; 86 | } 87 | this.initialize(input); 88 | } 89 | 90 | /** 91 | * Add custom parameter to the query. 92 | * 93 | * E.g. usage 94 | * 95 | * ```js 96 | * apiParams 97 | * // To add `foo=bar` to the query. 98 | * .addCustomParam({foo: 'bar'}) 99 | * // To add `foo[bar]=baz` to the query. 100 | * .addCustomParam({ foo: {bar: 'baz'}}) 101 | * // To add `bar[0]=a&bar[1]=b&bar[2]=c` to the query. 102 | * .addCustomParam({ bar: ['a', 'b', 'c']}) 103 | * ``` 104 | * 105 | * @param input The parameter object 106 | * 107 | * @category Helper 108 | */ 109 | public addCustomParam(input: ParamBag) { 110 | this.data = { 111 | ...this.data, 112 | ...input, 113 | }; 114 | return this; 115 | } 116 | 117 | /** 118 | * Add JSON:API field. 119 | * 120 | * The name of this method might be miss leading. Use this to explicitely request for specific fields on an entity. 121 | * 122 | * @param type Resource type 123 | * @param fields Array of field names in the given resource type 124 | * 125 | * @category JSON:API Query 126 | */ 127 | public addFields(type: string, fields: string[]): this { 128 | this.data.fields[type] = fields.join(','); 129 | return this; 130 | } 131 | 132 | /** 133 | * Add JSON:API sort. 134 | * 135 | * Used to return the list of items in specific order. 136 | * 137 | * [Read more about Sort in Drupal.org Documentation](https://www.drupal.org/docs/8/modules/jsonapi/sorting) 138 | * 139 | * @param path A 'path' identifies a field on a resource 140 | * @param direction Sort direction `ASC` or `DESC` 141 | * 142 | * @category JSON:API Query 143 | */ 144 | public addSort(path: string, direction?: string): this { 145 | let prefix = ''; 146 | if (direction !== undefined && direction === 'DESC') { 147 | prefix = '-'; 148 | } 149 | this.data.sort = this.data.sort.concat(prefix + path); 150 | return this; 151 | } 152 | 153 | /** 154 | * Add JSON:API page limit. 155 | * 156 | * Use to restrict max amount of items returned in the listing. 157 | * Using this for pagination is tricky, and make sure you read 158 | * the following document on Drupal.org to implement it correctly. 159 | * 160 | * [Read more about Pagination in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/pagination) 161 | * 162 | * @param limit Number of items to limit to 163 | * 164 | * @category JSON:API Query 165 | */ 166 | public addPageLimit(limit: number): this { 167 | if (this.data.page === undefined) { 168 | this.data.page = { limit }; 169 | } else { 170 | this.data.page.limit = limit; 171 | } 172 | return this; 173 | } 174 | 175 | /** 176 | * Add JSON:API page offset. 177 | * 178 | * Use to skip some items from the start of the listing. 179 | * Using this for pagination is tricky, and make sure you read 180 | * the following document on Drupal.org to implement it correctly. 181 | * 182 | * [Read more about Pagination in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/pagination) 183 | * 184 | * @param offset Number of items to skip from the begining. 185 | * 186 | * @category JSON:API Query 187 | */ 188 | public addPageOffset(offset: number): this { 189 | if (this.data.page === undefined) { 190 | this.data.page = { offset }; 191 | } else { 192 | this.data.page.offset = offset; 193 | } 194 | return this; 195 | } 196 | 197 | /** 198 | * Add JSON:API include. 199 | * 200 | * Used to add referenced resources inside same request. 201 | * Thereby preventing additional api calls. 202 | * 203 | * [Read more about Includes in Drupal.org Documentation](https://www.drupal.org/docs/8/modules/jsonapi/includes) 204 | * 205 | * @param fields Array of field names 206 | * 207 | * @category JSON:API Query 208 | */ 209 | public addInclude(fields: string[]): this { 210 | this.data.include = this.data.include.concat(fields); 211 | return this; 212 | } 213 | 214 | /** 215 | * Add JSON:API group. 216 | * 217 | * @param name Name of the group 218 | * @param conjunction All groups have conjunctions and a conjunction is either `AND` or `OR`. 219 | * @param memberOf Name of the group, this group belongs to 220 | * 221 | * @category JSON:API Query 222 | */ 223 | public addGroup(name: string, conjunction: string = 'OR', memberOf?: string): this { 224 | this.data.filter[name] = { 225 | group: { 226 | conjunction, 227 | ...(memberOf !== undefined && { memberOf }), 228 | }, 229 | }; 230 | return this; 231 | } 232 | 233 | /** 234 | * Add JSON:API filter. 235 | * 236 | * Following values can be used for the operator. If none is provided, it assumes "`=`" by default. 237 | * ``` 238 | * '=', '<>', 239 | * '>', '>=', '<', '<=', 240 | * 'STARTS_WITH', 'CONTAINS', 'ENDS_WITH', 241 | * 'IN', 'NOT IN', 242 | * 'BETWEEN', 'NOT BETWEEN', 243 | * 'IS NULL', 'IS NOT NULL' 244 | * ``` 245 | * 246 | * **NOTE: Make sure you match the value supplied based on the operators used as per the table below** 247 | * 248 | * | Value Type | Operator | Comment | 249 | * | --- | --- | --- | 250 | * | `string` | `=`, `<>`, `>`, `>=`, `<`, `<=`, `STARTS_WITH`, `CONTAINS`, `ENDS_WITH` | | 251 | * | `string[]` | `IN`, `NOT IN` | | 252 | * | `string[]` _size 2_ | `BETWEEN`, `NOT BETWEEN` | The first item is used for min (start of the range), and the second item is used for max (end of the range). 253 | * | `null` | `IS NULL`, `IS NOT NULL` | Must use `null` 254 | * 255 | * [Read more about filter in Drupal.org Documentation](https://www.drupal.org/docs/8/core/modules/jsonapi-module/filtering) 256 | * 257 | * @param path A 'path' identifies a field on a resource 258 | * @param value string[] | null` | A 'value' is the thing you compare against. For operators like "IN" which supports multiple parameters, you can supply an array. 259 | * @param operator An 'operator' is a method of comparison 260 | * @param memberOf Name of the group, the filter belongs to 261 | * 262 | * @category JSON:API Query 263 | */ 264 | public addFilter( 265 | path: string, 266 | value: string | string[] | null, 267 | operator: string = '=', 268 | memberOf?: string, 269 | key?: string, 270 | ): this { 271 | const name = this.getIndexId(this.data.filter, key || path, !!key); 272 | // Instead of relying on users supplying 'null' value, we 273 | // hardcode value to 'null'. This should improve DX and be 274 | // in line with how Condition query works in Drupal's PHP api. 275 | if (operator === 'IS NULL' || operator === 'IS NOT NULL') { 276 | value = null; 277 | } 278 | // Allow null values only for IS NULL and IS NOT NULL operators. 279 | if (value === null) { 280 | if (!(operator === 'IS NULL' || operator === 'IS NOT NULL')) { 281 | throw new TypeError(`Value cannot be null for the operator "${operator}"`); 282 | } 283 | this.data.filter[name] = { 284 | condition: { 285 | path, 286 | ...{ operator }, 287 | ...(memberOf !== undefined && { memberOf }), 288 | }, 289 | }; 290 | return this; 291 | } 292 | 293 | if (Array.isArray(value)) { 294 | switch (operator) { 295 | case 'BETWEEN': 296 | case 'NOT BETWEEN': 297 | if (value.length !== 2) { 298 | throw new TypeError(`Value must consists of 2 items for the "${operator}"`); 299 | } 300 | break; 301 | case 'IN': 302 | case 'NOT IN': 303 | break; 304 | default: 305 | throw new TypeError(`Value cannot be an array for the operator "${operator}"`); 306 | } 307 | this.data.filter[name] = { 308 | condition: { 309 | path, 310 | value, 311 | ...{ operator }, 312 | ...(memberOf !== undefined && { memberOf }), 313 | }, 314 | }; 315 | return this; 316 | } 317 | // Validate filter 318 | if ( 319 | this.config.useShortCutForQueryGeneration && 320 | memberOf === undefined && 321 | path === name && 322 | this.data.filter[path] === undefined 323 | ) { 324 | if (operator === '=') { 325 | this.data.filter[name] = value; 326 | } else { 327 | this.data.filter[name] = { 328 | value, 329 | operator, 330 | }; 331 | } 332 | return this; 333 | } 334 | 335 | this.data.filter[name] = { 336 | condition: { 337 | path, 338 | value, 339 | // ...((this.config.useShortCutForQueryGeneration && (operator !== '=')) && { operator }), 340 | ...(this.config.useShortCutForQueryGeneration ? operator !== '=' && { operator } : { operator }), 341 | ...(memberOf !== undefined && { memberOf }), 342 | }, 343 | }; 344 | 345 | return this; 346 | } 347 | 348 | /** 349 | * Generate a unique key name for the given object. 350 | * 351 | * @param obj The object to generate a key name for. 352 | * @param proposedKey The proposed key name. 353 | * @param enforceKeyName Whether to enforce the key name. 354 | * 355 | * @returns The generated key name. 356 | */ 357 | protected getIndexId(obj: any, proposedKey: string, enforceKeyName?: boolean): string { 358 | enforceKeyName = enforceKeyName || this.config.alwaysUseFieldNameForKeys; 359 | let key: string; 360 | if (obj[proposedKey] === undefined) { 361 | key = proposedKey; 362 | } else { 363 | key = this.generateKeyName(obj, proposedKey, enforceKeyName); 364 | } 365 | return key; 366 | } 367 | 368 | /** 369 | * Generate a unique key name for the given object. 370 | * 371 | * @param obj The object to generate a key name for. 372 | * @param proposedKey The proposed key name. 373 | * @param enforceKeyName Whether to enforce the key name. 374 | * 375 | * @returns The generated key name. 376 | */ 377 | protected generateKeyName(obj: any, proposedKey: string, enforceKeyName: boolean = false): string { 378 | const length = Object.keys(obj).length; 379 | if (enforceKeyName) { 380 | for (let ndx = 1; ndx <= length; ndx++) { 381 | const key = `${proposedKey}--${ndx}`; 382 | if (obj[key] === undefined) { 383 | return key; 384 | } 385 | } 386 | } 387 | return length.toString(); 388 | } 389 | 390 | /** 391 | * Get query object. 392 | * 393 | * @category Helper 394 | */ 395 | public getQueryObject(): ParamBag { 396 | const foo: ParamBag = JSON.parse(JSON.stringify(this.data)); 397 | 398 | if (this.data.include.length > 0) { 399 | foo.include = this.data.include.join(','); 400 | } else { 401 | delete foo.include; 402 | } 403 | 404 | if (this.data.sort.length > 0) { 405 | foo.sort = this.data.sort.join(','); 406 | } else { 407 | delete foo.sort; 408 | } 409 | 410 | return foo; 411 | } 412 | 413 | /** 414 | * Get query string. 415 | * 416 | * @param options Options to be passed to `qs` library during parsing. 417 | * 418 | * @category Helper 419 | */ 420 | public getQueryString(options?: object): string { 421 | const data = this.getQueryObject(); 422 | // NOTE: Empty objects are falsy in JavaScript. 423 | const qsOptions = options || this.getQsOption(); 424 | return qs.stringify(data, qsOptions); 425 | } 426 | 427 | /** 428 | * Clear all parameters added so far. 429 | * 430 | * @category Helper 431 | */ 432 | public clear() { 433 | this.data = { 434 | filter: {}, 435 | include: [], 436 | page: undefined, 437 | sort: [], 438 | fields: {}, 439 | }; 440 | return this; 441 | } 442 | 443 | /** 444 | * Initialize with a previously stored query object. 445 | * 446 | * @category Init 447 | */ 448 | public initializeWithQueryObject(input: any) { 449 | this.clear(); 450 | const keys = Object.keys(input); 451 | keys.forEach(key => { 452 | switch (key) { 453 | case 'sort': 454 | if (input.sort.length) { 455 | this.data.sort = input.sort.split(','); 456 | } 457 | break; 458 | case 'include': 459 | if (input.include.length) { 460 | this.data.include = input.include.split(','); 461 | } 462 | break; 463 | default: 464 | this.data[key as keyof DrupalJsonApiParamsStore] = input[key]; 465 | } 466 | }); 467 | return this; 468 | } 469 | 470 | /** 471 | * Initialize with a previously stored query string. 472 | * 473 | * @param input The Query string to use for initializing. 474 | * @param options Options to be passed to `qs` library during parsing. 475 | * 476 | * @category Init 477 | */ 478 | public initializeWithQueryString(input: string, options?: object) { 479 | this.clear(); 480 | // NOTE: Empty objects are falsy in JavaScript. 481 | const qsOptions = options || this.getQsOption(); 482 | this.initializeWithQueryObject(qs.parse(input, qsOptions)); 483 | return this; 484 | } 485 | 486 | /** 487 | * Clone a given DrupalJsonApiParam object. 488 | * 489 | * @category Helper 490 | */ 491 | public clone(input: DrupalJsonApiParamsInterface) { 492 | const data = JSON.parse(JSON.stringify(input.getQueryObject())); 493 | this.initializeWithQueryObject(data); 494 | return this; 495 | } 496 | 497 | /** 498 | * Set options that is passed to qs when parsing/serializing. 499 | * 500 | * @see https://www.npmjs.com/package/qs 501 | */ 502 | public setQsOption(options: object): this { 503 | this.qsOptions = options; 504 | return this; 505 | } 506 | 507 | /** 508 | * Get options that is passed to qs when parsing/serializing. 509 | * 510 | * @see https://www.npmjs.com/package/qs 511 | */ 512 | public getQsOption(): object { 513 | return this.qsOptions; 514 | } 515 | 516 | /** 517 | * Initialize with a previously stored query/object/query string. 518 | * 519 | * @category Init 520 | */ 521 | public initialize(input?: string | object | DrupalJsonApiParamsInterface): this { 522 | if (input === undefined) { 523 | this.initializeWithQueryString(''); 524 | } else if (typeof input === 'object') { 525 | try { 526 | // if the input has getQueryObject() we attempt to clone. 527 | (input as DrupalJsonApiParamsInterface).getQueryObject(); 528 | this.clone(input as DrupalJsonApiParamsInterface); 529 | } catch (error) { 530 | // In any case if cloning failed, we attempt to initialize 531 | // with query object. 532 | this.initializeWithQueryObject(input); 533 | } 534 | } else { 535 | this.initializeWithQueryString(input); 536 | } 537 | return this; 538 | } 539 | } 540 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | qs: 12 | specifier: ^6.14.0 13 | version: 6.14.0 14 | devDependencies: 15 | '@changesets/cli': 16 | specifier: ^2.29.5 17 | version: 2.29.5 18 | '@types/jest': 19 | specifier: ^27.5.2 20 | version: 27.5.2 21 | '@types/qs': 22 | specifier: ^6.14.0 23 | version: 6.14.0 24 | jest: 25 | specifier: ^27.5.1 26 | version: 27.5.1 27 | prettier: 28 | specifier: ^1.19.1 29 | version: 1.19.1 30 | ts-jest: 31 | specifier: ^27.1.5 32 | version: 27.1.5(@babel/core@7.27.4)(@types/jest@27.5.2)(babel-jest@27.5.1(@babel/core@7.27.4))(jest@27.5.1)(typescript@4.9.5) 33 | tslint: 34 | specifier: ^6.1.3 35 | version: 6.1.3(typescript@4.9.5) 36 | tslint-config-prettier: 37 | specifier: ^1.18.0 38 | version: 1.18.0 39 | typedoc: 40 | specifier: ^0.22.18 41 | version: 0.22.18(typescript@4.9.5) 42 | typescript: 43 | specifier: ^4.9.5 44 | version: 4.9.5 45 | 46 | packages: 47 | 48 | '@ampproject/remapping@2.3.0': 49 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 50 | engines: {node: '>=6.0.0'} 51 | 52 | '@babel/code-frame@7.27.1': 53 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 54 | engines: {node: '>=6.9.0'} 55 | 56 | '@babel/compat-data@7.27.5': 57 | resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | '@babel/core@7.27.4': 61 | resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@babel/generator@7.27.5': 65 | resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/helper-compilation-targets@7.27.2': 69 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 70 | engines: {node: '>=6.9.0'} 71 | 72 | '@babel/helper-module-imports@7.27.1': 73 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/helper-module-transforms@7.27.3': 77 | resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 78 | engines: {node: '>=6.9.0'} 79 | peerDependencies: 80 | '@babel/core': ^7.0.0 81 | 82 | '@babel/helper-plugin-utils@7.27.1': 83 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 84 | engines: {node: '>=6.9.0'} 85 | 86 | '@babel/helper-string-parser@7.27.1': 87 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 88 | engines: {node: '>=6.9.0'} 89 | 90 | '@babel/helper-validator-identifier@7.27.1': 91 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 92 | engines: {node: '>=6.9.0'} 93 | 94 | '@babel/helper-validator-option@7.27.1': 95 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 96 | engines: {node: '>=6.9.0'} 97 | 98 | '@babel/helpers@7.27.6': 99 | resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} 100 | engines: {node: '>=6.9.0'} 101 | 102 | '@babel/parser@7.27.5': 103 | resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} 104 | engines: {node: '>=6.0.0'} 105 | hasBin: true 106 | 107 | '@babel/plugin-syntax-async-generators@7.8.4': 108 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 109 | peerDependencies: 110 | '@babel/core': ^7.0.0-0 111 | 112 | '@babel/plugin-syntax-bigint@7.8.3': 113 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 114 | peerDependencies: 115 | '@babel/core': ^7.0.0-0 116 | 117 | '@babel/plugin-syntax-class-properties@7.12.13': 118 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 119 | peerDependencies: 120 | '@babel/core': ^7.0.0-0 121 | 122 | '@babel/plugin-syntax-class-static-block@7.14.5': 123 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 124 | engines: {node: '>=6.9.0'} 125 | peerDependencies: 126 | '@babel/core': ^7.0.0-0 127 | 128 | '@babel/plugin-syntax-import-attributes@7.27.1': 129 | resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} 130 | engines: {node: '>=6.9.0'} 131 | peerDependencies: 132 | '@babel/core': ^7.0.0-0 133 | 134 | '@babel/plugin-syntax-import-meta@7.10.4': 135 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 136 | peerDependencies: 137 | '@babel/core': ^7.0.0-0 138 | 139 | '@babel/plugin-syntax-json-strings@7.8.3': 140 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 141 | peerDependencies: 142 | '@babel/core': ^7.0.0-0 143 | 144 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 145 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 146 | peerDependencies: 147 | '@babel/core': ^7.0.0-0 148 | 149 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 150 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 151 | peerDependencies: 152 | '@babel/core': ^7.0.0-0 153 | 154 | '@babel/plugin-syntax-numeric-separator@7.10.4': 155 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 156 | peerDependencies: 157 | '@babel/core': ^7.0.0-0 158 | 159 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 160 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 161 | peerDependencies: 162 | '@babel/core': ^7.0.0-0 163 | 164 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 165 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 166 | peerDependencies: 167 | '@babel/core': ^7.0.0-0 168 | 169 | '@babel/plugin-syntax-optional-chaining@7.8.3': 170 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 171 | peerDependencies: 172 | '@babel/core': ^7.0.0-0 173 | 174 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 175 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 176 | engines: {node: '>=6.9.0'} 177 | peerDependencies: 178 | '@babel/core': ^7.0.0-0 179 | 180 | '@babel/plugin-syntax-top-level-await@7.14.5': 181 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 182 | engines: {node: '>=6.9.0'} 183 | peerDependencies: 184 | '@babel/core': ^7.0.0-0 185 | 186 | '@babel/plugin-syntax-typescript@7.27.1': 187 | resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 188 | engines: {node: '>=6.9.0'} 189 | peerDependencies: 190 | '@babel/core': ^7.0.0-0 191 | 192 | '@babel/runtime@7.27.6': 193 | resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} 194 | engines: {node: '>=6.9.0'} 195 | 196 | '@babel/template@7.27.2': 197 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 198 | engines: {node: '>=6.9.0'} 199 | 200 | '@babel/traverse@7.27.4': 201 | resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} 202 | engines: {node: '>=6.9.0'} 203 | 204 | '@babel/types@7.27.6': 205 | resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} 206 | engines: {node: '>=6.9.0'} 207 | 208 | '@bcoe/v8-coverage@0.2.3': 209 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 210 | 211 | '@changesets/apply-release-plan@7.0.12': 212 | resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} 213 | 214 | '@changesets/assemble-release-plan@6.0.9': 215 | resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} 216 | 217 | '@changesets/changelog-git@0.2.1': 218 | resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} 219 | 220 | '@changesets/cli@2.29.5': 221 | resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} 222 | hasBin: true 223 | 224 | '@changesets/config@3.1.1': 225 | resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} 226 | 227 | '@changesets/errors@0.2.0': 228 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 229 | 230 | '@changesets/get-dependents-graph@2.1.3': 231 | resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} 232 | 233 | '@changesets/get-release-plan@4.0.13': 234 | resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} 235 | 236 | '@changesets/get-version-range-type@0.4.0': 237 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 238 | 239 | '@changesets/git@3.0.4': 240 | resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} 241 | 242 | '@changesets/logger@0.1.1': 243 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 244 | 245 | '@changesets/parse@0.4.1': 246 | resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} 247 | 248 | '@changesets/pre@2.0.2': 249 | resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} 250 | 251 | '@changesets/read@0.6.5': 252 | resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} 253 | 254 | '@changesets/should-skip-package@0.1.2': 255 | resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} 256 | 257 | '@changesets/types@4.1.0': 258 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 259 | 260 | '@changesets/types@6.1.0': 261 | resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} 262 | 263 | '@changesets/write@0.4.0': 264 | resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} 265 | 266 | '@istanbuljs/load-nyc-config@1.1.0': 267 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 268 | engines: {node: '>=8'} 269 | 270 | '@istanbuljs/schema@0.1.3': 271 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 272 | engines: {node: '>=8'} 273 | 274 | '@jest/console@27.5.1': 275 | resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} 276 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 277 | 278 | '@jest/core@27.5.1': 279 | resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} 280 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 281 | peerDependencies: 282 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 283 | peerDependenciesMeta: 284 | node-notifier: 285 | optional: true 286 | 287 | '@jest/environment@27.5.1': 288 | resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} 289 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 290 | 291 | '@jest/fake-timers@27.5.1': 292 | resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} 293 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 294 | 295 | '@jest/globals@27.5.1': 296 | resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} 297 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 298 | 299 | '@jest/reporters@27.5.1': 300 | resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} 301 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 302 | peerDependencies: 303 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 304 | peerDependenciesMeta: 305 | node-notifier: 306 | optional: true 307 | 308 | '@jest/source-map@27.5.1': 309 | resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} 310 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 311 | 312 | '@jest/test-result@27.5.1': 313 | resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} 314 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 315 | 316 | '@jest/test-sequencer@27.5.1': 317 | resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} 318 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 319 | 320 | '@jest/transform@27.5.1': 321 | resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} 322 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 323 | 324 | '@jest/types@27.5.1': 325 | resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} 326 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 327 | 328 | '@jridgewell/gen-mapping@0.3.8': 329 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 330 | engines: {node: '>=6.0.0'} 331 | 332 | '@jridgewell/resolve-uri@3.1.2': 333 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 334 | engines: {node: '>=6.0.0'} 335 | 336 | '@jridgewell/set-array@1.2.1': 337 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 338 | engines: {node: '>=6.0.0'} 339 | 340 | '@jridgewell/sourcemap-codec@1.5.0': 341 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 342 | 343 | '@jridgewell/trace-mapping@0.3.25': 344 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 345 | 346 | '@manypkg/find-root@1.1.0': 347 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 348 | 349 | '@manypkg/get-packages@1.1.3': 350 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 351 | 352 | '@nodelib/fs.scandir@2.1.5': 353 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 354 | engines: {node: '>= 8'} 355 | 356 | '@nodelib/fs.stat@2.0.5': 357 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 358 | engines: {node: '>= 8'} 359 | 360 | '@nodelib/fs.walk@1.2.8': 361 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 362 | engines: {node: '>= 8'} 363 | 364 | '@sinonjs/commons@1.8.6': 365 | resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} 366 | 367 | '@sinonjs/fake-timers@8.1.0': 368 | resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} 369 | 370 | '@tootallnate/once@1.1.2': 371 | resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 372 | engines: {node: '>= 6'} 373 | 374 | '@types/babel__core@7.20.5': 375 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 376 | 377 | '@types/babel__generator@7.27.0': 378 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 379 | 380 | '@types/babel__template@7.4.4': 381 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 382 | 383 | '@types/babel__traverse@7.20.7': 384 | resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 385 | 386 | '@types/graceful-fs@4.1.9': 387 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 388 | 389 | '@types/istanbul-lib-coverage@2.0.6': 390 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 391 | 392 | '@types/istanbul-lib-report@3.0.3': 393 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 394 | 395 | '@types/istanbul-reports@3.0.4': 396 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 397 | 398 | '@types/jest@27.5.2': 399 | resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} 400 | 401 | '@types/node@12.20.55': 402 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 403 | 404 | '@types/node@24.0.3': 405 | resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} 406 | 407 | '@types/prettier@2.7.3': 408 | resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} 409 | 410 | '@types/qs@6.14.0': 411 | resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} 412 | 413 | '@types/stack-utils@2.0.3': 414 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 415 | 416 | '@types/yargs-parser@21.0.3': 417 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 418 | 419 | '@types/yargs@16.0.9': 420 | resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} 421 | 422 | abab@2.0.6: 423 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 424 | deprecated: Use your platform's native atob() and btoa() methods instead 425 | 426 | acorn-globals@6.0.0: 427 | resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} 428 | 429 | acorn-walk@7.2.0: 430 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 431 | engines: {node: '>=0.4.0'} 432 | 433 | acorn@7.4.1: 434 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 435 | engines: {node: '>=0.4.0'} 436 | hasBin: true 437 | 438 | acorn@8.15.0: 439 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 440 | engines: {node: '>=0.4.0'} 441 | hasBin: true 442 | 443 | agent-base@6.0.2: 444 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 445 | engines: {node: '>= 6.0.0'} 446 | 447 | ansi-colors@4.1.3: 448 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 449 | engines: {node: '>=6'} 450 | 451 | ansi-escapes@4.3.2: 452 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 453 | engines: {node: '>=8'} 454 | 455 | ansi-regex@5.0.1: 456 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 457 | engines: {node: '>=8'} 458 | 459 | ansi-styles@3.2.1: 460 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 461 | engines: {node: '>=4'} 462 | 463 | ansi-styles@4.3.0: 464 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 465 | engines: {node: '>=8'} 466 | 467 | ansi-styles@5.2.0: 468 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 469 | engines: {node: '>=10'} 470 | 471 | anymatch@3.1.3: 472 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 473 | engines: {node: '>= 8'} 474 | 475 | argparse@1.0.10: 476 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 477 | 478 | array-union@2.1.0: 479 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 480 | engines: {node: '>=8'} 481 | 482 | asynckit@0.4.0: 483 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 484 | 485 | babel-jest@27.5.1: 486 | resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} 487 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 488 | peerDependencies: 489 | '@babel/core': ^7.8.0 490 | 491 | babel-plugin-istanbul@6.1.1: 492 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 493 | engines: {node: '>=8'} 494 | 495 | babel-plugin-jest-hoist@27.5.1: 496 | resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} 497 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 498 | 499 | babel-preset-current-node-syntax@1.1.0: 500 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 501 | peerDependencies: 502 | '@babel/core': ^7.0.0 503 | 504 | babel-preset-jest@27.5.1: 505 | resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} 506 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 507 | peerDependencies: 508 | '@babel/core': ^7.0.0 509 | 510 | balanced-match@1.0.2: 511 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 512 | 513 | better-path-resolve@1.0.0: 514 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 515 | engines: {node: '>=4'} 516 | 517 | brace-expansion@1.1.12: 518 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 519 | 520 | brace-expansion@2.0.2: 521 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 522 | 523 | braces@3.0.3: 524 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 525 | engines: {node: '>=8'} 526 | 527 | browser-process-hrtime@1.0.0: 528 | resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} 529 | 530 | browserslist@4.25.0: 531 | resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} 532 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 533 | hasBin: true 534 | 535 | bs-logger@0.2.6: 536 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 537 | engines: {node: '>= 6'} 538 | 539 | bser@2.1.1: 540 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 541 | 542 | buffer-from@1.1.2: 543 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 544 | 545 | builtin-modules@1.1.1: 546 | resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} 547 | engines: {node: '>=0.10.0'} 548 | 549 | call-bind-apply-helpers@1.0.2: 550 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 551 | engines: {node: '>= 0.4'} 552 | 553 | call-bound@1.0.4: 554 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 555 | engines: {node: '>= 0.4'} 556 | 557 | callsites@3.1.0: 558 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 559 | engines: {node: '>=6'} 560 | 561 | camelcase@5.3.1: 562 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 563 | engines: {node: '>=6'} 564 | 565 | camelcase@6.3.0: 566 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 567 | engines: {node: '>=10'} 568 | 569 | caniuse-lite@1.0.30001724: 570 | resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} 571 | 572 | chalk@2.4.2: 573 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 574 | engines: {node: '>=4'} 575 | 576 | chalk@4.1.2: 577 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 578 | engines: {node: '>=10'} 579 | 580 | char-regex@1.0.2: 581 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 582 | engines: {node: '>=10'} 583 | 584 | chardet@0.7.0: 585 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 586 | 587 | ci-info@3.9.0: 588 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 589 | engines: {node: '>=8'} 590 | 591 | cjs-module-lexer@1.4.3: 592 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 593 | 594 | cliui@7.0.4: 595 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 596 | 597 | co@4.6.0: 598 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 599 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 600 | 601 | collect-v8-coverage@1.0.2: 602 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 603 | 604 | color-convert@1.9.3: 605 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 606 | 607 | color-convert@2.0.1: 608 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 609 | engines: {node: '>=7.0.0'} 610 | 611 | color-name@1.1.3: 612 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 613 | 614 | color-name@1.1.4: 615 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 616 | 617 | combined-stream@1.0.8: 618 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 619 | engines: {node: '>= 0.8'} 620 | 621 | commander@2.20.3: 622 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 623 | 624 | concat-map@0.0.1: 625 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 626 | 627 | convert-source-map@1.9.0: 628 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 629 | 630 | convert-source-map@2.0.0: 631 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 632 | 633 | cross-spawn@7.0.6: 634 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 635 | engines: {node: '>= 8'} 636 | 637 | cssom@0.3.8: 638 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 639 | 640 | cssom@0.4.4: 641 | resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} 642 | 643 | cssstyle@2.3.0: 644 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 645 | engines: {node: '>=8'} 646 | 647 | data-urls@2.0.0: 648 | resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} 649 | engines: {node: '>=10'} 650 | 651 | debug@4.4.1: 652 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 653 | engines: {node: '>=6.0'} 654 | peerDependencies: 655 | supports-color: '*' 656 | peerDependenciesMeta: 657 | supports-color: 658 | optional: true 659 | 660 | decimal.js@10.5.0: 661 | resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} 662 | 663 | dedent@0.7.0: 664 | resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} 665 | 666 | deepmerge@4.3.1: 667 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 668 | engines: {node: '>=0.10.0'} 669 | 670 | delayed-stream@1.0.0: 671 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 672 | engines: {node: '>=0.4.0'} 673 | 674 | detect-indent@6.1.0: 675 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 676 | engines: {node: '>=8'} 677 | 678 | detect-newline@3.1.0: 679 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 680 | engines: {node: '>=8'} 681 | 682 | diff-sequences@27.5.1: 683 | resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} 684 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 685 | 686 | diff@4.0.2: 687 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 688 | engines: {node: '>=0.3.1'} 689 | 690 | dir-glob@3.0.1: 691 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 692 | engines: {node: '>=8'} 693 | 694 | domexception@2.0.1: 695 | resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} 696 | engines: {node: '>=8'} 697 | deprecated: Use your platform's native DOMException instead 698 | 699 | dunder-proto@1.0.1: 700 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 701 | engines: {node: '>= 0.4'} 702 | 703 | electron-to-chromium@1.5.172: 704 | resolution: {integrity: sha512-fnKW9dGgmBfsebbYognQSv0CGGLFH1a5iV9EDYTBwmAQn+whbzHbLFlC+3XbHc8xaNtpO0etm8LOcRXs1qMRkQ==} 705 | 706 | emittery@0.8.1: 707 | resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} 708 | engines: {node: '>=10'} 709 | 710 | emoji-regex@8.0.0: 711 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 712 | 713 | enquirer@2.4.1: 714 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 715 | engines: {node: '>=8.6'} 716 | 717 | error-ex@1.3.2: 718 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 719 | 720 | es-define-property@1.0.1: 721 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 722 | engines: {node: '>= 0.4'} 723 | 724 | es-errors@1.3.0: 725 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 726 | engines: {node: '>= 0.4'} 727 | 728 | es-object-atoms@1.1.1: 729 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 730 | engines: {node: '>= 0.4'} 731 | 732 | es-set-tostringtag@2.1.0: 733 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 734 | engines: {node: '>= 0.4'} 735 | 736 | escalade@3.2.0: 737 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 738 | engines: {node: '>=6'} 739 | 740 | escape-string-regexp@1.0.5: 741 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 742 | engines: {node: '>=0.8.0'} 743 | 744 | escape-string-regexp@2.0.0: 745 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 746 | engines: {node: '>=8'} 747 | 748 | escodegen@2.1.0: 749 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 750 | engines: {node: '>=6.0'} 751 | hasBin: true 752 | 753 | esprima@4.0.1: 754 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 755 | engines: {node: '>=4'} 756 | hasBin: true 757 | 758 | estraverse@5.3.0: 759 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 760 | engines: {node: '>=4.0'} 761 | 762 | esutils@2.0.3: 763 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 764 | engines: {node: '>=0.10.0'} 765 | 766 | execa@5.1.1: 767 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 768 | engines: {node: '>=10'} 769 | 770 | exit@0.1.2: 771 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 772 | engines: {node: '>= 0.8.0'} 773 | 774 | expect@27.5.1: 775 | resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} 776 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 777 | 778 | extendable-error@0.1.7: 779 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 780 | 781 | external-editor@3.1.0: 782 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 783 | engines: {node: '>=4'} 784 | 785 | fast-glob@3.3.3: 786 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 787 | engines: {node: '>=8.6.0'} 788 | 789 | fast-json-stable-stringify@2.1.0: 790 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 791 | 792 | fastq@1.19.1: 793 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 794 | 795 | fb-watchman@2.0.2: 796 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 797 | 798 | fill-range@7.1.1: 799 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 800 | engines: {node: '>=8'} 801 | 802 | find-up@4.1.0: 803 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 804 | engines: {node: '>=8'} 805 | 806 | form-data@3.0.3: 807 | resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} 808 | engines: {node: '>= 6'} 809 | 810 | fs-extra@7.0.1: 811 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 812 | engines: {node: '>=6 <7 || >=8'} 813 | 814 | fs-extra@8.1.0: 815 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 816 | engines: {node: '>=6 <7 || >=8'} 817 | 818 | fs.realpath@1.0.0: 819 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 820 | 821 | fsevents@2.3.3: 822 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 823 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 824 | os: [darwin] 825 | 826 | function-bind@1.1.2: 827 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 828 | 829 | gensync@1.0.0-beta.2: 830 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 831 | engines: {node: '>=6.9.0'} 832 | 833 | get-caller-file@2.0.5: 834 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 835 | engines: {node: 6.* || 8.* || >= 10.*} 836 | 837 | get-intrinsic@1.3.0: 838 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 839 | engines: {node: '>= 0.4'} 840 | 841 | get-package-type@0.1.0: 842 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 843 | engines: {node: '>=8.0.0'} 844 | 845 | get-proto@1.0.1: 846 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 847 | engines: {node: '>= 0.4'} 848 | 849 | get-stream@6.0.1: 850 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 851 | engines: {node: '>=10'} 852 | 853 | glob-parent@5.1.2: 854 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 855 | engines: {node: '>= 6'} 856 | 857 | glob@7.2.3: 858 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 859 | deprecated: Glob versions prior to v9 are no longer supported 860 | 861 | glob@8.1.0: 862 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 863 | engines: {node: '>=12'} 864 | deprecated: Glob versions prior to v9 are no longer supported 865 | 866 | globals@11.12.0: 867 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 868 | engines: {node: '>=4'} 869 | 870 | globby@11.1.0: 871 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 872 | engines: {node: '>=10'} 873 | 874 | gopd@1.2.0: 875 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 876 | engines: {node: '>= 0.4'} 877 | 878 | graceful-fs@4.2.11: 879 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 880 | 881 | has-flag@3.0.0: 882 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 883 | engines: {node: '>=4'} 884 | 885 | has-flag@4.0.0: 886 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 887 | engines: {node: '>=8'} 888 | 889 | has-symbols@1.1.0: 890 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 891 | engines: {node: '>= 0.4'} 892 | 893 | has-tostringtag@1.0.2: 894 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 895 | engines: {node: '>= 0.4'} 896 | 897 | hasown@2.0.2: 898 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 899 | engines: {node: '>= 0.4'} 900 | 901 | html-encoding-sniffer@2.0.1: 902 | resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} 903 | engines: {node: '>=10'} 904 | 905 | html-escaper@2.0.2: 906 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 907 | 908 | http-proxy-agent@4.0.1: 909 | resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 910 | engines: {node: '>= 6'} 911 | 912 | https-proxy-agent@5.0.1: 913 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 914 | engines: {node: '>= 6'} 915 | 916 | human-id@4.1.1: 917 | resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} 918 | hasBin: true 919 | 920 | human-signals@2.1.0: 921 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 922 | engines: {node: '>=10.17.0'} 923 | 924 | iconv-lite@0.4.24: 925 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 926 | engines: {node: '>=0.10.0'} 927 | 928 | ignore@5.3.2: 929 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 930 | engines: {node: '>= 4'} 931 | 932 | import-local@3.2.0: 933 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 934 | engines: {node: '>=8'} 935 | hasBin: true 936 | 937 | imurmurhash@0.1.4: 938 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 939 | engines: {node: '>=0.8.19'} 940 | 941 | inflight@1.0.6: 942 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 943 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 944 | 945 | inherits@2.0.4: 946 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 947 | 948 | is-arrayish@0.2.1: 949 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 950 | 951 | is-core-module@2.16.1: 952 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 953 | engines: {node: '>= 0.4'} 954 | 955 | is-extglob@2.1.1: 956 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 957 | engines: {node: '>=0.10.0'} 958 | 959 | is-fullwidth-code-point@3.0.0: 960 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 961 | engines: {node: '>=8'} 962 | 963 | is-generator-fn@2.1.0: 964 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 965 | engines: {node: '>=6'} 966 | 967 | is-glob@4.0.3: 968 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 969 | engines: {node: '>=0.10.0'} 970 | 971 | is-number@7.0.0: 972 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 973 | engines: {node: '>=0.12.0'} 974 | 975 | is-potential-custom-element-name@1.0.1: 976 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 977 | 978 | is-stream@2.0.1: 979 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 980 | engines: {node: '>=8'} 981 | 982 | is-subdir@1.2.0: 983 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 984 | engines: {node: '>=4'} 985 | 986 | is-typedarray@1.0.0: 987 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 988 | 989 | is-windows@1.0.2: 990 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 991 | engines: {node: '>=0.10.0'} 992 | 993 | isexe@2.0.0: 994 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 995 | 996 | istanbul-lib-coverage@3.2.2: 997 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 998 | engines: {node: '>=8'} 999 | 1000 | istanbul-lib-instrument@5.2.1: 1001 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1002 | engines: {node: '>=8'} 1003 | 1004 | istanbul-lib-report@3.0.1: 1005 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1006 | engines: {node: '>=10'} 1007 | 1008 | istanbul-lib-source-maps@4.0.1: 1009 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1010 | engines: {node: '>=10'} 1011 | 1012 | istanbul-reports@3.1.7: 1013 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1014 | engines: {node: '>=8'} 1015 | 1016 | jest-changed-files@27.5.1: 1017 | resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} 1018 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1019 | 1020 | jest-circus@27.5.1: 1021 | resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} 1022 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1023 | 1024 | jest-cli@27.5.1: 1025 | resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} 1026 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1027 | hasBin: true 1028 | peerDependencies: 1029 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1030 | peerDependenciesMeta: 1031 | node-notifier: 1032 | optional: true 1033 | 1034 | jest-config@27.5.1: 1035 | resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} 1036 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1037 | peerDependencies: 1038 | ts-node: '>=9.0.0' 1039 | peerDependenciesMeta: 1040 | ts-node: 1041 | optional: true 1042 | 1043 | jest-diff@27.5.1: 1044 | resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} 1045 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1046 | 1047 | jest-docblock@27.5.1: 1048 | resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} 1049 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1050 | 1051 | jest-each@27.5.1: 1052 | resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} 1053 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1054 | 1055 | jest-environment-jsdom@27.5.1: 1056 | resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} 1057 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1058 | 1059 | jest-environment-node@27.5.1: 1060 | resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} 1061 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1062 | 1063 | jest-get-type@27.5.1: 1064 | resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} 1065 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1066 | 1067 | jest-haste-map@27.5.1: 1068 | resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} 1069 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1070 | 1071 | jest-jasmine2@27.5.1: 1072 | resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} 1073 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1074 | 1075 | jest-leak-detector@27.5.1: 1076 | resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} 1077 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1078 | 1079 | jest-matcher-utils@27.5.1: 1080 | resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} 1081 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1082 | 1083 | jest-message-util@27.5.1: 1084 | resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} 1085 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1086 | 1087 | jest-mock@27.5.1: 1088 | resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} 1089 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1090 | 1091 | jest-pnp-resolver@1.2.3: 1092 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1093 | engines: {node: '>=6'} 1094 | peerDependencies: 1095 | jest-resolve: '*' 1096 | peerDependenciesMeta: 1097 | jest-resolve: 1098 | optional: true 1099 | 1100 | jest-regex-util@27.5.1: 1101 | resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} 1102 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1103 | 1104 | jest-resolve-dependencies@27.5.1: 1105 | resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} 1106 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1107 | 1108 | jest-resolve@27.5.1: 1109 | resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} 1110 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1111 | 1112 | jest-runner@27.5.1: 1113 | resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} 1114 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1115 | 1116 | jest-runtime@27.5.1: 1117 | resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} 1118 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1119 | 1120 | jest-serializer@27.5.1: 1121 | resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} 1122 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1123 | 1124 | jest-snapshot@27.5.1: 1125 | resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} 1126 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1127 | 1128 | jest-util@27.5.1: 1129 | resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} 1130 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1131 | 1132 | jest-validate@27.5.1: 1133 | resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} 1134 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1135 | 1136 | jest-watcher@27.5.1: 1137 | resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} 1138 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1139 | 1140 | jest-worker@27.5.1: 1141 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 1142 | engines: {node: '>= 10.13.0'} 1143 | 1144 | jest@27.5.1: 1145 | resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} 1146 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1147 | hasBin: true 1148 | peerDependencies: 1149 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1150 | peerDependenciesMeta: 1151 | node-notifier: 1152 | optional: true 1153 | 1154 | js-tokens@4.0.0: 1155 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1156 | 1157 | js-yaml@3.14.1: 1158 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1159 | hasBin: true 1160 | 1161 | jsdom@16.7.0: 1162 | resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} 1163 | engines: {node: '>=10'} 1164 | peerDependencies: 1165 | canvas: ^2.5.0 1166 | peerDependenciesMeta: 1167 | canvas: 1168 | optional: true 1169 | 1170 | jsesc@3.1.0: 1171 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1172 | engines: {node: '>=6'} 1173 | hasBin: true 1174 | 1175 | json-parse-even-better-errors@2.3.1: 1176 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1177 | 1178 | json5@2.2.3: 1179 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1180 | engines: {node: '>=6'} 1181 | hasBin: true 1182 | 1183 | jsonc-parser@3.3.1: 1184 | resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} 1185 | 1186 | jsonfile@4.0.0: 1187 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1188 | 1189 | kleur@3.0.3: 1190 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1191 | engines: {node: '>=6'} 1192 | 1193 | leven@3.1.0: 1194 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1195 | engines: {node: '>=6'} 1196 | 1197 | lines-and-columns@1.2.4: 1198 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1199 | 1200 | locate-path@5.0.0: 1201 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1202 | engines: {node: '>=8'} 1203 | 1204 | lodash.memoize@4.1.2: 1205 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 1206 | 1207 | lodash.startcase@4.4.0: 1208 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 1209 | 1210 | lodash@4.17.21: 1211 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1212 | 1213 | lru-cache@5.1.1: 1214 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1215 | 1216 | lunr@2.3.9: 1217 | resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} 1218 | 1219 | make-dir@4.0.0: 1220 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1221 | engines: {node: '>=10'} 1222 | 1223 | make-error@1.3.6: 1224 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1225 | 1226 | makeerror@1.0.12: 1227 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1228 | 1229 | marked@4.3.0: 1230 | resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} 1231 | engines: {node: '>= 12'} 1232 | hasBin: true 1233 | 1234 | math-intrinsics@1.1.0: 1235 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1236 | engines: {node: '>= 0.4'} 1237 | 1238 | merge-stream@2.0.0: 1239 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1240 | 1241 | merge2@1.4.1: 1242 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1243 | engines: {node: '>= 8'} 1244 | 1245 | micromatch@4.0.8: 1246 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1247 | engines: {node: '>=8.6'} 1248 | 1249 | mime-db@1.52.0: 1250 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1251 | engines: {node: '>= 0.6'} 1252 | 1253 | mime-types@2.1.35: 1254 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1255 | engines: {node: '>= 0.6'} 1256 | 1257 | mimic-fn@2.1.0: 1258 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1259 | engines: {node: '>=6'} 1260 | 1261 | minimatch@3.1.2: 1262 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1263 | 1264 | minimatch@5.1.6: 1265 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1266 | engines: {node: '>=10'} 1267 | 1268 | minimist@1.2.8: 1269 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1270 | 1271 | mkdirp@0.5.6: 1272 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1273 | hasBin: true 1274 | 1275 | mri@1.2.0: 1276 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1277 | engines: {node: '>=4'} 1278 | 1279 | ms@2.1.3: 1280 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1281 | 1282 | natural-compare@1.4.0: 1283 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1284 | 1285 | node-int64@0.4.0: 1286 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1287 | 1288 | node-releases@2.0.19: 1289 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1290 | 1291 | normalize-path@3.0.0: 1292 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1293 | engines: {node: '>=0.10.0'} 1294 | 1295 | npm-run-path@4.0.1: 1296 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1297 | engines: {node: '>=8'} 1298 | 1299 | nwsapi@2.2.20: 1300 | resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} 1301 | 1302 | object-inspect@1.13.4: 1303 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1304 | engines: {node: '>= 0.4'} 1305 | 1306 | once@1.4.0: 1307 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1308 | 1309 | onetime@5.1.2: 1310 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1311 | engines: {node: '>=6'} 1312 | 1313 | os-tmpdir@1.0.2: 1314 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1315 | engines: {node: '>=0.10.0'} 1316 | 1317 | outdent@0.5.0: 1318 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 1319 | 1320 | p-filter@2.1.0: 1321 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 1322 | engines: {node: '>=8'} 1323 | 1324 | p-limit@2.3.0: 1325 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1326 | engines: {node: '>=6'} 1327 | 1328 | p-locate@4.1.0: 1329 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1330 | engines: {node: '>=8'} 1331 | 1332 | p-map@2.1.0: 1333 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 1334 | engines: {node: '>=6'} 1335 | 1336 | p-try@2.2.0: 1337 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1338 | engines: {node: '>=6'} 1339 | 1340 | package-manager-detector@0.2.11: 1341 | resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} 1342 | 1343 | parse-json@5.2.0: 1344 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1345 | engines: {node: '>=8'} 1346 | 1347 | parse5@6.0.1: 1348 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 1349 | 1350 | path-exists@4.0.0: 1351 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1352 | engines: {node: '>=8'} 1353 | 1354 | path-is-absolute@1.0.1: 1355 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1356 | engines: {node: '>=0.10.0'} 1357 | 1358 | path-key@3.1.1: 1359 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1360 | engines: {node: '>=8'} 1361 | 1362 | path-parse@1.0.7: 1363 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1364 | 1365 | path-type@4.0.0: 1366 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1367 | engines: {node: '>=8'} 1368 | 1369 | picocolors@1.1.1: 1370 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1371 | 1372 | picomatch@2.3.1: 1373 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1374 | engines: {node: '>=8.6'} 1375 | 1376 | pify@4.0.1: 1377 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 1378 | engines: {node: '>=6'} 1379 | 1380 | pirates@4.0.7: 1381 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1382 | engines: {node: '>= 6'} 1383 | 1384 | pkg-dir@4.2.0: 1385 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1386 | engines: {node: '>=8'} 1387 | 1388 | prettier@1.19.1: 1389 | resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} 1390 | engines: {node: '>=4'} 1391 | hasBin: true 1392 | 1393 | prettier@2.8.8: 1394 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1395 | engines: {node: '>=10.13.0'} 1396 | hasBin: true 1397 | 1398 | pretty-format@27.5.1: 1399 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 1400 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1401 | 1402 | prompts@2.4.2: 1403 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1404 | engines: {node: '>= 6'} 1405 | 1406 | psl@1.15.0: 1407 | resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} 1408 | 1409 | punycode@2.3.1: 1410 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1411 | engines: {node: '>=6'} 1412 | 1413 | qs@6.14.0: 1414 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 1415 | engines: {node: '>=0.6'} 1416 | 1417 | quansync@0.2.10: 1418 | resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} 1419 | 1420 | querystringify@2.2.0: 1421 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 1422 | 1423 | queue-microtask@1.2.3: 1424 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1425 | 1426 | react-is@17.0.2: 1427 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 1428 | 1429 | read-yaml-file@1.1.0: 1430 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 1431 | engines: {node: '>=6'} 1432 | 1433 | require-directory@2.1.1: 1434 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1435 | engines: {node: '>=0.10.0'} 1436 | 1437 | requires-port@1.0.0: 1438 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 1439 | 1440 | resolve-cwd@3.0.0: 1441 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1442 | engines: {node: '>=8'} 1443 | 1444 | resolve-from@5.0.0: 1445 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1446 | engines: {node: '>=8'} 1447 | 1448 | resolve.exports@1.1.1: 1449 | resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} 1450 | engines: {node: '>=10'} 1451 | 1452 | resolve@1.22.10: 1453 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1454 | engines: {node: '>= 0.4'} 1455 | hasBin: true 1456 | 1457 | reusify@1.1.0: 1458 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1459 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1460 | 1461 | rimraf@3.0.2: 1462 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1463 | deprecated: Rimraf versions prior to v4 are no longer supported 1464 | hasBin: true 1465 | 1466 | run-parallel@1.2.0: 1467 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1468 | 1469 | safer-buffer@2.1.2: 1470 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1471 | 1472 | saxes@5.0.1: 1473 | resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} 1474 | engines: {node: '>=10'} 1475 | 1476 | semver@5.7.2: 1477 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1478 | hasBin: true 1479 | 1480 | semver@6.3.1: 1481 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1482 | hasBin: true 1483 | 1484 | semver@7.7.2: 1485 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1486 | engines: {node: '>=10'} 1487 | hasBin: true 1488 | 1489 | shebang-command@2.0.0: 1490 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1491 | engines: {node: '>=8'} 1492 | 1493 | shebang-regex@3.0.0: 1494 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1495 | engines: {node: '>=8'} 1496 | 1497 | shiki@0.10.1: 1498 | resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} 1499 | 1500 | side-channel-list@1.0.0: 1501 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1502 | engines: {node: '>= 0.4'} 1503 | 1504 | side-channel-map@1.0.1: 1505 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1506 | engines: {node: '>= 0.4'} 1507 | 1508 | side-channel-weakmap@1.0.2: 1509 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1510 | engines: {node: '>= 0.4'} 1511 | 1512 | side-channel@1.1.0: 1513 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1514 | engines: {node: '>= 0.4'} 1515 | 1516 | signal-exit@3.0.7: 1517 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1518 | 1519 | signal-exit@4.1.0: 1520 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1521 | engines: {node: '>=14'} 1522 | 1523 | sisteransi@1.0.5: 1524 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1525 | 1526 | slash@3.0.0: 1527 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1528 | engines: {node: '>=8'} 1529 | 1530 | source-map-support@0.5.21: 1531 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1532 | 1533 | source-map@0.6.1: 1534 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1535 | engines: {node: '>=0.10.0'} 1536 | 1537 | source-map@0.7.4: 1538 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 1539 | engines: {node: '>= 8'} 1540 | 1541 | spawndamnit@3.0.1: 1542 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 1543 | 1544 | sprintf-js@1.0.3: 1545 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1546 | 1547 | stack-utils@2.0.6: 1548 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1549 | engines: {node: '>=10'} 1550 | 1551 | string-length@4.0.2: 1552 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1553 | engines: {node: '>=10'} 1554 | 1555 | string-width@4.2.3: 1556 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1557 | engines: {node: '>=8'} 1558 | 1559 | strip-ansi@6.0.1: 1560 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1561 | engines: {node: '>=8'} 1562 | 1563 | strip-bom@3.0.0: 1564 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1565 | engines: {node: '>=4'} 1566 | 1567 | strip-bom@4.0.0: 1568 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1569 | engines: {node: '>=8'} 1570 | 1571 | strip-final-newline@2.0.0: 1572 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1573 | engines: {node: '>=6'} 1574 | 1575 | strip-json-comments@3.1.1: 1576 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1577 | engines: {node: '>=8'} 1578 | 1579 | supports-color@5.5.0: 1580 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1581 | engines: {node: '>=4'} 1582 | 1583 | supports-color@7.2.0: 1584 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1585 | engines: {node: '>=8'} 1586 | 1587 | supports-color@8.1.1: 1588 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1589 | engines: {node: '>=10'} 1590 | 1591 | supports-hyperlinks@2.3.0: 1592 | resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} 1593 | engines: {node: '>=8'} 1594 | 1595 | supports-preserve-symlinks-flag@1.0.0: 1596 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1597 | engines: {node: '>= 0.4'} 1598 | 1599 | symbol-tree@3.2.4: 1600 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 1601 | 1602 | term-size@2.2.1: 1603 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1604 | engines: {node: '>=8'} 1605 | 1606 | terminal-link@2.1.1: 1607 | resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} 1608 | engines: {node: '>=8'} 1609 | 1610 | test-exclude@6.0.0: 1611 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1612 | engines: {node: '>=8'} 1613 | 1614 | throat@6.0.2: 1615 | resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} 1616 | 1617 | tmp@0.0.33: 1618 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1619 | engines: {node: '>=0.6.0'} 1620 | 1621 | tmpl@1.0.5: 1622 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1623 | 1624 | to-regex-range@5.0.1: 1625 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1626 | engines: {node: '>=8.0'} 1627 | 1628 | tough-cookie@4.1.4: 1629 | resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} 1630 | engines: {node: '>=6'} 1631 | 1632 | tr46@2.1.0: 1633 | resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} 1634 | engines: {node: '>=8'} 1635 | 1636 | ts-jest@27.1.5: 1637 | resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} 1638 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1639 | hasBin: true 1640 | peerDependencies: 1641 | '@babel/core': '>=7.0.0-beta.0 <8' 1642 | '@types/jest': ^27.0.0 1643 | babel-jest: '>=27.0.0 <28' 1644 | esbuild: '*' 1645 | jest: ^27.0.0 1646 | typescript: '>=3.8 <5.0' 1647 | peerDependenciesMeta: 1648 | '@babel/core': 1649 | optional: true 1650 | '@types/jest': 1651 | optional: true 1652 | babel-jest: 1653 | optional: true 1654 | esbuild: 1655 | optional: true 1656 | 1657 | tslib@1.14.1: 1658 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1659 | 1660 | tslint-config-prettier@1.18.0: 1661 | resolution: {integrity: sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==} 1662 | engines: {node: '>=4.0.0'} 1663 | hasBin: true 1664 | 1665 | tslint@6.1.3: 1666 | resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} 1667 | engines: {node: '>=4.8.0'} 1668 | deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information. 1669 | hasBin: true 1670 | peerDependencies: 1671 | typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev' 1672 | 1673 | tsutils@2.29.0: 1674 | resolution: {integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==} 1675 | peerDependencies: 1676 | typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' 1677 | 1678 | type-detect@4.0.8: 1679 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1680 | engines: {node: '>=4'} 1681 | 1682 | type-fest@0.21.3: 1683 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1684 | engines: {node: '>=10'} 1685 | 1686 | typedarray-to-buffer@3.1.5: 1687 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1688 | 1689 | typedoc@0.22.18: 1690 | resolution: {integrity: sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA==} 1691 | engines: {node: '>= 12.10.0'} 1692 | hasBin: true 1693 | peerDependencies: 1694 | typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x 1695 | 1696 | typescript@4.9.5: 1697 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1698 | engines: {node: '>=4.2.0'} 1699 | hasBin: true 1700 | 1701 | undici-types@7.8.0: 1702 | resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} 1703 | 1704 | universalify@0.1.2: 1705 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1706 | engines: {node: '>= 4.0.0'} 1707 | 1708 | universalify@0.2.0: 1709 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 1710 | engines: {node: '>= 4.0.0'} 1711 | 1712 | update-browserslist-db@1.1.3: 1713 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1714 | hasBin: true 1715 | peerDependencies: 1716 | browserslist: '>= 4.21.0' 1717 | 1718 | url-parse@1.5.10: 1719 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 1720 | 1721 | v8-to-istanbul@8.1.1: 1722 | resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} 1723 | engines: {node: '>=10.12.0'} 1724 | 1725 | vscode-oniguruma@1.7.0: 1726 | resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} 1727 | 1728 | vscode-textmate@5.2.0: 1729 | resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} 1730 | 1731 | w3c-hr-time@1.0.2: 1732 | resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} 1733 | deprecated: Use your platform's native performance.now() and performance.timeOrigin. 1734 | 1735 | w3c-xmlserializer@2.0.0: 1736 | resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} 1737 | engines: {node: '>=10'} 1738 | 1739 | walker@1.0.8: 1740 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1741 | 1742 | webidl-conversions@5.0.0: 1743 | resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} 1744 | engines: {node: '>=8'} 1745 | 1746 | webidl-conversions@6.1.0: 1747 | resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} 1748 | engines: {node: '>=10.4'} 1749 | 1750 | whatwg-encoding@1.0.5: 1751 | resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} 1752 | 1753 | whatwg-mimetype@2.3.0: 1754 | resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} 1755 | 1756 | whatwg-url@8.7.0: 1757 | resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} 1758 | engines: {node: '>=10'} 1759 | 1760 | which@2.0.2: 1761 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1762 | engines: {node: '>= 8'} 1763 | hasBin: true 1764 | 1765 | wrap-ansi@7.0.0: 1766 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1767 | engines: {node: '>=10'} 1768 | 1769 | wrappy@1.0.2: 1770 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1771 | 1772 | write-file-atomic@3.0.3: 1773 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1774 | 1775 | ws@7.5.10: 1776 | resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} 1777 | engines: {node: '>=8.3.0'} 1778 | peerDependencies: 1779 | bufferutil: ^4.0.1 1780 | utf-8-validate: ^5.0.2 1781 | peerDependenciesMeta: 1782 | bufferutil: 1783 | optional: true 1784 | utf-8-validate: 1785 | optional: true 1786 | 1787 | xml-name-validator@3.0.0: 1788 | resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} 1789 | 1790 | xmlchars@2.2.0: 1791 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 1792 | 1793 | y18n@5.0.8: 1794 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1795 | engines: {node: '>=10'} 1796 | 1797 | yallist@3.1.1: 1798 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1799 | 1800 | yargs-parser@20.2.9: 1801 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1802 | engines: {node: '>=10'} 1803 | 1804 | yargs@16.2.0: 1805 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1806 | engines: {node: '>=10'} 1807 | 1808 | snapshots: 1809 | 1810 | '@ampproject/remapping@2.3.0': 1811 | dependencies: 1812 | '@jridgewell/gen-mapping': 0.3.8 1813 | '@jridgewell/trace-mapping': 0.3.25 1814 | 1815 | '@babel/code-frame@7.27.1': 1816 | dependencies: 1817 | '@babel/helper-validator-identifier': 7.27.1 1818 | js-tokens: 4.0.0 1819 | picocolors: 1.1.1 1820 | 1821 | '@babel/compat-data@7.27.5': {} 1822 | 1823 | '@babel/core@7.27.4': 1824 | dependencies: 1825 | '@ampproject/remapping': 2.3.0 1826 | '@babel/code-frame': 7.27.1 1827 | '@babel/generator': 7.27.5 1828 | '@babel/helper-compilation-targets': 7.27.2 1829 | '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) 1830 | '@babel/helpers': 7.27.6 1831 | '@babel/parser': 7.27.5 1832 | '@babel/template': 7.27.2 1833 | '@babel/traverse': 7.27.4 1834 | '@babel/types': 7.27.6 1835 | convert-source-map: 2.0.0 1836 | debug: 4.4.1 1837 | gensync: 1.0.0-beta.2 1838 | json5: 2.2.3 1839 | semver: 6.3.1 1840 | transitivePeerDependencies: 1841 | - supports-color 1842 | 1843 | '@babel/generator@7.27.5': 1844 | dependencies: 1845 | '@babel/parser': 7.27.5 1846 | '@babel/types': 7.27.6 1847 | '@jridgewell/gen-mapping': 0.3.8 1848 | '@jridgewell/trace-mapping': 0.3.25 1849 | jsesc: 3.1.0 1850 | 1851 | '@babel/helper-compilation-targets@7.27.2': 1852 | dependencies: 1853 | '@babel/compat-data': 7.27.5 1854 | '@babel/helper-validator-option': 7.27.1 1855 | browserslist: 4.25.0 1856 | lru-cache: 5.1.1 1857 | semver: 6.3.1 1858 | 1859 | '@babel/helper-module-imports@7.27.1': 1860 | dependencies: 1861 | '@babel/traverse': 7.27.4 1862 | '@babel/types': 7.27.6 1863 | transitivePeerDependencies: 1864 | - supports-color 1865 | 1866 | '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': 1867 | dependencies: 1868 | '@babel/core': 7.27.4 1869 | '@babel/helper-module-imports': 7.27.1 1870 | '@babel/helper-validator-identifier': 7.27.1 1871 | '@babel/traverse': 7.27.4 1872 | transitivePeerDependencies: 1873 | - supports-color 1874 | 1875 | '@babel/helper-plugin-utils@7.27.1': {} 1876 | 1877 | '@babel/helper-string-parser@7.27.1': {} 1878 | 1879 | '@babel/helper-validator-identifier@7.27.1': {} 1880 | 1881 | '@babel/helper-validator-option@7.27.1': {} 1882 | 1883 | '@babel/helpers@7.27.6': 1884 | dependencies: 1885 | '@babel/template': 7.27.2 1886 | '@babel/types': 7.27.6 1887 | 1888 | '@babel/parser@7.27.5': 1889 | dependencies: 1890 | '@babel/types': 7.27.6 1891 | 1892 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': 1893 | dependencies: 1894 | '@babel/core': 7.27.4 1895 | '@babel/helper-plugin-utils': 7.27.1 1896 | 1897 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': 1898 | dependencies: 1899 | '@babel/core': 7.27.4 1900 | '@babel/helper-plugin-utils': 7.27.1 1901 | 1902 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': 1903 | dependencies: 1904 | '@babel/core': 7.27.4 1905 | '@babel/helper-plugin-utils': 7.27.1 1906 | 1907 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': 1908 | dependencies: 1909 | '@babel/core': 7.27.4 1910 | '@babel/helper-plugin-utils': 7.27.1 1911 | 1912 | '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': 1913 | dependencies: 1914 | '@babel/core': 7.27.4 1915 | '@babel/helper-plugin-utils': 7.27.1 1916 | 1917 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': 1918 | dependencies: 1919 | '@babel/core': 7.27.4 1920 | '@babel/helper-plugin-utils': 7.27.1 1921 | 1922 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': 1923 | dependencies: 1924 | '@babel/core': 7.27.4 1925 | '@babel/helper-plugin-utils': 7.27.1 1926 | 1927 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': 1928 | dependencies: 1929 | '@babel/core': 7.27.4 1930 | '@babel/helper-plugin-utils': 7.27.1 1931 | 1932 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': 1933 | dependencies: 1934 | '@babel/core': 7.27.4 1935 | '@babel/helper-plugin-utils': 7.27.1 1936 | 1937 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': 1938 | dependencies: 1939 | '@babel/core': 7.27.4 1940 | '@babel/helper-plugin-utils': 7.27.1 1941 | 1942 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': 1943 | dependencies: 1944 | '@babel/core': 7.27.4 1945 | '@babel/helper-plugin-utils': 7.27.1 1946 | 1947 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': 1948 | dependencies: 1949 | '@babel/core': 7.27.4 1950 | '@babel/helper-plugin-utils': 7.27.1 1951 | 1952 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': 1953 | dependencies: 1954 | '@babel/core': 7.27.4 1955 | '@babel/helper-plugin-utils': 7.27.1 1956 | 1957 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': 1958 | dependencies: 1959 | '@babel/core': 7.27.4 1960 | '@babel/helper-plugin-utils': 7.27.1 1961 | 1962 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': 1963 | dependencies: 1964 | '@babel/core': 7.27.4 1965 | '@babel/helper-plugin-utils': 7.27.1 1966 | 1967 | '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': 1968 | dependencies: 1969 | '@babel/core': 7.27.4 1970 | '@babel/helper-plugin-utils': 7.27.1 1971 | 1972 | '@babel/runtime@7.27.6': {} 1973 | 1974 | '@babel/template@7.27.2': 1975 | dependencies: 1976 | '@babel/code-frame': 7.27.1 1977 | '@babel/parser': 7.27.5 1978 | '@babel/types': 7.27.6 1979 | 1980 | '@babel/traverse@7.27.4': 1981 | dependencies: 1982 | '@babel/code-frame': 7.27.1 1983 | '@babel/generator': 7.27.5 1984 | '@babel/parser': 7.27.5 1985 | '@babel/template': 7.27.2 1986 | '@babel/types': 7.27.6 1987 | debug: 4.4.1 1988 | globals: 11.12.0 1989 | transitivePeerDependencies: 1990 | - supports-color 1991 | 1992 | '@babel/types@7.27.6': 1993 | dependencies: 1994 | '@babel/helper-string-parser': 7.27.1 1995 | '@babel/helper-validator-identifier': 7.27.1 1996 | 1997 | '@bcoe/v8-coverage@0.2.3': {} 1998 | 1999 | '@changesets/apply-release-plan@7.0.12': 2000 | dependencies: 2001 | '@changesets/config': 3.1.1 2002 | '@changesets/get-version-range-type': 0.4.0 2003 | '@changesets/git': 3.0.4 2004 | '@changesets/should-skip-package': 0.1.2 2005 | '@changesets/types': 6.1.0 2006 | '@manypkg/get-packages': 1.1.3 2007 | detect-indent: 6.1.0 2008 | fs-extra: 7.0.1 2009 | lodash.startcase: 4.4.0 2010 | outdent: 0.5.0 2011 | prettier: 2.8.8 2012 | resolve-from: 5.0.0 2013 | semver: 7.7.2 2014 | 2015 | '@changesets/assemble-release-plan@6.0.9': 2016 | dependencies: 2017 | '@changesets/errors': 0.2.0 2018 | '@changesets/get-dependents-graph': 2.1.3 2019 | '@changesets/should-skip-package': 0.1.2 2020 | '@changesets/types': 6.1.0 2021 | '@manypkg/get-packages': 1.1.3 2022 | semver: 7.7.2 2023 | 2024 | '@changesets/changelog-git@0.2.1': 2025 | dependencies: 2026 | '@changesets/types': 6.1.0 2027 | 2028 | '@changesets/cli@2.29.5': 2029 | dependencies: 2030 | '@changesets/apply-release-plan': 7.0.12 2031 | '@changesets/assemble-release-plan': 6.0.9 2032 | '@changesets/changelog-git': 0.2.1 2033 | '@changesets/config': 3.1.1 2034 | '@changesets/errors': 0.2.0 2035 | '@changesets/get-dependents-graph': 2.1.3 2036 | '@changesets/get-release-plan': 4.0.13 2037 | '@changesets/git': 3.0.4 2038 | '@changesets/logger': 0.1.1 2039 | '@changesets/pre': 2.0.2 2040 | '@changesets/read': 0.6.5 2041 | '@changesets/should-skip-package': 0.1.2 2042 | '@changesets/types': 6.1.0 2043 | '@changesets/write': 0.4.0 2044 | '@manypkg/get-packages': 1.1.3 2045 | ansi-colors: 4.1.3 2046 | ci-info: 3.9.0 2047 | enquirer: 2.4.1 2048 | external-editor: 3.1.0 2049 | fs-extra: 7.0.1 2050 | mri: 1.2.0 2051 | p-limit: 2.3.0 2052 | package-manager-detector: 0.2.11 2053 | picocolors: 1.1.1 2054 | resolve-from: 5.0.0 2055 | semver: 7.7.2 2056 | spawndamnit: 3.0.1 2057 | term-size: 2.2.1 2058 | 2059 | '@changesets/config@3.1.1': 2060 | dependencies: 2061 | '@changesets/errors': 0.2.0 2062 | '@changesets/get-dependents-graph': 2.1.3 2063 | '@changesets/logger': 0.1.1 2064 | '@changesets/types': 6.1.0 2065 | '@manypkg/get-packages': 1.1.3 2066 | fs-extra: 7.0.1 2067 | micromatch: 4.0.8 2068 | 2069 | '@changesets/errors@0.2.0': 2070 | dependencies: 2071 | extendable-error: 0.1.7 2072 | 2073 | '@changesets/get-dependents-graph@2.1.3': 2074 | dependencies: 2075 | '@changesets/types': 6.1.0 2076 | '@manypkg/get-packages': 1.1.3 2077 | picocolors: 1.1.1 2078 | semver: 7.7.2 2079 | 2080 | '@changesets/get-release-plan@4.0.13': 2081 | dependencies: 2082 | '@changesets/assemble-release-plan': 6.0.9 2083 | '@changesets/config': 3.1.1 2084 | '@changesets/pre': 2.0.2 2085 | '@changesets/read': 0.6.5 2086 | '@changesets/types': 6.1.0 2087 | '@manypkg/get-packages': 1.1.3 2088 | 2089 | '@changesets/get-version-range-type@0.4.0': {} 2090 | 2091 | '@changesets/git@3.0.4': 2092 | dependencies: 2093 | '@changesets/errors': 0.2.0 2094 | '@manypkg/get-packages': 1.1.3 2095 | is-subdir: 1.2.0 2096 | micromatch: 4.0.8 2097 | spawndamnit: 3.0.1 2098 | 2099 | '@changesets/logger@0.1.1': 2100 | dependencies: 2101 | picocolors: 1.1.1 2102 | 2103 | '@changesets/parse@0.4.1': 2104 | dependencies: 2105 | '@changesets/types': 6.1.0 2106 | js-yaml: 3.14.1 2107 | 2108 | '@changesets/pre@2.0.2': 2109 | dependencies: 2110 | '@changesets/errors': 0.2.0 2111 | '@changesets/types': 6.1.0 2112 | '@manypkg/get-packages': 1.1.3 2113 | fs-extra: 7.0.1 2114 | 2115 | '@changesets/read@0.6.5': 2116 | dependencies: 2117 | '@changesets/git': 3.0.4 2118 | '@changesets/logger': 0.1.1 2119 | '@changesets/parse': 0.4.1 2120 | '@changesets/types': 6.1.0 2121 | fs-extra: 7.0.1 2122 | p-filter: 2.1.0 2123 | picocolors: 1.1.1 2124 | 2125 | '@changesets/should-skip-package@0.1.2': 2126 | dependencies: 2127 | '@changesets/types': 6.1.0 2128 | '@manypkg/get-packages': 1.1.3 2129 | 2130 | '@changesets/types@4.1.0': {} 2131 | 2132 | '@changesets/types@6.1.0': {} 2133 | 2134 | '@changesets/write@0.4.0': 2135 | dependencies: 2136 | '@changesets/types': 6.1.0 2137 | fs-extra: 7.0.1 2138 | human-id: 4.1.1 2139 | prettier: 2.8.8 2140 | 2141 | '@istanbuljs/load-nyc-config@1.1.0': 2142 | dependencies: 2143 | camelcase: 5.3.1 2144 | find-up: 4.1.0 2145 | get-package-type: 0.1.0 2146 | js-yaml: 3.14.1 2147 | resolve-from: 5.0.0 2148 | 2149 | '@istanbuljs/schema@0.1.3': {} 2150 | 2151 | '@jest/console@27.5.1': 2152 | dependencies: 2153 | '@jest/types': 27.5.1 2154 | '@types/node': 24.0.3 2155 | chalk: 4.1.2 2156 | jest-message-util: 27.5.1 2157 | jest-util: 27.5.1 2158 | slash: 3.0.0 2159 | 2160 | '@jest/core@27.5.1': 2161 | dependencies: 2162 | '@jest/console': 27.5.1 2163 | '@jest/reporters': 27.5.1 2164 | '@jest/test-result': 27.5.1 2165 | '@jest/transform': 27.5.1 2166 | '@jest/types': 27.5.1 2167 | '@types/node': 24.0.3 2168 | ansi-escapes: 4.3.2 2169 | chalk: 4.1.2 2170 | emittery: 0.8.1 2171 | exit: 0.1.2 2172 | graceful-fs: 4.2.11 2173 | jest-changed-files: 27.5.1 2174 | jest-config: 27.5.1 2175 | jest-haste-map: 27.5.1 2176 | jest-message-util: 27.5.1 2177 | jest-regex-util: 27.5.1 2178 | jest-resolve: 27.5.1 2179 | jest-resolve-dependencies: 27.5.1 2180 | jest-runner: 27.5.1 2181 | jest-runtime: 27.5.1 2182 | jest-snapshot: 27.5.1 2183 | jest-util: 27.5.1 2184 | jest-validate: 27.5.1 2185 | jest-watcher: 27.5.1 2186 | micromatch: 4.0.8 2187 | rimraf: 3.0.2 2188 | slash: 3.0.0 2189 | strip-ansi: 6.0.1 2190 | transitivePeerDependencies: 2191 | - bufferutil 2192 | - canvas 2193 | - supports-color 2194 | - ts-node 2195 | - utf-8-validate 2196 | 2197 | '@jest/environment@27.5.1': 2198 | dependencies: 2199 | '@jest/fake-timers': 27.5.1 2200 | '@jest/types': 27.5.1 2201 | '@types/node': 24.0.3 2202 | jest-mock: 27.5.1 2203 | 2204 | '@jest/fake-timers@27.5.1': 2205 | dependencies: 2206 | '@jest/types': 27.5.1 2207 | '@sinonjs/fake-timers': 8.1.0 2208 | '@types/node': 24.0.3 2209 | jest-message-util: 27.5.1 2210 | jest-mock: 27.5.1 2211 | jest-util: 27.5.1 2212 | 2213 | '@jest/globals@27.5.1': 2214 | dependencies: 2215 | '@jest/environment': 27.5.1 2216 | '@jest/types': 27.5.1 2217 | expect: 27.5.1 2218 | 2219 | '@jest/reporters@27.5.1': 2220 | dependencies: 2221 | '@bcoe/v8-coverage': 0.2.3 2222 | '@jest/console': 27.5.1 2223 | '@jest/test-result': 27.5.1 2224 | '@jest/transform': 27.5.1 2225 | '@jest/types': 27.5.1 2226 | '@types/node': 24.0.3 2227 | chalk: 4.1.2 2228 | collect-v8-coverage: 1.0.2 2229 | exit: 0.1.2 2230 | glob: 7.2.3 2231 | graceful-fs: 4.2.11 2232 | istanbul-lib-coverage: 3.2.2 2233 | istanbul-lib-instrument: 5.2.1 2234 | istanbul-lib-report: 3.0.1 2235 | istanbul-lib-source-maps: 4.0.1 2236 | istanbul-reports: 3.1.7 2237 | jest-haste-map: 27.5.1 2238 | jest-resolve: 27.5.1 2239 | jest-util: 27.5.1 2240 | jest-worker: 27.5.1 2241 | slash: 3.0.0 2242 | source-map: 0.6.1 2243 | string-length: 4.0.2 2244 | terminal-link: 2.1.1 2245 | v8-to-istanbul: 8.1.1 2246 | transitivePeerDependencies: 2247 | - supports-color 2248 | 2249 | '@jest/source-map@27.5.1': 2250 | dependencies: 2251 | callsites: 3.1.0 2252 | graceful-fs: 4.2.11 2253 | source-map: 0.6.1 2254 | 2255 | '@jest/test-result@27.5.1': 2256 | dependencies: 2257 | '@jest/console': 27.5.1 2258 | '@jest/types': 27.5.1 2259 | '@types/istanbul-lib-coverage': 2.0.6 2260 | collect-v8-coverage: 1.0.2 2261 | 2262 | '@jest/test-sequencer@27.5.1': 2263 | dependencies: 2264 | '@jest/test-result': 27.5.1 2265 | graceful-fs: 4.2.11 2266 | jest-haste-map: 27.5.1 2267 | jest-runtime: 27.5.1 2268 | transitivePeerDependencies: 2269 | - supports-color 2270 | 2271 | '@jest/transform@27.5.1': 2272 | dependencies: 2273 | '@babel/core': 7.27.4 2274 | '@jest/types': 27.5.1 2275 | babel-plugin-istanbul: 6.1.1 2276 | chalk: 4.1.2 2277 | convert-source-map: 1.9.0 2278 | fast-json-stable-stringify: 2.1.0 2279 | graceful-fs: 4.2.11 2280 | jest-haste-map: 27.5.1 2281 | jest-regex-util: 27.5.1 2282 | jest-util: 27.5.1 2283 | micromatch: 4.0.8 2284 | pirates: 4.0.7 2285 | slash: 3.0.0 2286 | source-map: 0.6.1 2287 | write-file-atomic: 3.0.3 2288 | transitivePeerDependencies: 2289 | - supports-color 2290 | 2291 | '@jest/types@27.5.1': 2292 | dependencies: 2293 | '@types/istanbul-lib-coverage': 2.0.6 2294 | '@types/istanbul-reports': 3.0.4 2295 | '@types/node': 24.0.3 2296 | '@types/yargs': 16.0.9 2297 | chalk: 4.1.2 2298 | 2299 | '@jridgewell/gen-mapping@0.3.8': 2300 | dependencies: 2301 | '@jridgewell/set-array': 1.2.1 2302 | '@jridgewell/sourcemap-codec': 1.5.0 2303 | '@jridgewell/trace-mapping': 0.3.25 2304 | 2305 | '@jridgewell/resolve-uri@3.1.2': {} 2306 | 2307 | '@jridgewell/set-array@1.2.1': {} 2308 | 2309 | '@jridgewell/sourcemap-codec@1.5.0': {} 2310 | 2311 | '@jridgewell/trace-mapping@0.3.25': 2312 | dependencies: 2313 | '@jridgewell/resolve-uri': 3.1.2 2314 | '@jridgewell/sourcemap-codec': 1.5.0 2315 | 2316 | '@manypkg/find-root@1.1.0': 2317 | dependencies: 2318 | '@babel/runtime': 7.27.6 2319 | '@types/node': 12.20.55 2320 | find-up: 4.1.0 2321 | fs-extra: 8.1.0 2322 | 2323 | '@manypkg/get-packages@1.1.3': 2324 | dependencies: 2325 | '@babel/runtime': 7.27.6 2326 | '@changesets/types': 4.1.0 2327 | '@manypkg/find-root': 1.1.0 2328 | fs-extra: 8.1.0 2329 | globby: 11.1.0 2330 | read-yaml-file: 1.1.0 2331 | 2332 | '@nodelib/fs.scandir@2.1.5': 2333 | dependencies: 2334 | '@nodelib/fs.stat': 2.0.5 2335 | run-parallel: 1.2.0 2336 | 2337 | '@nodelib/fs.stat@2.0.5': {} 2338 | 2339 | '@nodelib/fs.walk@1.2.8': 2340 | dependencies: 2341 | '@nodelib/fs.scandir': 2.1.5 2342 | fastq: 1.19.1 2343 | 2344 | '@sinonjs/commons@1.8.6': 2345 | dependencies: 2346 | type-detect: 4.0.8 2347 | 2348 | '@sinonjs/fake-timers@8.1.0': 2349 | dependencies: 2350 | '@sinonjs/commons': 1.8.6 2351 | 2352 | '@tootallnate/once@1.1.2': {} 2353 | 2354 | '@types/babel__core@7.20.5': 2355 | dependencies: 2356 | '@babel/parser': 7.27.5 2357 | '@babel/types': 7.27.6 2358 | '@types/babel__generator': 7.27.0 2359 | '@types/babel__template': 7.4.4 2360 | '@types/babel__traverse': 7.20.7 2361 | 2362 | '@types/babel__generator@7.27.0': 2363 | dependencies: 2364 | '@babel/types': 7.27.6 2365 | 2366 | '@types/babel__template@7.4.4': 2367 | dependencies: 2368 | '@babel/parser': 7.27.5 2369 | '@babel/types': 7.27.6 2370 | 2371 | '@types/babel__traverse@7.20.7': 2372 | dependencies: 2373 | '@babel/types': 7.27.6 2374 | 2375 | '@types/graceful-fs@4.1.9': 2376 | dependencies: 2377 | '@types/node': 24.0.3 2378 | 2379 | '@types/istanbul-lib-coverage@2.0.6': {} 2380 | 2381 | '@types/istanbul-lib-report@3.0.3': 2382 | dependencies: 2383 | '@types/istanbul-lib-coverage': 2.0.6 2384 | 2385 | '@types/istanbul-reports@3.0.4': 2386 | dependencies: 2387 | '@types/istanbul-lib-report': 3.0.3 2388 | 2389 | '@types/jest@27.5.2': 2390 | dependencies: 2391 | jest-matcher-utils: 27.5.1 2392 | pretty-format: 27.5.1 2393 | 2394 | '@types/node@12.20.55': {} 2395 | 2396 | '@types/node@24.0.3': 2397 | dependencies: 2398 | undici-types: 7.8.0 2399 | 2400 | '@types/prettier@2.7.3': {} 2401 | 2402 | '@types/qs@6.14.0': {} 2403 | 2404 | '@types/stack-utils@2.0.3': {} 2405 | 2406 | '@types/yargs-parser@21.0.3': {} 2407 | 2408 | '@types/yargs@16.0.9': 2409 | dependencies: 2410 | '@types/yargs-parser': 21.0.3 2411 | 2412 | abab@2.0.6: {} 2413 | 2414 | acorn-globals@6.0.0: 2415 | dependencies: 2416 | acorn: 7.4.1 2417 | acorn-walk: 7.2.0 2418 | 2419 | acorn-walk@7.2.0: {} 2420 | 2421 | acorn@7.4.1: {} 2422 | 2423 | acorn@8.15.0: {} 2424 | 2425 | agent-base@6.0.2: 2426 | dependencies: 2427 | debug: 4.4.1 2428 | transitivePeerDependencies: 2429 | - supports-color 2430 | 2431 | ansi-colors@4.1.3: {} 2432 | 2433 | ansi-escapes@4.3.2: 2434 | dependencies: 2435 | type-fest: 0.21.3 2436 | 2437 | ansi-regex@5.0.1: {} 2438 | 2439 | ansi-styles@3.2.1: 2440 | dependencies: 2441 | color-convert: 1.9.3 2442 | 2443 | ansi-styles@4.3.0: 2444 | dependencies: 2445 | color-convert: 2.0.1 2446 | 2447 | ansi-styles@5.2.0: {} 2448 | 2449 | anymatch@3.1.3: 2450 | dependencies: 2451 | normalize-path: 3.0.0 2452 | picomatch: 2.3.1 2453 | 2454 | argparse@1.0.10: 2455 | dependencies: 2456 | sprintf-js: 1.0.3 2457 | 2458 | array-union@2.1.0: {} 2459 | 2460 | asynckit@0.4.0: {} 2461 | 2462 | babel-jest@27.5.1(@babel/core@7.27.4): 2463 | dependencies: 2464 | '@babel/core': 7.27.4 2465 | '@jest/transform': 27.5.1 2466 | '@jest/types': 27.5.1 2467 | '@types/babel__core': 7.20.5 2468 | babel-plugin-istanbul: 6.1.1 2469 | babel-preset-jest: 27.5.1(@babel/core@7.27.4) 2470 | chalk: 4.1.2 2471 | graceful-fs: 4.2.11 2472 | slash: 3.0.0 2473 | transitivePeerDependencies: 2474 | - supports-color 2475 | 2476 | babel-plugin-istanbul@6.1.1: 2477 | dependencies: 2478 | '@babel/helper-plugin-utils': 7.27.1 2479 | '@istanbuljs/load-nyc-config': 1.1.0 2480 | '@istanbuljs/schema': 0.1.3 2481 | istanbul-lib-instrument: 5.2.1 2482 | test-exclude: 6.0.0 2483 | transitivePeerDependencies: 2484 | - supports-color 2485 | 2486 | babel-plugin-jest-hoist@27.5.1: 2487 | dependencies: 2488 | '@babel/template': 7.27.2 2489 | '@babel/types': 7.27.6 2490 | '@types/babel__core': 7.20.5 2491 | '@types/babel__traverse': 7.20.7 2492 | 2493 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): 2494 | dependencies: 2495 | '@babel/core': 7.27.4 2496 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) 2497 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) 2498 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) 2499 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) 2500 | '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) 2501 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) 2502 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) 2503 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) 2504 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) 2505 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) 2506 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) 2507 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) 2508 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) 2509 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) 2510 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) 2511 | 2512 | babel-preset-jest@27.5.1(@babel/core@7.27.4): 2513 | dependencies: 2514 | '@babel/core': 7.27.4 2515 | babel-plugin-jest-hoist: 27.5.1 2516 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) 2517 | 2518 | balanced-match@1.0.2: {} 2519 | 2520 | better-path-resolve@1.0.0: 2521 | dependencies: 2522 | is-windows: 1.0.2 2523 | 2524 | brace-expansion@1.1.12: 2525 | dependencies: 2526 | balanced-match: 1.0.2 2527 | concat-map: 0.0.1 2528 | 2529 | brace-expansion@2.0.2: 2530 | dependencies: 2531 | balanced-match: 1.0.2 2532 | 2533 | braces@3.0.3: 2534 | dependencies: 2535 | fill-range: 7.1.1 2536 | 2537 | browser-process-hrtime@1.0.0: {} 2538 | 2539 | browserslist@4.25.0: 2540 | dependencies: 2541 | caniuse-lite: 1.0.30001724 2542 | electron-to-chromium: 1.5.172 2543 | node-releases: 2.0.19 2544 | update-browserslist-db: 1.1.3(browserslist@4.25.0) 2545 | 2546 | bs-logger@0.2.6: 2547 | dependencies: 2548 | fast-json-stable-stringify: 2.1.0 2549 | 2550 | bser@2.1.1: 2551 | dependencies: 2552 | node-int64: 0.4.0 2553 | 2554 | buffer-from@1.1.2: {} 2555 | 2556 | builtin-modules@1.1.1: {} 2557 | 2558 | call-bind-apply-helpers@1.0.2: 2559 | dependencies: 2560 | es-errors: 1.3.0 2561 | function-bind: 1.1.2 2562 | 2563 | call-bound@1.0.4: 2564 | dependencies: 2565 | call-bind-apply-helpers: 1.0.2 2566 | get-intrinsic: 1.3.0 2567 | 2568 | callsites@3.1.0: {} 2569 | 2570 | camelcase@5.3.1: {} 2571 | 2572 | camelcase@6.3.0: {} 2573 | 2574 | caniuse-lite@1.0.30001724: {} 2575 | 2576 | chalk@2.4.2: 2577 | dependencies: 2578 | ansi-styles: 3.2.1 2579 | escape-string-regexp: 1.0.5 2580 | supports-color: 5.5.0 2581 | 2582 | chalk@4.1.2: 2583 | dependencies: 2584 | ansi-styles: 4.3.0 2585 | supports-color: 7.2.0 2586 | 2587 | char-regex@1.0.2: {} 2588 | 2589 | chardet@0.7.0: {} 2590 | 2591 | ci-info@3.9.0: {} 2592 | 2593 | cjs-module-lexer@1.4.3: {} 2594 | 2595 | cliui@7.0.4: 2596 | dependencies: 2597 | string-width: 4.2.3 2598 | strip-ansi: 6.0.1 2599 | wrap-ansi: 7.0.0 2600 | 2601 | co@4.6.0: {} 2602 | 2603 | collect-v8-coverage@1.0.2: {} 2604 | 2605 | color-convert@1.9.3: 2606 | dependencies: 2607 | color-name: 1.1.3 2608 | 2609 | color-convert@2.0.1: 2610 | dependencies: 2611 | color-name: 1.1.4 2612 | 2613 | color-name@1.1.3: {} 2614 | 2615 | color-name@1.1.4: {} 2616 | 2617 | combined-stream@1.0.8: 2618 | dependencies: 2619 | delayed-stream: 1.0.0 2620 | 2621 | commander@2.20.3: {} 2622 | 2623 | concat-map@0.0.1: {} 2624 | 2625 | convert-source-map@1.9.0: {} 2626 | 2627 | convert-source-map@2.0.0: {} 2628 | 2629 | cross-spawn@7.0.6: 2630 | dependencies: 2631 | path-key: 3.1.1 2632 | shebang-command: 2.0.0 2633 | which: 2.0.2 2634 | 2635 | cssom@0.3.8: {} 2636 | 2637 | cssom@0.4.4: {} 2638 | 2639 | cssstyle@2.3.0: 2640 | dependencies: 2641 | cssom: 0.3.8 2642 | 2643 | data-urls@2.0.0: 2644 | dependencies: 2645 | abab: 2.0.6 2646 | whatwg-mimetype: 2.3.0 2647 | whatwg-url: 8.7.0 2648 | 2649 | debug@4.4.1: 2650 | dependencies: 2651 | ms: 2.1.3 2652 | 2653 | decimal.js@10.5.0: {} 2654 | 2655 | dedent@0.7.0: {} 2656 | 2657 | deepmerge@4.3.1: {} 2658 | 2659 | delayed-stream@1.0.0: {} 2660 | 2661 | detect-indent@6.1.0: {} 2662 | 2663 | detect-newline@3.1.0: {} 2664 | 2665 | diff-sequences@27.5.1: {} 2666 | 2667 | diff@4.0.2: {} 2668 | 2669 | dir-glob@3.0.1: 2670 | dependencies: 2671 | path-type: 4.0.0 2672 | 2673 | domexception@2.0.1: 2674 | dependencies: 2675 | webidl-conversions: 5.0.0 2676 | 2677 | dunder-proto@1.0.1: 2678 | dependencies: 2679 | call-bind-apply-helpers: 1.0.2 2680 | es-errors: 1.3.0 2681 | gopd: 1.2.0 2682 | 2683 | electron-to-chromium@1.5.172: {} 2684 | 2685 | emittery@0.8.1: {} 2686 | 2687 | emoji-regex@8.0.0: {} 2688 | 2689 | enquirer@2.4.1: 2690 | dependencies: 2691 | ansi-colors: 4.1.3 2692 | strip-ansi: 6.0.1 2693 | 2694 | error-ex@1.3.2: 2695 | dependencies: 2696 | is-arrayish: 0.2.1 2697 | 2698 | es-define-property@1.0.1: {} 2699 | 2700 | es-errors@1.3.0: {} 2701 | 2702 | es-object-atoms@1.1.1: 2703 | dependencies: 2704 | es-errors: 1.3.0 2705 | 2706 | es-set-tostringtag@2.1.0: 2707 | dependencies: 2708 | es-errors: 1.3.0 2709 | get-intrinsic: 1.3.0 2710 | has-tostringtag: 1.0.2 2711 | hasown: 2.0.2 2712 | 2713 | escalade@3.2.0: {} 2714 | 2715 | escape-string-regexp@1.0.5: {} 2716 | 2717 | escape-string-regexp@2.0.0: {} 2718 | 2719 | escodegen@2.1.0: 2720 | dependencies: 2721 | esprima: 4.0.1 2722 | estraverse: 5.3.0 2723 | esutils: 2.0.3 2724 | optionalDependencies: 2725 | source-map: 0.6.1 2726 | 2727 | esprima@4.0.1: {} 2728 | 2729 | estraverse@5.3.0: {} 2730 | 2731 | esutils@2.0.3: {} 2732 | 2733 | execa@5.1.1: 2734 | dependencies: 2735 | cross-spawn: 7.0.6 2736 | get-stream: 6.0.1 2737 | human-signals: 2.1.0 2738 | is-stream: 2.0.1 2739 | merge-stream: 2.0.0 2740 | npm-run-path: 4.0.1 2741 | onetime: 5.1.2 2742 | signal-exit: 3.0.7 2743 | strip-final-newline: 2.0.0 2744 | 2745 | exit@0.1.2: {} 2746 | 2747 | expect@27.5.1: 2748 | dependencies: 2749 | '@jest/types': 27.5.1 2750 | jest-get-type: 27.5.1 2751 | jest-matcher-utils: 27.5.1 2752 | jest-message-util: 27.5.1 2753 | 2754 | extendable-error@0.1.7: {} 2755 | 2756 | external-editor@3.1.0: 2757 | dependencies: 2758 | chardet: 0.7.0 2759 | iconv-lite: 0.4.24 2760 | tmp: 0.0.33 2761 | 2762 | fast-glob@3.3.3: 2763 | dependencies: 2764 | '@nodelib/fs.stat': 2.0.5 2765 | '@nodelib/fs.walk': 1.2.8 2766 | glob-parent: 5.1.2 2767 | merge2: 1.4.1 2768 | micromatch: 4.0.8 2769 | 2770 | fast-json-stable-stringify@2.1.0: {} 2771 | 2772 | fastq@1.19.1: 2773 | dependencies: 2774 | reusify: 1.1.0 2775 | 2776 | fb-watchman@2.0.2: 2777 | dependencies: 2778 | bser: 2.1.1 2779 | 2780 | fill-range@7.1.1: 2781 | dependencies: 2782 | to-regex-range: 5.0.1 2783 | 2784 | find-up@4.1.0: 2785 | dependencies: 2786 | locate-path: 5.0.0 2787 | path-exists: 4.0.0 2788 | 2789 | form-data@3.0.3: 2790 | dependencies: 2791 | asynckit: 0.4.0 2792 | combined-stream: 1.0.8 2793 | es-set-tostringtag: 2.1.0 2794 | mime-types: 2.1.35 2795 | 2796 | fs-extra@7.0.1: 2797 | dependencies: 2798 | graceful-fs: 4.2.11 2799 | jsonfile: 4.0.0 2800 | universalify: 0.1.2 2801 | 2802 | fs-extra@8.1.0: 2803 | dependencies: 2804 | graceful-fs: 4.2.11 2805 | jsonfile: 4.0.0 2806 | universalify: 0.1.2 2807 | 2808 | fs.realpath@1.0.0: {} 2809 | 2810 | fsevents@2.3.3: 2811 | optional: true 2812 | 2813 | function-bind@1.1.2: {} 2814 | 2815 | gensync@1.0.0-beta.2: {} 2816 | 2817 | get-caller-file@2.0.5: {} 2818 | 2819 | get-intrinsic@1.3.0: 2820 | dependencies: 2821 | call-bind-apply-helpers: 1.0.2 2822 | es-define-property: 1.0.1 2823 | es-errors: 1.3.0 2824 | es-object-atoms: 1.1.1 2825 | function-bind: 1.1.2 2826 | get-proto: 1.0.1 2827 | gopd: 1.2.0 2828 | has-symbols: 1.1.0 2829 | hasown: 2.0.2 2830 | math-intrinsics: 1.1.0 2831 | 2832 | get-package-type@0.1.0: {} 2833 | 2834 | get-proto@1.0.1: 2835 | dependencies: 2836 | dunder-proto: 1.0.1 2837 | es-object-atoms: 1.1.1 2838 | 2839 | get-stream@6.0.1: {} 2840 | 2841 | glob-parent@5.1.2: 2842 | dependencies: 2843 | is-glob: 4.0.3 2844 | 2845 | glob@7.2.3: 2846 | dependencies: 2847 | fs.realpath: 1.0.0 2848 | inflight: 1.0.6 2849 | inherits: 2.0.4 2850 | minimatch: 3.1.2 2851 | once: 1.4.0 2852 | path-is-absolute: 1.0.1 2853 | 2854 | glob@8.1.0: 2855 | dependencies: 2856 | fs.realpath: 1.0.0 2857 | inflight: 1.0.6 2858 | inherits: 2.0.4 2859 | minimatch: 5.1.6 2860 | once: 1.4.0 2861 | 2862 | globals@11.12.0: {} 2863 | 2864 | globby@11.1.0: 2865 | dependencies: 2866 | array-union: 2.1.0 2867 | dir-glob: 3.0.1 2868 | fast-glob: 3.3.3 2869 | ignore: 5.3.2 2870 | merge2: 1.4.1 2871 | slash: 3.0.0 2872 | 2873 | gopd@1.2.0: {} 2874 | 2875 | graceful-fs@4.2.11: {} 2876 | 2877 | has-flag@3.0.0: {} 2878 | 2879 | has-flag@4.0.0: {} 2880 | 2881 | has-symbols@1.1.0: {} 2882 | 2883 | has-tostringtag@1.0.2: 2884 | dependencies: 2885 | has-symbols: 1.1.0 2886 | 2887 | hasown@2.0.2: 2888 | dependencies: 2889 | function-bind: 1.1.2 2890 | 2891 | html-encoding-sniffer@2.0.1: 2892 | dependencies: 2893 | whatwg-encoding: 1.0.5 2894 | 2895 | html-escaper@2.0.2: {} 2896 | 2897 | http-proxy-agent@4.0.1: 2898 | dependencies: 2899 | '@tootallnate/once': 1.1.2 2900 | agent-base: 6.0.2 2901 | debug: 4.4.1 2902 | transitivePeerDependencies: 2903 | - supports-color 2904 | 2905 | https-proxy-agent@5.0.1: 2906 | dependencies: 2907 | agent-base: 6.0.2 2908 | debug: 4.4.1 2909 | transitivePeerDependencies: 2910 | - supports-color 2911 | 2912 | human-id@4.1.1: {} 2913 | 2914 | human-signals@2.1.0: {} 2915 | 2916 | iconv-lite@0.4.24: 2917 | dependencies: 2918 | safer-buffer: 2.1.2 2919 | 2920 | ignore@5.3.2: {} 2921 | 2922 | import-local@3.2.0: 2923 | dependencies: 2924 | pkg-dir: 4.2.0 2925 | resolve-cwd: 3.0.0 2926 | 2927 | imurmurhash@0.1.4: {} 2928 | 2929 | inflight@1.0.6: 2930 | dependencies: 2931 | once: 1.4.0 2932 | wrappy: 1.0.2 2933 | 2934 | inherits@2.0.4: {} 2935 | 2936 | is-arrayish@0.2.1: {} 2937 | 2938 | is-core-module@2.16.1: 2939 | dependencies: 2940 | hasown: 2.0.2 2941 | 2942 | is-extglob@2.1.1: {} 2943 | 2944 | is-fullwidth-code-point@3.0.0: {} 2945 | 2946 | is-generator-fn@2.1.0: {} 2947 | 2948 | is-glob@4.0.3: 2949 | dependencies: 2950 | is-extglob: 2.1.1 2951 | 2952 | is-number@7.0.0: {} 2953 | 2954 | is-potential-custom-element-name@1.0.1: {} 2955 | 2956 | is-stream@2.0.1: {} 2957 | 2958 | is-subdir@1.2.0: 2959 | dependencies: 2960 | better-path-resolve: 1.0.0 2961 | 2962 | is-typedarray@1.0.0: {} 2963 | 2964 | is-windows@1.0.2: {} 2965 | 2966 | isexe@2.0.0: {} 2967 | 2968 | istanbul-lib-coverage@3.2.2: {} 2969 | 2970 | istanbul-lib-instrument@5.2.1: 2971 | dependencies: 2972 | '@babel/core': 7.27.4 2973 | '@babel/parser': 7.27.5 2974 | '@istanbuljs/schema': 0.1.3 2975 | istanbul-lib-coverage: 3.2.2 2976 | semver: 6.3.1 2977 | transitivePeerDependencies: 2978 | - supports-color 2979 | 2980 | istanbul-lib-report@3.0.1: 2981 | dependencies: 2982 | istanbul-lib-coverage: 3.2.2 2983 | make-dir: 4.0.0 2984 | supports-color: 7.2.0 2985 | 2986 | istanbul-lib-source-maps@4.0.1: 2987 | dependencies: 2988 | debug: 4.4.1 2989 | istanbul-lib-coverage: 3.2.2 2990 | source-map: 0.6.1 2991 | transitivePeerDependencies: 2992 | - supports-color 2993 | 2994 | istanbul-reports@3.1.7: 2995 | dependencies: 2996 | html-escaper: 2.0.2 2997 | istanbul-lib-report: 3.0.1 2998 | 2999 | jest-changed-files@27.5.1: 3000 | dependencies: 3001 | '@jest/types': 27.5.1 3002 | execa: 5.1.1 3003 | throat: 6.0.2 3004 | 3005 | jest-circus@27.5.1: 3006 | dependencies: 3007 | '@jest/environment': 27.5.1 3008 | '@jest/test-result': 27.5.1 3009 | '@jest/types': 27.5.1 3010 | '@types/node': 24.0.3 3011 | chalk: 4.1.2 3012 | co: 4.6.0 3013 | dedent: 0.7.0 3014 | expect: 27.5.1 3015 | is-generator-fn: 2.1.0 3016 | jest-each: 27.5.1 3017 | jest-matcher-utils: 27.5.1 3018 | jest-message-util: 27.5.1 3019 | jest-runtime: 27.5.1 3020 | jest-snapshot: 27.5.1 3021 | jest-util: 27.5.1 3022 | pretty-format: 27.5.1 3023 | slash: 3.0.0 3024 | stack-utils: 2.0.6 3025 | throat: 6.0.2 3026 | transitivePeerDependencies: 3027 | - supports-color 3028 | 3029 | jest-cli@27.5.1: 3030 | dependencies: 3031 | '@jest/core': 27.5.1 3032 | '@jest/test-result': 27.5.1 3033 | '@jest/types': 27.5.1 3034 | chalk: 4.1.2 3035 | exit: 0.1.2 3036 | graceful-fs: 4.2.11 3037 | import-local: 3.2.0 3038 | jest-config: 27.5.1 3039 | jest-util: 27.5.1 3040 | jest-validate: 27.5.1 3041 | prompts: 2.4.2 3042 | yargs: 16.2.0 3043 | transitivePeerDependencies: 3044 | - bufferutil 3045 | - canvas 3046 | - supports-color 3047 | - ts-node 3048 | - utf-8-validate 3049 | 3050 | jest-config@27.5.1: 3051 | dependencies: 3052 | '@babel/core': 7.27.4 3053 | '@jest/test-sequencer': 27.5.1 3054 | '@jest/types': 27.5.1 3055 | babel-jest: 27.5.1(@babel/core@7.27.4) 3056 | chalk: 4.1.2 3057 | ci-info: 3.9.0 3058 | deepmerge: 4.3.1 3059 | glob: 7.2.3 3060 | graceful-fs: 4.2.11 3061 | jest-circus: 27.5.1 3062 | jest-environment-jsdom: 27.5.1 3063 | jest-environment-node: 27.5.1 3064 | jest-get-type: 27.5.1 3065 | jest-jasmine2: 27.5.1 3066 | jest-regex-util: 27.5.1 3067 | jest-resolve: 27.5.1 3068 | jest-runner: 27.5.1 3069 | jest-util: 27.5.1 3070 | jest-validate: 27.5.1 3071 | micromatch: 4.0.8 3072 | parse-json: 5.2.0 3073 | pretty-format: 27.5.1 3074 | slash: 3.0.0 3075 | strip-json-comments: 3.1.1 3076 | transitivePeerDependencies: 3077 | - bufferutil 3078 | - canvas 3079 | - supports-color 3080 | - utf-8-validate 3081 | 3082 | jest-diff@27.5.1: 3083 | dependencies: 3084 | chalk: 4.1.2 3085 | diff-sequences: 27.5.1 3086 | jest-get-type: 27.5.1 3087 | pretty-format: 27.5.1 3088 | 3089 | jest-docblock@27.5.1: 3090 | dependencies: 3091 | detect-newline: 3.1.0 3092 | 3093 | jest-each@27.5.1: 3094 | dependencies: 3095 | '@jest/types': 27.5.1 3096 | chalk: 4.1.2 3097 | jest-get-type: 27.5.1 3098 | jest-util: 27.5.1 3099 | pretty-format: 27.5.1 3100 | 3101 | jest-environment-jsdom@27.5.1: 3102 | dependencies: 3103 | '@jest/environment': 27.5.1 3104 | '@jest/fake-timers': 27.5.1 3105 | '@jest/types': 27.5.1 3106 | '@types/node': 24.0.3 3107 | jest-mock: 27.5.1 3108 | jest-util: 27.5.1 3109 | jsdom: 16.7.0 3110 | transitivePeerDependencies: 3111 | - bufferutil 3112 | - canvas 3113 | - supports-color 3114 | - utf-8-validate 3115 | 3116 | jest-environment-node@27.5.1: 3117 | dependencies: 3118 | '@jest/environment': 27.5.1 3119 | '@jest/fake-timers': 27.5.1 3120 | '@jest/types': 27.5.1 3121 | '@types/node': 24.0.3 3122 | jest-mock: 27.5.1 3123 | jest-util: 27.5.1 3124 | 3125 | jest-get-type@27.5.1: {} 3126 | 3127 | jest-haste-map@27.5.1: 3128 | dependencies: 3129 | '@jest/types': 27.5.1 3130 | '@types/graceful-fs': 4.1.9 3131 | '@types/node': 24.0.3 3132 | anymatch: 3.1.3 3133 | fb-watchman: 2.0.2 3134 | graceful-fs: 4.2.11 3135 | jest-regex-util: 27.5.1 3136 | jest-serializer: 27.5.1 3137 | jest-util: 27.5.1 3138 | jest-worker: 27.5.1 3139 | micromatch: 4.0.8 3140 | walker: 1.0.8 3141 | optionalDependencies: 3142 | fsevents: 2.3.3 3143 | 3144 | jest-jasmine2@27.5.1: 3145 | dependencies: 3146 | '@jest/environment': 27.5.1 3147 | '@jest/source-map': 27.5.1 3148 | '@jest/test-result': 27.5.1 3149 | '@jest/types': 27.5.1 3150 | '@types/node': 24.0.3 3151 | chalk: 4.1.2 3152 | co: 4.6.0 3153 | expect: 27.5.1 3154 | is-generator-fn: 2.1.0 3155 | jest-each: 27.5.1 3156 | jest-matcher-utils: 27.5.1 3157 | jest-message-util: 27.5.1 3158 | jest-runtime: 27.5.1 3159 | jest-snapshot: 27.5.1 3160 | jest-util: 27.5.1 3161 | pretty-format: 27.5.1 3162 | throat: 6.0.2 3163 | transitivePeerDependencies: 3164 | - supports-color 3165 | 3166 | jest-leak-detector@27.5.1: 3167 | dependencies: 3168 | jest-get-type: 27.5.1 3169 | pretty-format: 27.5.1 3170 | 3171 | jest-matcher-utils@27.5.1: 3172 | dependencies: 3173 | chalk: 4.1.2 3174 | jest-diff: 27.5.1 3175 | jest-get-type: 27.5.1 3176 | pretty-format: 27.5.1 3177 | 3178 | jest-message-util@27.5.1: 3179 | dependencies: 3180 | '@babel/code-frame': 7.27.1 3181 | '@jest/types': 27.5.1 3182 | '@types/stack-utils': 2.0.3 3183 | chalk: 4.1.2 3184 | graceful-fs: 4.2.11 3185 | micromatch: 4.0.8 3186 | pretty-format: 27.5.1 3187 | slash: 3.0.0 3188 | stack-utils: 2.0.6 3189 | 3190 | jest-mock@27.5.1: 3191 | dependencies: 3192 | '@jest/types': 27.5.1 3193 | '@types/node': 24.0.3 3194 | 3195 | jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): 3196 | optionalDependencies: 3197 | jest-resolve: 27.5.1 3198 | 3199 | jest-regex-util@27.5.1: {} 3200 | 3201 | jest-resolve-dependencies@27.5.1: 3202 | dependencies: 3203 | '@jest/types': 27.5.1 3204 | jest-regex-util: 27.5.1 3205 | jest-snapshot: 27.5.1 3206 | transitivePeerDependencies: 3207 | - supports-color 3208 | 3209 | jest-resolve@27.5.1: 3210 | dependencies: 3211 | '@jest/types': 27.5.1 3212 | chalk: 4.1.2 3213 | graceful-fs: 4.2.11 3214 | jest-haste-map: 27.5.1 3215 | jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) 3216 | jest-util: 27.5.1 3217 | jest-validate: 27.5.1 3218 | resolve: 1.22.10 3219 | resolve.exports: 1.1.1 3220 | slash: 3.0.0 3221 | 3222 | jest-runner@27.5.1: 3223 | dependencies: 3224 | '@jest/console': 27.5.1 3225 | '@jest/environment': 27.5.1 3226 | '@jest/test-result': 27.5.1 3227 | '@jest/transform': 27.5.1 3228 | '@jest/types': 27.5.1 3229 | '@types/node': 24.0.3 3230 | chalk: 4.1.2 3231 | emittery: 0.8.1 3232 | graceful-fs: 4.2.11 3233 | jest-docblock: 27.5.1 3234 | jest-environment-jsdom: 27.5.1 3235 | jest-environment-node: 27.5.1 3236 | jest-haste-map: 27.5.1 3237 | jest-leak-detector: 27.5.1 3238 | jest-message-util: 27.5.1 3239 | jest-resolve: 27.5.1 3240 | jest-runtime: 27.5.1 3241 | jest-util: 27.5.1 3242 | jest-worker: 27.5.1 3243 | source-map-support: 0.5.21 3244 | throat: 6.0.2 3245 | transitivePeerDependencies: 3246 | - bufferutil 3247 | - canvas 3248 | - supports-color 3249 | - utf-8-validate 3250 | 3251 | jest-runtime@27.5.1: 3252 | dependencies: 3253 | '@jest/environment': 27.5.1 3254 | '@jest/fake-timers': 27.5.1 3255 | '@jest/globals': 27.5.1 3256 | '@jest/source-map': 27.5.1 3257 | '@jest/test-result': 27.5.1 3258 | '@jest/transform': 27.5.1 3259 | '@jest/types': 27.5.1 3260 | chalk: 4.1.2 3261 | cjs-module-lexer: 1.4.3 3262 | collect-v8-coverage: 1.0.2 3263 | execa: 5.1.1 3264 | glob: 7.2.3 3265 | graceful-fs: 4.2.11 3266 | jest-haste-map: 27.5.1 3267 | jest-message-util: 27.5.1 3268 | jest-mock: 27.5.1 3269 | jest-regex-util: 27.5.1 3270 | jest-resolve: 27.5.1 3271 | jest-snapshot: 27.5.1 3272 | jest-util: 27.5.1 3273 | slash: 3.0.0 3274 | strip-bom: 4.0.0 3275 | transitivePeerDependencies: 3276 | - supports-color 3277 | 3278 | jest-serializer@27.5.1: 3279 | dependencies: 3280 | '@types/node': 24.0.3 3281 | graceful-fs: 4.2.11 3282 | 3283 | jest-snapshot@27.5.1: 3284 | dependencies: 3285 | '@babel/core': 7.27.4 3286 | '@babel/generator': 7.27.5 3287 | '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) 3288 | '@babel/traverse': 7.27.4 3289 | '@babel/types': 7.27.6 3290 | '@jest/transform': 27.5.1 3291 | '@jest/types': 27.5.1 3292 | '@types/babel__traverse': 7.20.7 3293 | '@types/prettier': 2.7.3 3294 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) 3295 | chalk: 4.1.2 3296 | expect: 27.5.1 3297 | graceful-fs: 4.2.11 3298 | jest-diff: 27.5.1 3299 | jest-get-type: 27.5.1 3300 | jest-haste-map: 27.5.1 3301 | jest-matcher-utils: 27.5.1 3302 | jest-message-util: 27.5.1 3303 | jest-util: 27.5.1 3304 | natural-compare: 1.4.0 3305 | pretty-format: 27.5.1 3306 | semver: 7.7.2 3307 | transitivePeerDependencies: 3308 | - supports-color 3309 | 3310 | jest-util@27.5.1: 3311 | dependencies: 3312 | '@jest/types': 27.5.1 3313 | '@types/node': 24.0.3 3314 | chalk: 4.1.2 3315 | ci-info: 3.9.0 3316 | graceful-fs: 4.2.11 3317 | picomatch: 2.3.1 3318 | 3319 | jest-validate@27.5.1: 3320 | dependencies: 3321 | '@jest/types': 27.5.1 3322 | camelcase: 6.3.0 3323 | chalk: 4.1.2 3324 | jest-get-type: 27.5.1 3325 | leven: 3.1.0 3326 | pretty-format: 27.5.1 3327 | 3328 | jest-watcher@27.5.1: 3329 | dependencies: 3330 | '@jest/test-result': 27.5.1 3331 | '@jest/types': 27.5.1 3332 | '@types/node': 24.0.3 3333 | ansi-escapes: 4.3.2 3334 | chalk: 4.1.2 3335 | jest-util: 27.5.1 3336 | string-length: 4.0.2 3337 | 3338 | jest-worker@27.5.1: 3339 | dependencies: 3340 | '@types/node': 24.0.3 3341 | merge-stream: 2.0.0 3342 | supports-color: 8.1.1 3343 | 3344 | jest@27.5.1: 3345 | dependencies: 3346 | '@jest/core': 27.5.1 3347 | import-local: 3.2.0 3348 | jest-cli: 27.5.1 3349 | transitivePeerDependencies: 3350 | - bufferutil 3351 | - canvas 3352 | - supports-color 3353 | - ts-node 3354 | - utf-8-validate 3355 | 3356 | js-tokens@4.0.0: {} 3357 | 3358 | js-yaml@3.14.1: 3359 | dependencies: 3360 | argparse: 1.0.10 3361 | esprima: 4.0.1 3362 | 3363 | jsdom@16.7.0: 3364 | dependencies: 3365 | abab: 2.0.6 3366 | acorn: 8.15.0 3367 | acorn-globals: 6.0.0 3368 | cssom: 0.4.4 3369 | cssstyle: 2.3.0 3370 | data-urls: 2.0.0 3371 | decimal.js: 10.5.0 3372 | domexception: 2.0.1 3373 | escodegen: 2.1.0 3374 | form-data: 3.0.3 3375 | html-encoding-sniffer: 2.0.1 3376 | http-proxy-agent: 4.0.1 3377 | https-proxy-agent: 5.0.1 3378 | is-potential-custom-element-name: 1.0.1 3379 | nwsapi: 2.2.20 3380 | parse5: 6.0.1 3381 | saxes: 5.0.1 3382 | symbol-tree: 3.2.4 3383 | tough-cookie: 4.1.4 3384 | w3c-hr-time: 1.0.2 3385 | w3c-xmlserializer: 2.0.0 3386 | webidl-conversions: 6.1.0 3387 | whatwg-encoding: 1.0.5 3388 | whatwg-mimetype: 2.3.0 3389 | whatwg-url: 8.7.0 3390 | ws: 7.5.10 3391 | xml-name-validator: 3.0.0 3392 | transitivePeerDependencies: 3393 | - bufferutil 3394 | - supports-color 3395 | - utf-8-validate 3396 | 3397 | jsesc@3.1.0: {} 3398 | 3399 | json-parse-even-better-errors@2.3.1: {} 3400 | 3401 | json5@2.2.3: {} 3402 | 3403 | jsonc-parser@3.3.1: {} 3404 | 3405 | jsonfile@4.0.0: 3406 | optionalDependencies: 3407 | graceful-fs: 4.2.11 3408 | 3409 | kleur@3.0.3: {} 3410 | 3411 | leven@3.1.0: {} 3412 | 3413 | lines-and-columns@1.2.4: {} 3414 | 3415 | locate-path@5.0.0: 3416 | dependencies: 3417 | p-locate: 4.1.0 3418 | 3419 | lodash.memoize@4.1.2: {} 3420 | 3421 | lodash.startcase@4.4.0: {} 3422 | 3423 | lodash@4.17.21: {} 3424 | 3425 | lru-cache@5.1.1: 3426 | dependencies: 3427 | yallist: 3.1.1 3428 | 3429 | lunr@2.3.9: {} 3430 | 3431 | make-dir@4.0.0: 3432 | dependencies: 3433 | semver: 7.7.2 3434 | 3435 | make-error@1.3.6: {} 3436 | 3437 | makeerror@1.0.12: 3438 | dependencies: 3439 | tmpl: 1.0.5 3440 | 3441 | marked@4.3.0: {} 3442 | 3443 | math-intrinsics@1.1.0: {} 3444 | 3445 | merge-stream@2.0.0: {} 3446 | 3447 | merge2@1.4.1: {} 3448 | 3449 | micromatch@4.0.8: 3450 | dependencies: 3451 | braces: 3.0.3 3452 | picomatch: 2.3.1 3453 | 3454 | mime-db@1.52.0: {} 3455 | 3456 | mime-types@2.1.35: 3457 | dependencies: 3458 | mime-db: 1.52.0 3459 | 3460 | mimic-fn@2.1.0: {} 3461 | 3462 | minimatch@3.1.2: 3463 | dependencies: 3464 | brace-expansion: 1.1.12 3465 | 3466 | minimatch@5.1.6: 3467 | dependencies: 3468 | brace-expansion: 2.0.2 3469 | 3470 | minimist@1.2.8: {} 3471 | 3472 | mkdirp@0.5.6: 3473 | dependencies: 3474 | minimist: 1.2.8 3475 | 3476 | mri@1.2.0: {} 3477 | 3478 | ms@2.1.3: {} 3479 | 3480 | natural-compare@1.4.0: {} 3481 | 3482 | node-int64@0.4.0: {} 3483 | 3484 | node-releases@2.0.19: {} 3485 | 3486 | normalize-path@3.0.0: {} 3487 | 3488 | npm-run-path@4.0.1: 3489 | dependencies: 3490 | path-key: 3.1.1 3491 | 3492 | nwsapi@2.2.20: {} 3493 | 3494 | object-inspect@1.13.4: {} 3495 | 3496 | once@1.4.0: 3497 | dependencies: 3498 | wrappy: 1.0.2 3499 | 3500 | onetime@5.1.2: 3501 | dependencies: 3502 | mimic-fn: 2.1.0 3503 | 3504 | os-tmpdir@1.0.2: {} 3505 | 3506 | outdent@0.5.0: {} 3507 | 3508 | p-filter@2.1.0: 3509 | dependencies: 3510 | p-map: 2.1.0 3511 | 3512 | p-limit@2.3.0: 3513 | dependencies: 3514 | p-try: 2.2.0 3515 | 3516 | p-locate@4.1.0: 3517 | dependencies: 3518 | p-limit: 2.3.0 3519 | 3520 | p-map@2.1.0: {} 3521 | 3522 | p-try@2.2.0: {} 3523 | 3524 | package-manager-detector@0.2.11: 3525 | dependencies: 3526 | quansync: 0.2.10 3527 | 3528 | parse-json@5.2.0: 3529 | dependencies: 3530 | '@babel/code-frame': 7.27.1 3531 | error-ex: 1.3.2 3532 | json-parse-even-better-errors: 2.3.1 3533 | lines-and-columns: 1.2.4 3534 | 3535 | parse5@6.0.1: {} 3536 | 3537 | path-exists@4.0.0: {} 3538 | 3539 | path-is-absolute@1.0.1: {} 3540 | 3541 | path-key@3.1.1: {} 3542 | 3543 | path-parse@1.0.7: {} 3544 | 3545 | path-type@4.0.0: {} 3546 | 3547 | picocolors@1.1.1: {} 3548 | 3549 | picomatch@2.3.1: {} 3550 | 3551 | pify@4.0.1: {} 3552 | 3553 | pirates@4.0.7: {} 3554 | 3555 | pkg-dir@4.2.0: 3556 | dependencies: 3557 | find-up: 4.1.0 3558 | 3559 | prettier@1.19.1: {} 3560 | 3561 | prettier@2.8.8: {} 3562 | 3563 | pretty-format@27.5.1: 3564 | dependencies: 3565 | ansi-regex: 5.0.1 3566 | ansi-styles: 5.2.0 3567 | react-is: 17.0.2 3568 | 3569 | prompts@2.4.2: 3570 | dependencies: 3571 | kleur: 3.0.3 3572 | sisteransi: 1.0.5 3573 | 3574 | psl@1.15.0: 3575 | dependencies: 3576 | punycode: 2.3.1 3577 | 3578 | punycode@2.3.1: {} 3579 | 3580 | qs@6.14.0: 3581 | dependencies: 3582 | side-channel: 1.1.0 3583 | 3584 | quansync@0.2.10: {} 3585 | 3586 | querystringify@2.2.0: {} 3587 | 3588 | queue-microtask@1.2.3: {} 3589 | 3590 | react-is@17.0.2: {} 3591 | 3592 | read-yaml-file@1.1.0: 3593 | dependencies: 3594 | graceful-fs: 4.2.11 3595 | js-yaml: 3.14.1 3596 | pify: 4.0.1 3597 | strip-bom: 3.0.0 3598 | 3599 | require-directory@2.1.1: {} 3600 | 3601 | requires-port@1.0.0: {} 3602 | 3603 | resolve-cwd@3.0.0: 3604 | dependencies: 3605 | resolve-from: 5.0.0 3606 | 3607 | resolve-from@5.0.0: {} 3608 | 3609 | resolve.exports@1.1.1: {} 3610 | 3611 | resolve@1.22.10: 3612 | dependencies: 3613 | is-core-module: 2.16.1 3614 | path-parse: 1.0.7 3615 | supports-preserve-symlinks-flag: 1.0.0 3616 | 3617 | reusify@1.1.0: {} 3618 | 3619 | rimraf@3.0.2: 3620 | dependencies: 3621 | glob: 7.2.3 3622 | 3623 | run-parallel@1.2.0: 3624 | dependencies: 3625 | queue-microtask: 1.2.3 3626 | 3627 | safer-buffer@2.1.2: {} 3628 | 3629 | saxes@5.0.1: 3630 | dependencies: 3631 | xmlchars: 2.2.0 3632 | 3633 | semver@5.7.2: {} 3634 | 3635 | semver@6.3.1: {} 3636 | 3637 | semver@7.7.2: {} 3638 | 3639 | shebang-command@2.0.0: 3640 | dependencies: 3641 | shebang-regex: 3.0.0 3642 | 3643 | shebang-regex@3.0.0: {} 3644 | 3645 | shiki@0.10.1: 3646 | dependencies: 3647 | jsonc-parser: 3.3.1 3648 | vscode-oniguruma: 1.7.0 3649 | vscode-textmate: 5.2.0 3650 | 3651 | side-channel-list@1.0.0: 3652 | dependencies: 3653 | es-errors: 1.3.0 3654 | object-inspect: 1.13.4 3655 | 3656 | side-channel-map@1.0.1: 3657 | dependencies: 3658 | call-bound: 1.0.4 3659 | es-errors: 1.3.0 3660 | get-intrinsic: 1.3.0 3661 | object-inspect: 1.13.4 3662 | 3663 | side-channel-weakmap@1.0.2: 3664 | dependencies: 3665 | call-bound: 1.0.4 3666 | es-errors: 1.3.0 3667 | get-intrinsic: 1.3.0 3668 | object-inspect: 1.13.4 3669 | side-channel-map: 1.0.1 3670 | 3671 | side-channel@1.1.0: 3672 | dependencies: 3673 | es-errors: 1.3.0 3674 | object-inspect: 1.13.4 3675 | side-channel-list: 1.0.0 3676 | side-channel-map: 1.0.1 3677 | side-channel-weakmap: 1.0.2 3678 | 3679 | signal-exit@3.0.7: {} 3680 | 3681 | signal-exit@4.1.0: {} 3682 | 3683 | sisteransi@1.0.5: {} 3684 | 3685 | slash@3.0.0: {} 3686 | 3687 | source-map-support@0.5.21: 3688 | dependencies: 3689 | buffer-from: 1.1.2 3690 | source-map: 0.6.1 3691 | 3692 | source-map@0.6.1: {} 3693 | 3694 | source-map@0.7.4: {} 3695 | 3696 | spawndamnit@3.0.1: 3697 | dependencies: 3698 | cross-spawn: 7.0.6 3699 | signal-exit: 4.1.0 3700 | 3701 | sprintf-js@1.0.3: {} 3702 | 3703 | stack-utils@2.0.6: 3704 | dependencies: 3705 | escape-string-regexp: 2.0.0 3706 | 3707 | string-length@4.0.2: 3708 | dependencies: 3709 | char-regex: 1.0.2 3710 | strip-ansi: 6.0.1 3711 | 3712 | string-width@4.2.3: 3713 | dependencies: 3714 | emoji-regex: 8.0.0 3715 | is-fullwidth-code-point: 3.0.0 3716 | strip-ansi: 6.0.1 3717 | 3718 | strip-ansi@6.0.1: 3719 | dependencies: 3720 | ansi-regex: 5.0.1 3721 | 3722 | strip-bom@3.0.0: {} 3723 | 3724 | strip-bom@4.0.0: {} 3725 | 3726 | strip-final-newline@2.0.0: {} 3727 | 3728 | strip-json-comments@3.1.1: {} 3729 | 3730 | supports-color@5.5.0: 3731 | dependencies: 3732 | has-flag: 3.0.0 3733 | 3734 | supports-color@7.2.0: 3735 | dependencies: 3736 | has-flag: 4.0.0 3737 | 3738 | supports-color@8.1.1: 3739 | dependencies: 3740 | has-flag: 4.0.0 3741 | 3742 | supports-hyperlinks@2.3.0: 3743 | dependencies: 3744 | has-flag: 4.0.0 3745 | supports-color: 7.2.0 3746 | 3747 | supports-preserve-symlinks-flag@1.0.0: {} 3748 | 3749 | symbol-tree@3.2.4: {} 3750 | 3751 | term-size@2.2.1: {} 3752 | 3753 | terminal-link@2.1.1: 3754 | dependencies: 3755 | ansi-escapes: 4.3.2 3756 | supports-hyperlinks: 2.3.0 3757 | 3758 | test-exclude@6.0.0: 3759 | dependencies: 3760 | '@istanbuljs/schema': 0.1.3 3761 | glob: 7.2.3 3762 | minimatch: 3.1.2 3763 | 3764 | throat@6.0.2: {} 3765 | 3766 | tmp@0.0.33: 3767 | dependencies: 3768 | os-tmpdir: 1.0.2 3769 | 3770 | tmpl@1.0.5: {} 3771 | 3772 | to-regex-range@5.0.1: 3773 | dependencies: 3774 | is-number: 7.0.0 3775 | 3776 | tough-cookie@4.1.4: 3777 | dependencies: 3778 | psl: 1.15.0 3779 | punycode: 2.3.1 3780 | universalify: 0.2.0 3781 | url-parse: 1.5.10 3782 | 3783 | tr46@2.1.0: 3784 | dependencies: 3785 | punycode: 2.3.1 3786 | 3787 | ts-jest@27.1.5(@babel/core@7.27.4)(@types/jest@27.5.2)(babel-jest@27.5.1(@babel/core@7.27.4))(jest@27.5.1)(typescript@4.9.5): 3788 | dependencies: 3789 | bs-logger: 0.2.6 3790 | fast-json-stable-stringify: 2.1.0 3791 | jest: 27.5.1 3792 | jest-util: 27.5.1 3793 | json5: 2.2.3 3794 | lodash.memoize: 4.1.2 3795 | make-error: 1.3.6 3796 | semver: 7.7.2 3797 | typescript: 4.9.5 3798 | yargs-parser: 20.2.9 3799 | optionalDependencies: 3800 | '@babel/core': 7.27.4 3801 | '@types/jest': 27.5.2 3802 | babel-jest: 27.5.1(@babel/core@7.27.4) 3803 | 3804 | tslib@1.14.1: {} 3805 | 3806 | tslint-config-prettier@1.18.0: {} 3807 | 3808 | tslint@6.1.3(typescript@4.9.5): 3809 | dependencies: 3810 | '@babel/code-frame': 7.27.1 3811 | builtin-modules: 1.1.1 3812 | chalk: 2.4.2 3813 | commander: 2.20.3 3814 | diff: 4.0.2 3815 | glob: 7.2.3 3816 | js-yaml: 3.14.1 3817 | minimatch: 3.1.2 3818 | mkdirp: 0.5.6 3819 | resolve: 1.22.10 3820 | semver: 5.7.2 3821 | tslib: 1.14.1 3822 | tsutils: 2.29.0(typescript@4.9.5) 3823 | typescript: 4.9.5 3824 | 3825 | tsutils@2.29.0(typescript@4.9.5): 3826 | dependencies: 3827 | tslib: 1.14.1 3828 | typescript: 4.9.5 3829 | 3830 | type-detect@4.0.8: {} 3831 | 3832 | type-fest@0.21.3: {} 3833 | 3834 | typedarray-to-buffer@3.1.5: 3835 | dependencies: 3836 | is-typedarray: 1.0.0 3837 | 3838 | typedoc@0.22.18(typescript@4.9.5): 3839 | dependencies: 3840 | glob: 8.1.0 3841 | lunr: 2.3.9 3842 | marked: 4.3.0 3843 | minimatch: 5.1.6 3844 | shiki: 0.10.1 3845 | typescript: 4.9.5 3846 | 3847 | typescript@4.9.5: {} 3848 | 3849 | undici-types@7.8.0: {} 3850 | 3851 | universalify@0.1.2: {} 3852 | 3853 | universalify@0.2.0: {} 3854 | 3855 | update-browserslist-db@1.1.3(browserslist@4.25.0): 3856 | dependencies: 3857 | browserslist: 4.25.0 3858 | escalade: 3.2.0 3859 | picocolors: 1.1.1 3860 | 3861 | url-parse@1.5.10: 3862 | dependencies: 3863 | querystringify: 2.2.0 3864 | requires-port: 1.0.0 3865 | 3866 | v8-to-istanbul@8.1.1: 3867 | dependencies: 3868 | '@types/istanbul-lib-coverage': 2.0.6 3869 | convert-source-map: 1.9.0 3870 | source-map: 0.7.4 3871 | 3872 | vscode-oniguruma@1.7.0: {} 3873 | 3874 | vscode-textmate@5.2.0: {} 3875 | 3876 | w3c-hr-time@1.0.2: 3877 | dependencies: 3878 | browser-process-hrtime: 1.0.0 3879 | 3880 | w3c-xmlserializer@2.0.0: 3881 | dependencies: 3882 | xml-name-validator: 3.0.0 3883 | 3884 | walker@1.0.8: 3885 | dependencies: 3886 | makeerror: 1.0.12 3887 | 3888 | webidl-conversions@5.0.0: {} 3889 | 3890 | webidl-conversions@6.1.0: {} 3891 | 3892 | whatwg-encoding@1.0.5: 3893 | dependencies: 3894 | iconv-lite: 0.4.24 3895 | 3896 | whatwg-mimetype@2.3.0: {} 3897 | 3898 | whatwg-url@8.7.0: 3899 | dependencies: 3900 | lodash: 4.17.21 3901 | tr46: 2.1.0 3902 | webidl-conversions: 6.1.0 3903 | 3904 | which@2.0.2: 3905 | dependencies: 3906 | isexe: 2.0.0 3907 | 3908 | wrap-ansi@7.0.0: 3909 | dependencies: 3910 | ansi-styles: 4.3.0 3911 | string-width: 4.2.3 3912 | strip-ansi: 6.0.1 3913 | 3914 | wrappy@1.0.2: {} 3915 | 3916 | write-file-atomic@3.0.3: 3917 | dependencies: 3918 | imurmurhash: 0.1.4 3919 | is-typedarray: 1.0.0 3920 | signal-exit: 3.0.7 3921 | typedarray-to-buffer: 3.1.5 3922 | 3923 | ws@7.5.10: {} 3924 | 3925 | xml-name-validator@3.0.0: {} 3926 | 3927 | xmlchars@2.2.0: {} 3928 | 3929 | y18n@5.0.8: {} 3930 | 3931 | yallist@3.1.1: {} 3932 | 3933 | yargs-parser@20.2.9: {} 3934 | 3935 | yargs@16.2.0: 3936 | dependencies: 3937 | cliui: 7.0.4 3938 | escalade: 3.2.0 3939 | get-caller-file: 2.0.5 3940 | require-directory: 2.1.1 3941 | string-width: 4.2.3 3942 | y18n: 5.0.8 3943 | yargs-parser: 20.2.9 3944 | --------------------------------------------------------------------------------