From 91aaba373991538f3b207056ec0a48b1fda8a34d Mon Sep 17 00:00:00 2001 From: HeronLi Date: Fri, 14 Aug 2026 07:07:50 +0200 Subject: [PATCH 01/33] feat: add Siemens REST API linter --- api-linter/.npmignore | 3 + api-linter/README.md | 171 ++ api-linter/example/openapi.yml | 1525 +++++++++++++++++ api-linter/package.json | 47 + .../assert-http-codes-for-operation.js | 31 + .../functions/count-resource-types.js | 19 + ...esources-has-pagination-strategies-meta.js | 98 ++ ...get-resources-has-pagination-strategies.js | 60 + .../functions/get-resources-has-pagination.js | 94 + .../functions/get-resources-has-parameter.js | 19 + .../rulesets/functions/get-status-code.js | 59 + ...as-header-parameter-with-property-value.js | 21 + .../functions/has-headers-with-property.js | 11 + .../rulesets/functions/is-meta-object.js | 29 + .../rulesets/functions/is-object-schema.js | 29 + .../functions/is-problem-json-schema.js | 68 + .../rulesets/functions/links-has-self.js | 42 + ...-resource-name-is-lowercase-with-hyphen.js | 34 + .../functions/query-parameters-length.js | 18 + ...st-is-defined-document-structure-schema.js | 37 + ...se-is-defined-document-structure-schema.js | 38 + api-linter/rulesets/functions/schema-test.js | 29 + .../successful-response-status-code.js | 13 + .../rulesets/functions/validate-b3-tracing.js | 26 + api-linter/rulesets/semantic-versioning.yml | 14 + .../rulesets/siemens-api-common-operation.yml | 115 ++ .../rulesets/siemens-api-error-reporting.yml | 187 ++ api-linter/rulesets/siemens-api-express.yml | 10 + api-linter/rulesets/siemens-api-filtering.yml | 29 + .../rulesets/siemens-api-media-type.yml | 118 ++ .../rulesets/siemens-api-pagination.yml | 85 + api-linter/rulesets/siemens-api-security.js | 57 + api-linter/rulesets/siemens-api-security.yml | 2 + api-linter/rulesets/siemens-api-sorting.yml | 15 + .../rulesets/siemens-api-sparse-fieldsets.yml | 16 + api-linter/rulesets/siemens-api-versioning.js | 94 + .../rulesets/siemens-api-versioning.yml | 3 + api-linter/rulesets/siemens-api.yml | 11 + api-linter/rulesets/vs-extension.yml | 10 + api-linter/src/argument.js | 48 + api-linter/src/extension.js | 41 + api-linter/src/index.js | 329 ++++ api-linter/src/templates/template.html | 161 ++ api-linter/test/api-commonops.test.js | 123 ++ api-linter/test/api-errors-refs.test.js | 42 + api-linter/test/api-errors.test.js | 85 + api-linter/test/api-filtering.test.js | 30 + api-linter/test/api-linter-cli.test.js | 60 + api-linter/test/api-mediatype.test.js | 114 ++ api-linter/test/api-pagination.test.js | 102 ++ api-linter/test/api-security.test.js | 49 + api-linter/test/api-sparse-fieldsets.test.js | 17 + api-linter/test/api-versioning.test.js | 61 + api-linter/test/base.js | 54 + .../test/testdata/commonops/.spectral.yml | 2 + api-linter/test/testdata/commonops/800-1.yml | 77 + api-linter/test/testdata/commonops/800-2.yml | 94 + api-linter/test/testdata/commonops/800-4.yml | 77 + api-linter/test/testdata/commonops/801-4.yml | 88 + api-linter/test/testdata/commonops/801.yml | 88 + api-linter/test/testdata/commonops/802-6.yml | 106 ++ api-linter/test/testdata/commonops/803-2.yml | 111 ++ api-linter/test/testdata/commonops/803-6.yml | 111 ++ api-linter/test/testdata/commonops/804-1.yml | 38 + api-linter/test/testdata/error/.spectral.yml | 2 + api-linter/test/testdata/error/300.yml | 117 ++ api-linter/test/testdata/error/301.yml | 117 ++ api-linter/test/testdata/error/302.yml | 133 ++ api-linter/test/testdata/error/305.1.yml | 133 ++ api-linter/test/testdata/error/305.2.yml | 139 ++ api-linter/test/testdata/error/305.3.yml | 139 ++ api-linter/test/testdata/fields/.spectral.yml | 2 + api-linter/test/testdata/fields/500.yml | 108 ++ .../test/testdata/filtering/.spectral.yml | 2 + api-linter/test/testdata/filtering/400.yml | 121 ++ api-linter/test/testdata/filtering/401.yml | 121 ++ .../test/testdata/mediatype/.spectral.yml | 2 + api-linter/test/testdata/mediatype/100.yml | 80 + api-linter/test/testdata/mediatype/101-1.yml | 80 + .../test/testdata/mediatype/101-2.1.yml | 81 + .../test/testdata/mediatype/101-2.2.yml | 88 + .../test/testdata/mediatype/101-4-1.yml | 88 + .../test/testdata/mediatype/101-7-2.yml | 168 ++ api-linter/test/testdata/mediatype/101-8.yml | 81 + api-linter/test/testdata/mediatype/101-9.yml | 81 + .../test/testdata/pagination/.spectral.yml | 2 + api-linter/test/testdata/pagination/600.1.yml | 161 ++ api-linter/test/testdata/pagination/600.2.yml | 167 ++ api-linter/test/testdata/pagination/600.3.yml | 161 ++ .../test/testdata/pagination/601-1-1.yml | 136 ++ .../test/testdata/pagination/601-2-1.yml | 148 ++ .../test/testdata/pagination/601-3-1.1.yml | 148 ++ .../test/testdata/pagination/601-3-1.2.yml | 156 ++ api-linter/test/testdata/pagination/601.yml | 109 ++ api-linter/test/testdata/refs/.spectral.yml | 2 + api-linter/test/testdata/refs/300.yml | 86 + .../test/testdata/refs/common_errors.yml | 48 + .../test/testdata/security/.spectral.yml | 2 + api-linter/test/testdata/security/invalid.yml | 122 ++ api-linter/test/testdata/security/valid.yml | 122 ++ .../test/testdata/versioning/.spectral.yml | 2 + api-linter/test/testdata/versioning/200-1.yml | 18 + api-linter/test/testdata/versioning/200-2.yml | 94 + api-linter/test/testdata/versioning/201.yml | 94 + .../versioning/semantic-versioning.yml | 18 + package.json | 3 +- 106 files changed, 9076 insertions(+), 1 deletion(-) create mode 100644 api-linter/.npmignore create mode 100644 api-linter/README.md create mode 100644 api-linter/example/openapi.yml create mode 100644 api-linter/package.json create mode 100644 api-linter/rulesets/functions/assert-http-codes-for-operation.js create mode 100644 api-linter/rulesets/functions/count-resource-types.js create mode 100644 api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js create mode 100644 api-linter/rulesets/functions/get-resources-has-pagination-strategies.js create mode 100644 api-linter/rulesets/functions/get-resources-has-pagination.js create mode 100644 api-linter/rulesets/functions/get-resources-has-parameter.js create mode 100644 api-linter/rulesets/functions/get-status-code.js create mode 100644 api-linter/rulesets/functions/has-header-parameter-with-property-value.js create mode 100644 api-linter/rulesets/functions/has-headers-with-property.js create mode 100644 api-linter/rulesets/functions/is-meta-object.js create mode 100644 api-linter/rulesets/functions/is-object-schema.js create mode 100644 api-linter/rulesets/functions/is-problem-json-schema.js create mode 100644 api-linter/rulesets/functions/links-has-self.js create mode 100644 api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js create mode 100644 api-linter/rulesets/functions/query-parameters-length.js create mode 100644 api-linter/rulesets/functions/request-is-defined-document-structure-schema.js create mode 100644 api-linter/rulesets/functions/response-is-defined-document-structure-schema.js create mode 100644 api-linter/rulesets/functions/schema-test.js create mode 100644 api-linter/rulesets/functions/successful-response-status-code.js create mode 100644 api-linter/rulesets/functions/validate-b3-tracing.js create mode 100644 api-linter/rulesets/semantic-versioning.yml create mode 100644 api-linter/rulesets/siemens-api-common-operation.yml create mode 100644 api-linter/rulesets/siemens-api-error-reporting.yml create mode 100644 api-linter/rulesets/siemens-api-express.yml create mode 100644 api-linter/rulesets/siemens-api-filtering.yml create mode 100644 api-linter/rulesets/siemens-api-media-type.yml create mode 100644 api-linter/rulesets/siemens-api-pagination.yml create mode 100644 api-linter/rulesets/siemens-api-security.js create mode 100644 api-linter/rulesets/siemens-api-security.yml create mode 100644 api-linter/rulesets/siemens-api-sorting.yml create mode 100644 api-linter/rulesets/siemens-api-sparse-fieldsets.yml create mode 100644 api-linter/rulesets/siemens-api-versioning.js create mode 100644 api-linter/rulesets/siemens-api-versioning.yml create mode 100644 api-linter/rulesets/siemens-api.yml create mode 100644 api-linter/rulesets/vs-extension.yml create mode 100644 api-linter/src/argument.js create mode 100644 api-linter/src/extension.js create mode 100755 api-linter/src/index.js create mode 100644 api-linter/src/templates/template.html create mode 100644 api-linter/test/api-commonops.test.js create mode 100644 api-linter/test/api-errors-refs.test.js create mode 100644 api-linter/test/api-errors.test.js create mode 100644 api-linter/test/api-filtering.test.js create mode 100644 api-linter/test/api-linter-cli.test.js create mode 100644 api-linter/test/api-mediatype.test.js create mode 100644 api-linter/test/api-pagination.test.js create mode 100644 api-linter/test/api-security.test.js create mode 100644 api-linter/test/api-sparse-fieldsets.test.js create mode 100644 api-linter/test/api-versioning.test.js create mode 100644 api-linter/test/base.js create mode 100644 api-linter/test/testdata/commonops/.spectral.yml create mode 100644 api-linter/test/testdata/commonops/800-1.yml create mode 100644 api-linter/test/testdata/commonops/800-2.yml create mode 100644 api-linter/test/testdata/commonops/800-4.yml create mode 100644 api-linter/test/testdata/commonops/801-4.yml create mode 100644 api-linter/test/testdata/commonops/801.yml create mode 100644 api-linter/test/testdata/commonops/802-6.yml create mode 100644 api-linter/test/testdata/commonops/803-2.yml create mode 100644 api-linter/test/testdata/commonops/803-6.yml create mode 100644 api-linter/test/testdata/commonops/804-1.yml create mode 100644 api-linter/test/testdata/error/.spectral.yml create mode 100644 api-linter/test/testdata/error/300.yml create mode 100644 api-linter/test/testdata/error/301.yml create mode 100644 api-linter/test/testdata/error/302.yml create mode 100644 api-linter/test/testdata/error/305.1.yml create mode 100644 api-linter/test/testdata/error/305.2.yml create mode 100644 api-linter/test/testdata/error/305.3.yml create mode 100644 api-linter/test/testdata/fields/.spectral.yml create mode 100644 api-linter/test/testdata/fields/500.yml create mode 100644 api-linter/test/testdata/filtering/.spectral.yml create mode 100644 api-linter/test/testdata/filtering/400.yml create mode 100644 api-linter/test/testdata/filtering/401.yml create mode 100644 api-linter/test/testdata/mediatype/.spectral.yml create mode 100644 api-linter/test/testdata/mediatype/100.yml create mode 100644 api-linter/test/testdata/mediatype/101-1.yml create mode 100644 api-linter/test/testdata/mediatype/101-2.1.yml create mode 100644 api-linter/test/testdata/mediatype/101-2.2.yml create mode 100644 api-linter/test/testdata/mediatype/101-4-1.yml create mode 100644 api-linter/test/testdata/mediatype/101-7-2.yml create mode 100644 api-linter/test/testdata/mediatype/101-8.yml create mode 100644 api-linter/test/testdata/mediatype/101-9.yml create mode 100644 api-linter/test/testdata/pagination/.spectral.yml create mode 100644 api-linter/test/testdata/pagination/600.1.yml create mode 100644 api-linter/test/testdata/pagination/600.2.yml create mode 100644 api-linter/test/testdata/pagination/600.3.yml create mode 100644 api-linter/test/testdata/pagination/601-1-1.yml create mode 100644 api-linter/test/testdata/pagination/601-2-1.yml create mode 100644 api-linter/test/testdata/pagination/601-3-1.1.yml create mode 100644 api-linter/test/testdata/pagination/601-3-1.2.yml create mode 100644 api-linter/test/testdata/pagination/601.yml create mode 100644 api-linter/test/testdata/refs/.spectral.yml create mode 100644 api-linter/test/testdata/refs/300.yml create mode 100644 api-linter/test/testdata/refs/common_errors.yml create mode 100644 api-linter/test/testdata/security/.spectral.yml create mode 100644 api-linter/test/testdata/security/invalid.yml create mode 100644 api-linter/test/testdata/security/valid.yml create mode 100644 api-linter/test/testdata/versioning/.spectral.yml create mode 100644 api-linter/test/testdata/versioning/200-1.yml create mode 100644 api-linter/test/testdata/versioning/200-2.yml create mode 100644 api-linter/test/testdata/versioning/201.yml create mode 100644 api-linter/test/testdata/versioning/semantic-versioning.yml diff --git a/api-linter/.npmignore b/api-linter/.npmignore new file mode 100644 index 0000000..f2bcf5c --- /dev/null +++ b/api-linter/.npmignore @@ -0,0 +1,3 @@ +/.npm-cache +/test +/example \ No newline at end of file diff --git a/api-linter/README.md b/api-linter/README.md new file mode 100644 index 0000000..8243924 --- /dev/null +++ b/api-linter/README.md @@ -0,0 +1,171 @@ +# Siemens API Linter + +This project implements a linter reporter for the [Stoplight Spectral](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview) for API specifications. +The ruleset has been created based on the [Siemens Xcelerator API guidelines 2.5.0](https://developer.siemens.com/guidelines/api-guidelines/rest/index.html). + +## Getting started +### Directory structure + +- `example/`: contains a sample API spec file +- `rulesets/`: contains the ruleset files those follow the Siemens Xcelerator API guidelines +- `src/`: contains the source files for creating the linter report +- `test/`: jest test cases for different rules in the rulesets + +### Installation + +In order to include the rulesets and provide linting within your project, you can install the package from this project with this `@siemens/api-linter` package. + +```json +{ + "scripts": { + "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" + }, + "devDependencies": { + "@siemens/api-linter": "^0.8.4" + } +} +``` + +The `@siemens/api-linter` package includes the new Siemens REST API linter tool with html report capability. + +In order to trigger the linter on your API specifications, it provides a script to execute the linter within the `package.json` specification. + +```json + "scripts": { + "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" + } +``` +Developers can change the spec file path with `-s` option, ruleset file path with `-r` option accordingly in the scripts.
+Or just remove them and set them in the command line as:
+ +Script: +```json + "scripts": { + "test": "api-linter" + } +``` +Command: +```groovy +npm test -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml +``` + +For more options: + +``` +Usage: api-linter -s "path-to-spec-file" -r "path-to-rule-file" [-f "fail-severity"] [-c "console-severity"] [-v "api-versioning"] [-a "api-security"] + +Options: + -s, --specPath path to openapi specification + -r, --rulesetPath path to rules file + -f, --failSeverity test fails when met result the severity equal or higher than it (choices: "error", "warn", "info", "hint", default: warn) + -c, --consoleSeverity console output message for linter result no matter job failed or succeeded (choices: "error", "warn", "info", "hint", default: warn) + -o, --outputFilename specify the output filename with or without .html extension (default: linter-result.html) + -p, --jsonFile , output json file with origin spectral result data + -v, --apiVersioning the api versioning way (choices: "ignore", "url", "header", default: ignore) + -a, --apiSecurity if enable authorization security (choices: "n/f/no/false/y/t/yes/true" default: n) + --resolve enables follow external $refs (same as Spectral --resolve) (default is not enabled, i.e. external references are not resolved and ignored) + ``` + +A linter report will be generated according to the execution as: + +![Example Image](linter-report.png) + +### Linting within CI/CD + +You can trigger linting on your CI/CD pipeline executing `npm test` within the `.gitlab-ci.yml` CI configuration file. + +See the following configuration example: + +```yaml +build: + script: + - npm test + artifacts: + name: "api-linter-report" + paths: + - linter-result.html + when: always +``` + +> The Pipeline will fail if linter results with severity of `warn` (By default) or higher found! + +> You may download or browse the report file in the job artifact page directly no matter CI job failed or succeeded. + +### Selection of rulesets + +The package provides several rulesets according to Siemens REST API guidelines.
+> They can be included as needed by providing a project specific `.spectral.yml` file on the projects root directory as follows: +```yaml +extends: + - "@siemens/api-linter/rulesets/siemens-api-media-type.yml" + - "@siemens/api-linter/rulesets/siemens-api-versioning.yml" + - "@siemens/api-linter/rulesets/siemens-api-error-reporting.yml" + - "@siemens/api-linter/rulesets/siemens-api-filtering.yml" + - "@siemens/api-linter/rulesets/siemens-api-sparse-fieldsets.yml" + - "@siemens/api-linter/rulesets/siemens-api-pagination.yml" + - "@siemens/api-linter/rulesets/siemens-api-sorting.yml" + - "@siemens/api-linter/rulesets/siemens-api-common-operation.yml" + - "@siemens/api-linter/rulesets/siemens-api-security.yml" +``` +> You MAY use as below to achieve this for guideline linting `WITHOUT` `"spectral:oas"`. +```yaml +extends: + - "@siemens/api-linter/rulesets/siemens-api-express.yml" +``` +> `OR` just extends the `ALL-IN-ONE` ruleset which with `"spectral:oas"` enabled. +```yaml +extends: + - "@siemens/api-linter/rulesets/siemens-api.yml" +``` +### Disable any Ruleset or Rules +> You can disable any rules/rulesets as you wish by [Stoplight Spectral](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview). +```yaml +#e.g. disable spectral:oas ruleset and disable Siemens-API-[400] rules from the extended ruleset +extends: + - "@siemens/api-linter/rulesets/siemens-api.yml" + - ["spectral:oas", "off"] + +rules: + Siemens-API-[400]: false + Siemens-API-[401]: false +``` + +### Define rule dependency relations +> Sometimes, if you don't want to follow a ruleC that under a high level ruleP, which means when ruleP failed, you don't want to check ruleC. +Then we can define the rules with `"x-dependsOn"` attribute. +```yaml +#e.g. Siemens-API-[101.8.1] depends on Siemens-API-[101.8] +extends: + - "@siemens/api-linter/rulesets/siemens-api.yml" + +rules: + Siemens-API-[101.8.1]: + x-dependsOn: + - Siemens-API-[101.8] +``` + +## Integration Using JavaScript +> In case you want to handle the linting results by yourself +```javascript +const {validator} = require('@siemens/api-linter/src/extension'); +const {DiagnosticSeverity} = require('@stoplight/types'); +const path = require("path"); +const validate = validator(); + +const validateDoc = function(){ + const ruleSetFilePath = path.resolve(__dirname, 'reference-api-specs/.spectral.yml'); + const apiSpecFilePath = path.resolve(__dirname, 'reference-api-specs/openapi-prod.yml'); + validate(apiSpecFilePath, ruleSetFilePath).then(result => { + const diagnostics = []; + for (let msg of result.results || []){ + if (msg.severity <= DiagnosticSeverity.Information ){ + var diagnostic = { value: msg.code, severity: msg.severity, message: msg.message }; + diagnostics.push(diagnostic); + } + } + // Add your own processes to handle diagnostic array; + }); +} +validateDoc(); +``` + diff --git a/api-linter/example/openapi.yml b/api-linter/example/openapi.yml new file mode 100644 index 0000000..f90ed5d --- /dev/null +++ b/api-linter/example/openapi.yml @@ -0,0 +1,1525 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. + + The API models an educational system. It allows to manage courses, their + individual lessons, the rooms where lessons take place as well as people + acting as teachers and/or participants of courses. + + **Feature Guide** + + Different parts in this API illustrate different aspects and complexities of the API guidelines: + + * Complexity: Courses endpoints try to showcase the full capabilities of REST API. However, also + simple APIs can be modeled with REST API as shown with the Rooms endpoints. + * Pagination approaches: Courses and and People resource collections use index-based + pagination. Rooms use cursor-based pagination. Messages use offset-based pagination. + * Added API version either in URI path or custom request header are supported. + * Added self links example for hypermedia controls following Maturity Model. + * Removed all REST-specific rules which were based on the JSON:API guidelines from this version. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. + - name: Courses + description: | + Courses consist of lessons and have participants and teachers assigned. + Participants can be assigned and de-assigned from a course in batch by using + the relationships endpoint. Teachers can be added or removed from a course + only via the course's update method. + - name: Lessons + description: | + Lessons describe the concrete occurrences of the lectures of a course. Each + lesson is part of a course and gets deleted when that course is deleted. + A lesson describes one regular time slot for a course and relates to the + corresponding room. Lessons can be retrieved as included relationships of + courses or rooms. + - name: People + description: | + People can participate or teach courses. The assignment as participant or + teacher is done at the corresponding course resource. +paths: + /courses: + post: + summary: Creates a Course + description: | + Create a Course with the request content by this post action. + operationId: CreateCourse + tags: + - Courses + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CourseCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/CourseCreationResponse" + default: + $ref: "#/components/responses/DefaultErrors" + get: + summary: Queries Courses + description: | + Query a collection of Courses with the request by this get action. + operationId: ReadCourses + tags: + - Courses + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CoursesReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,name + - name: number + in: query + description: Page number, starting with index 0. + schema: + type: integer + default: 0 + - name: size + in: query + description: Desired number of elements to be returned per page. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + description: Sorts resources returned in response according to values of provided attribute. Default direction is ascending. Descending direction is denoted by prepending a - to the attribute name. + required: false + schema: + type: string + enum: + - id + - name + "/courses/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Course resource. + schema: + type: string + example: 302492f2-7a65-4b90-b2b4-065d4e25d4d2 + get: + summary: Returns a Course + description: | + Query the specified Course according to the id parameter by this get action. + operationId: ReadCourse + tags: + - Courses + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CourseReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,name,startDate,endDate + patch: + summary: Updates a Course + description: | + Update the specified Course according to the id parameter by this patch action. + operationId: UpdateCourse + tags: + - Courses + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CourseUpdateRequest" + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CourseUpdateResponse" + default: + $ref: "#/components/responses/DefaultErrors" + delete: + summary: Deletes a Course + description: | + Delete the specified Course according to the id parameter by this delete action. + operationId: DeleteCourse + tags: + - Courses + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + "/courses/{id}/lessons": + parameters: + - name: id + in: path + required: true + description: Identifier of a Course resource. + schema: + type: string + example: 541edcc2-f21a-4328-8ca4-c2d56823635c + get: + summary: Returns the Lessons of the Course + description: | + Query the related Lessons of the specified Course according to the id parameter by this get action. + operationId: ReadCourseRelatedLessons + tags: + - Courses + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CourseRelatedLessonsResponse" + default: + $ref: "#/components/responses/DefaultErrors" + "/courses/{id}/participants": + parameters: + - name: id + in: path + required: true + description: Identifier of a Course resource. + schema: + type: string + example: ce249dd4-2215-45bb-8f52-e447192ef3a7 + post: + summary: Adds a Person to the Course + description: | + Add People with the participant relation to the specified Course according to the id parameter by this post action. + operationId: AddCourseParticipants + tags: + - Courses + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CourseParticipantsRequest" + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + get: + summary: Returns the Person from the Course + description: | + Query the People with participant relation of the specified Course according to the id parameter by this get action. + operationId: ReadCourseParticipants + tags: + - Courses + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CourseParticipantsResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: number + in: query + description: Page number, starting with index 0. + schema: + type: integer + default: 1 + - name: size + in: query + description: Desired number of elements to be returned per page. A server may return less elements. + schema: + type: integer + default: 1 + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,name,email + - name: sort + in: query + description: Sorts resources returned in response according to values of provided attribute. Default direction is ascending. Descending direction is denoted by prepending a - to the attribute name. + required: false + schema: + type: string + enum: + - id + - name + - email + delete: + summary: Removes the Person from the Course + description: | + Remove the People with participant relation of the specified Course according to the id parameter by this delete action. + operationId: RemoveCourseParticipants + tags: + - Courses + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + "/courses/{id}/teacher": + parameters: + - name: id + in: path + required: true + description: Identifier of a Course resource. + schema: + type: string + example: 275bd2a1-e6cb-4ec3-80f3-22167c6bcaab + get: + summary: Returns the Teacher of the Course + description: | + Query the People with teacher relation of the specified Course according to the id parameter by this get action. + operationId: ReadCourseTeacher + tags: + - Courses + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/CourseRelatedTeacherResponse" + default: + $ref: "#/components/responses/DefaultErrors" + post: + summary: Adds a Teacher to the Course + description: | + Add People with the teacher relation to the specified Course according to the id parameter by this post action. + operationId: AddCourseTeacher + tags: + - Courses + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CourseRelatedTeacherRequest" + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + /lessons: + post: + summary: Creates a Lesson + description: | + Create a Lesson with the request content by this post action. + operationId: CreateLesson + tags: + - Lessons + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/LessonCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/LessonCreationResponse" + default: + $ref: "#/components/responses/DefaultErrors" + "/lessons/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Lesson resource. + schema: + type: string + example: c7cafbb8-f4f3-4cb7-818e-389395abf815 + patch: + summary: Updates a Lesson + description: | + Update a Lesson with the request content by this patch action. + operationId: UpdateLesson + tags: + - Lessons + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/LessonUpdateRequest" + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/LessonUpdateResponse" + default: + $ref: "#/components/responses/DefaultErrors" + /people: + post: + summary: Creates a Person + description: | + Create a Person with the request content by this post action. + operationId: CreatePerson + tags: + - People + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PersonCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/PersonCreationResponse" + default: + $ref: "#/components/responses/DefaultErrors" + get: + summary: Queries People + description: | + Query a collection of People with the request by this get action. + operationId: ReadPeople + tags: + - People + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/PeopleReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,name,email + - name: number + in: query + description: Page number, starting with index 0. + schema: + type: integer + default: 0 + - name: size + in: query + description: Desired number of elements to be returned per page. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + description: Sorts resources returned in response according to values of provided attribute. Default direction is ascending. Descending direction is denoted by prepending a - to the attribute name. + required: false + schema: + type: string + enum: + - id + - name + - email + "/people/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Person resource. + schema: + type: string + example: 21ee45c0-ea33-4a81-affc-4e211cc1c6c0 + get: + summary: Returns a Person + description: | + Query the specified Person according to the id parameter by this get action. + operationId: ReadPerson + tags: + - People + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/PersonReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,name,email + patch: + summary: Updates a Person + description: | + Update the specified Person according to the id parameter by this patch action. + operationId: UpdatePerson + tags: + - People + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PersonUpdateRequest" + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/PersonUpdateResponse" + default: + $ref: "#/components/responses/DefaultErrors" + delete: + summary: Deletes a Person + description: | + Delete the specified Person according to the id parameter by this delete action. + operationId: DeletePerson + tags: + - People + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + "/people/{id}/participated-courses": + parameters: + - name: id + in: path + required: true + description: Identifier of a Person resource. + schema: + type: string + example: 5428aa10-95ff-478e-b72c-83496c2df4d9 + get: + summary: Returns related Courses + description: | + Query the Courses particifated by the specified Person according to the id parameter by this get action. + operationId: ReadPersonRelatedParticipatedCourses + tags: + - People + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/PersonRelatedParticipatedCoursesResponse" + default: + $ref: "#/components/responses/DefaultErrors" + "/people/{id}/taught-courses": + parameters: + - name: id + in: path + required: true + description: Identifier of a Person resource. + schema: + type: string + example: 0cb649e5-2d08-4e12-9fef-53968b716df5 + get: + summary: Returns related Courses + description: | + Query the Courses taught by the specified Person according to the id parameter by this get action. + operationId: ReadPersonRelatedTaughtCourses + tags: + - People + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/PersonRelatedTaughtCoursesResponse" + default: + $ref: "#/components/responses/DefaultErrors" + /rooms: + post: + summary: Creates a Room + description: | + Create a Room with the request content by this post action. + operationId: CreateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationResponse" + default: + $ref: "#/components/responses/DefaultErrors" + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: fields + in: query + description: Returns only provided fields (attributes or relationships) for resource Course. + required: false + schema: + type: string + default: id,code,creationDate + - name: number + in: query + description: Opaque cursor to fetch specific page + schema: + type: integer + default: 1 + - name: size + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + description: Sorts resources returned in response according to values of provided attribute. Default direction is ascending. Descending direction is denoted by prepending a - to the attribute name. + required: false + schema: + type: string + enum: + - id + - code + - creationDate + "/rooms/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: 7eeea381-872c-4b83-a228-31878e5b8de8 + get: + summary: Returns a Room + description: | + Query the specified Room according to the id parameter by this get action. + operationId: ReadRoom + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" + patch: + summary: Updates a Room + description: | + Update the specified Room according to the id parameter by this patch action. + operationId: UpdateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateRequest" + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateResponse" + default: + $ref: "#/components/responses/DefaultErrors" + delete: + summary: Deletes a Room + description: | + Delete the specified Room according to the id parameter by this delete action. + operationId: DeleteRoom + tags: + - Rooms + responses: + "204": + description: No content + default: + $ref: "#/components/responses/DefaultErrors" + "/rooms/{id}/lessons": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: d884dcae-fdff-4992-bc0b-22573a5ae4a5 + get: + summary: Returns related Lessons + description: | + Query the related Lessons of the specified Room according to the id parameter by this get action. + operationId: ReadRoomRelatedLessons + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomRelatedLessonsResponse" + default: + $ref: "#/components/responses/DefaultErrors" + parameters: + - name: cursor + in: query + description: Opaque cursor to fetch specific page + schema: + type: string + default: opaque identifier + - name: limit + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 +components: + schemas: + CourseBase: + type: object + description: | + A course represents a scheduled set of lessons, participants, and a teacher related to a specific learning topic. + properties: + name: + type: string + example: Numerical Mathematics I + description: Name of the course. May be not unique. + startDate: + type: string + format: date + example: 2022-02-02 + description: Date when first lesson takes place + endDate: + type: string + format: date + example: 2022-07-27 + description: Date when last lesson takes place + Course: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 822a6549-4fd8-478a-b5ed-73bef7a066f4 + - $ref: "#/components/schemas/CourseBase" + CourseLink: + allOf: + - $ref: "#/components/schemas/CourseBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + CourseCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/CourseBase" + CourseCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/CourseLink" + CourseReadResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/CourseBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + participants: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + description: "#servers/url" + teacher: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + description: "#servers/url" + CourseRelatedLessonsResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/LessonLink" + CourseRelatedTeacherRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonLink" + CourseRelatedTeacherResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonLink" + CourseParticipantsRequest: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: "#/components/schemas/Person" + CourseParticipantsResponse: + type: object + required: + - data + properties: + data: + type: array + items: + $ref: "#/components/schemas/PersonLink" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses/1/participants?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses/1/participants?page=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + CourseUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Course" + CourseUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/CourseLink" + CoursesReadResponse: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/CourseBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + participants: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + description: "#servers/url" + teacher: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + LessonBase: + type: object + description: Regularly scheduled occurrence of a course, associated to a room. + properties: + weekday: + type: integer + format: date-wday + pattern: '^[1-7]$' + example: 1 + description: | + Weekday where the lesson takes place, according to [RFC3339](https://datatracker.ietf.org/doc/html/rfc3339#appendix-A). + frequency: + type: string + enum: + - Weekly + - Bi-Weekly + - Monthly + description: How often the lesson takes place + begin: + type: string + format: date + example: 2022-02-07 + description: First time the lesson takes place, according to [RFC3339](https://datatracker.ietf.org/doc/html/rfc3339). + duration: + type: string + format: duration + example: PT1H + description: Duration of the lesson, according to [RFC3339](https://datatracker.ietf.org/doc/html/rfc3339#appendix-A). + Lesson: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: d8272c80-62b1-43b3-ba84-02cbe0aab5a2 + - $ref: "#/components/schemas/LessonBase" + LessonLink: + allOf: + - $ref: "#/components/schemas/LessonBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + + LessonCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/LessonBase" + links: + type: object + properties: + course: + type: string + example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + room: + type: string + example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + LessonCreationResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/LessonLink" + - type: object + properties: + links: + type: object + properties: + course: + type: string + example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + room: + type: string + example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + LessonUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Lesson" + LessonUpdateResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/LessonLink" + - type: object + properties: + links: + type: object + properties: + course: + type: string + example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + room: + type: string + example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + RoomPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + self: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + first: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + last: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + next: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + LessonPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + self: + type: string + example: https://api.siemens.com/reference/api/lessons?limit=1 + description: | + Opaque cursor to fetch next elements. To be used as value of query parameter cursor. + Is only added if more elements are present. + next: + type: string + example: https://api.siemens.com/reference/api/lessons?cursor=cXdlcnR5&limit=1 + description: Returned the next elements after the cursor. + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + elements: + type: integer + example: 100 + description: Amount of elements available. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. + PeopleReadResponse: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/PersonBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + description: "#servers/url" + participantdCourses: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + taughtCourses: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/people?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/people?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/people?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/people?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + PersonBase: + type: object + description: A person can participate in or teach courses. + properties: + name: + type: string + example: Jane Doe + description: Full name of the person + email: + type: string + example: jane.doe@xcelerator.com + description: Email context of the person + Person: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 54293c17-a305-4349-81d5-83001e9e4032 + - $ref: "#/components/schemas/PersonBase" + PersonLink: + allOf: + - $ref: "#/components/schemas/PersonBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + PersonCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonBase" + PersonCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonLink" + PersonReadResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/PersonBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + participantdCourses: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + taughtCourses: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + description: "#servers/url" + PersonRelatedParticipatedCoursesResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/CourseLink" + PersonRelatedTaughtCoursesResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/CourseLink" + PersonUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonLink" + PersonUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/PersonLink" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Room: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 846650de-20fd-4197-867b-00ac7606cffd + - $ref: "#/components/schemas/RoomBase" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + RoomCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomReadResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomRelatedLessonsResponse: + type: object + required: + - data + - meta + properties: + data: + $ref: "#/components/schemas/Lesson" + links: + $ref: "#/components/schemas/LessonPageCursor" + RoomUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Room" + RoomUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomsReadResponse: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + $ref: "#/components/schemas/RoomPageCursor" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "404" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. + responses: + DefaultErrors: + description: Standard errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" + examples: + Forbidden: + $ref: "#/components/examples/Forbidden" + InternalError: + $ref: "#/components/examples/InternalError" + InvalidBodyProperty: + $ref: "#/components/examples/InvalidBodyProperty" + InvalidBodyPropertyValue: + $ref: "#/components/examples/InvalidBodyPropertyValue" + InvalidParameter: + $ref: "#/components/examples/InvalidParameter" + InvalidParameterValue: + $ref: "#/components/examples/InvalidParameterValue" + TooManyRequests: + $ref: "#/components/examples/TooManyRequests" + Unauthorized: + $ref: "#/components/examples/Unauthorized" + examples: + Forbidden: + summary: forbidden + value: + errors: + - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 + status: "403" + code: forbidden + title: Forbidden + detail: The provided authorization means did not contain suitable permissions. + InternalError: + summary: internalError + value: + errors: + - id: a373b344-3e5c-4e2b-b282-c3808d455501 + status: "500" + code: internalError + title: Internal error + detail: An internal error has occurred. + InvalidBodyProperty: + summary: invalidBodyProperty + value: + errors: + - id: eeb556b9-68be-48a6-b131-c9d744684084 + status: "400" + code: invalidBodyProperty + title: Invalid request body property + detail: Provided request body property '{property}' is invalid. + InvalidBodyPropertyValue: + summary: invalidBodyPropertyValue + value: + errors: + - id: d2755b4b-7397-43d5-a348-0ec1e8b1e31a + status: "400" + code: invalidBodyPropertyValue + title: Invalid request body property value + detail: Provided value '{value}' of request body property '{property}' is invalid. + InvalidParameter: + summary: invalidParameter + value: + errors: + - id: 18d1d99b-5658-4b27-95b5-890973d4a8f1 + status: "400" + code: invalidParameter + title: Invalid request parameter + detail: Provided request parameter '{parameter}' is invalid. + InvalidParameterValue: + summary: invalidParameterValue + value: + errors: + - id: 9fffd3aa-6916-43ad-94f3-42f96775a4cc + status: "400" + code: invalidParameterValue + title: Invalid request parameter value + detail: Provided value '{value}' of request parameter '{parameter}' is invalid. + TooManyRequests: + summary: tooManyRequests + value: + errors: + - id: f774e735-9135-456c-ac4a-00cc2128f19f + status: "429" + code: tooManyRequests + title: Too many requests + detail: The server is temporarily throttling requests from the client. + Unauthorized: + summary: unauthorized + value: + errors: + - id: dcfe5037-3380-4719-89d0-1a613d8a229c + status: "401" + code: unauthorized + title: Unauthorized request + detail: No valid authorization means was provided in the request. diff --git a/api-linter/package.json b/api-linter/package.json new file mode 100644 index 0000000..a729411 --- /dev/null +++ b/api-linter/package.json @@ -0,0 +1,47 @@ +{ + "name": "@siemens/api-linter", + "version": "0.8.4", + "description": "A linter tool with Rulesets follow Siemens REST API Guidelines", + "homepage": "https://github.com/siemens/lint", + "author": { + "name": "Siemens", + "email": "opensource@siemens.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/siemens/lint.git" + }, + "keywords": [ + "siemens", + "restapi", + "guidelines", + "lint", + "report" + ], + "main": "./src/index.js", + "bin":{ + "api-linter": "./src/index.js" + }, + "scripts": { + "test": "jest", + "dev": "node src/index.js" + }, + "dependencies": { + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-ruleset-bundler": "^1.5.2", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@jamietanna/spectral-test-harness": "^0.3.0", + "handlebars": "^4.7.7", + "commander": "^12.0.0", + "underscore": "^1.13.1", + "standard": "^17.0.0", + "js-yaml": "^4.1.0", + "jsonpath": "^1.1.1" + }, + "devDependencies": { + "jest": "^29.0.0", + "jest-junit": "^16.0.0", + "jsonpath": "^1.1.1" + } +} \ No newline at end of file diff --git a/api-linter/rulesets/functions/assert-http-codes-for-operation.js b/api-linter/rulesets/functions/assert-http-codes-for-operation.js new file mode 100644 index 0000000..bf3b9f2 --- /dev/null +++ b/api-linter/rulesets/functions/assert-http-codes-for-operation.js @@ -0,0 +1,31 @@ +export default (targetValue, { wellUnderstood }, context) => { + const result = []; + if (targetValue === null || typeof targetValue !== 'object') { + return result; + } + for (const verb of Object.keys(targetValue)) { + const responses = targetValue[verb].responses || {}; + if (responses === null || typeof responses !== 'object') { + continue; + } + for (const code of Object.keys(responses)) { + if (!(code in wellUnderstood)) { + result.push({ + message: `${code} is not a well-understood HTTP status code`, + path: [...context.path, verb, 'responses', code], + }); + continue; + } + const allowedVerbs = wellUnderstood[code].map((verb) => verb.toUpperCase()); + const upperCaseVerb = verb.toUpperCase(); + if (!allowedVerbs.includes('ALL') && !allowedVerbs.includes(upperCaseVerb)) { + result.push({ + message: `${code} is not a well-understood HTTP status code for ${upperCaseVerb}`, + path: [...context.path, verb, 'responses', code], + }); + continue; + } + } + } + return result; +}; diff --git a/api-linter/rulesets/functions/count-resource-types.js b/api-linter/rulesets/functions/count-resource-types.js new file mode 100644 index 0000000..f477384 --- /dev/null +++ b/api-linter/rulesets/functions/count-resource-types.js @@ -0,0 +1,19 @@ +'use strict'; + +const extractResourceTypeFromPath = (path) => { + return path.split('/')[path.startsWith('/') ? 1 : 0]; +}; + +export default (targetValue, { max }) => { + const paths = Object.keys(targetValue); + if (paths.length <= max) return []; + + const resourcesTypes = new Set(paths.map(extractResourceTypeFromPath)); + if (resourcesTypes.size <= max) return []; + + return [ + { + message: `More than ${max} resource types found`, + }, + ]; +}; diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js new file mode 100644 index 0000000..cadd047 --- /dev/null +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js @@ -0,0 +1,98 @@ +const jp = require('jsonpath') + +const isCollectionResponse = (schema) => { + var props = jp.query(schema, '$.properties.data'); + if (props.length>0){ + if ( props[0].type == 'array') { + return true; + } + } + return false; +}; + +const hasTopLink = (schema) => { + var props = jp.query(schema, '$.properties.links'); + if (props.length>0){ + return true; + } + return false; +}; + +const pageLinkKeys = ["first", "last", "prev", "next"]; + +const hasPageLinkKeys = (prob) => { + var has = false; + pageLinkKeys.forEach(key => { + if(key in prob) { + has = true; + } + }); + return has; +} + +const followCursorBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; +} + +const followOffsetBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; +} + +const followIndexBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; +} + +const checkCursorMeta = (meta) => { + return jp.query(meta, '$.properties.page.properties.nextCursor').length > 0 +} + +const checkOffsetMeta = (meta) => { + return jp.query(meta, '$.properties.page.properties.totalElements').length > 0 + && jp.query(meta, '$.properties.page.properties.offset').length > 0 + && jp.query(meta, '$.properties.page.properties.elements').length > 0 +} + +const checkIndexMeta = (meta) => { + return jp.query(meta, '$.properties.page.properties.totalPages').length > 0 + && jp.query(meta, '$.properties.page.properties.number').length > 0 + && jp.query(meta, '$.properties.page.properties.size').length > 0 +} + +const checkIndexMeta2 = (meta) => { + return jp.query(meta, '$.properties.page.properties.elements').length > 0 + && jp.query(meta, '$.properties.page.properties.totalElements').length > 0 +} + +export default (targetValue, options) => { + var responseSchema = jp.query(targetValue, '$.responses..schema'); + if (responseSchema.length > 0){ + var schema = responseSchema[0]; + if (isCollectionResponse(schema) && hasTopLink(schema)){ + var linkProps = jp.query(schema, '$.properties.links.properties'); + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); + var responseMeta = jp.query(schema, "$.properties.meta"); + if (options == 'cursor' && requestQueryParameters.length > 0 && followCursorBasedStrategies(requestQueryParameters)){ + if (responseMeta.length == 0 || !checkCursorMeta(responseMeta[0])){ + return [{message: 'The server MAY provide information about the nextCursor that is required to fetch the next page in the meta.page.nextCursor property'}]; + } + } + if (options == 'offset' && requestQueryParameters.length > 0 && followOffsetBasedStrategies(requestQueryParameters)){ + if (responseMeta.length == 0 || !checkOffsetMeta(responseMeta[0])){ + return [{message: 'Server SHOULD provide pagination meta [meta.page.totalElements, meta.page.offset, meta.page.elements] information to the client'}]; + } + } + if (options == 'index1' && requestQueryParameters.length > 0 && followIndexBasedStrategies(requestQueryParameters)){ + if (responseMeta.length == 0 || !checkIndexMeta(responseMeta[0])){ + return [{message: 'Server SHOULD provide pagination meta [meta.page.totalPages, meta.page.number, meta.page.size] information to the client'}]; + } + } + if (options == 'index2' && requestQueryParameters.length > 0 && followIndexBasedStrategies(requestQueryParameters)){ + if (responseMeta.length == 0 || (checkIndexMeta(responseMeta[0]) && !checkIndexMeta2(responseMeta[0]))) { + return [{message: 'Server SHOULD provide pagination meta [meta.page.elements, meta.page.totalElements] information to the client'}]; + } + } + } + } + } +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js new file mode 100644 index 0000000..76a54a0 --- /dev/null +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js @@ -0,0 +1,60 @@ +const jp = require('jsonpath') + +const isCollectionResponse = (schema) => { + var props = jp.query(schema, '$.properties.data'); + if (props.length>0){ + if ( props[0].type == 'array') { + return true; + } + } + return false; +}; + +const hasTopLink = (schema) => { + var props = jp.query(schema, '$.properties.links'); + if (props.length>0){ + return true; + } + return false; +}; + +const pageLinkKeys = ["first", "last", "prev", "next"]; + +const hasPageLinkKeys = (prob) => { + var has = false; + pageLinkKeys.forEach(key => { + if(key in prob) { + has = true; + } + }); + return has; +} + +const followCursorBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; +} + +const followOffsetBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; +} + +const followIndexBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; +} + +export default (targetValue) => { + var responseSchema = jp.query(targetValue, '$.responses..schema'); + if (responseSchema.length > 0){ + var schema = responseSchema[0]; + if (isCollectionResponse(schema) && hasTopLink(schema)){ + var linkProps = jp.query(schema, '$.properties.links.properties'); + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); + if (requestQueryParameters.length == 0 || !(followCursorBasedStrategies(requestQueryParameters) + || followOffsetBasedStrategies(requestQueryParameters) || followIndexBasedStrategies(requestQueryParameters))){ + return [{message: 'Pagination SHOULD be implemented using query parameters.'}]; + } + } + } + } +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js new file mode 100644 index 0000000..10369ff --- /dev/null +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -0,0 +1,94 @@ +const jp = require('jsonpath') + +const isCollectionResponse = (schema) => { + var props = jp.query(schema, '$.properties.data'); + if (props.length>0){ + if ( props[0].type == 'array') { + return true; + } + } + return false; +}; + +const hasTopLink = (schema) => { + var props = jp.query(schema, '$.properties.links'); + if (props.length>0){ + return true; + } + return false; +}; + +const pageLinkKeys = ["first", "last", "prev", "next", "self"]; + +const hasPageLinkKeys = (prob) => { + var has = false; + pageLinkKeys.forEach(key => { + if(key in prob) { + has = true; + } + }); + return has; +} + +const notInPageKeys = (prob) => { + const result = Object.keys(prob).filter(key => !pageLinkKeys.includes(key)); + return result.length > 0; +} + +const followCursorBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; +} + +const followOffsetBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; +} + +const followIndexBasedStrategies = (requestQueryParameters) =>{ + return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; +} + +export default (targetValue, options) => { + //valid only targetValue using pagination + var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); + if (requestQueryParameters.length > 0 && (followCursorBasedStrategies(requestQueryParameters) + || followOffsetBasedStrategies(requestQueryParameters) || followIndexBasedStrategies(requestQueryParameters))){ + var response = jp.query(targetValue, '$.responses..schema'); + if (response.length > 0){ + var responseSchema = response[0]; + //optionA: A server MAY provide links to traverse a paginated data set + //optionB: Pagination links SHOULD appear in the top-level links object. + //optionC: Pagination links MUST preserve sorting and filtering. + //optionD: Naming convention MUST be used for pagination keys. + if (options == 'A'){ + if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)){ + return [{message: 'A server MAY provide links to traverse a paginated data set'}]; + } + else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0 ){ + return [{message: 'A server MAY provide links to traverse a paginated data set'}]; + } + } + } + if (options == 'B') { + if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + var linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + return [{message: 'Pagination links SHOULD appear in the top-level links object.'}]; + } + } + } + if (options == 'D') { + if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + if (linkProps.filter(prob => notInPageKeys(prob)).length > 0){ + return [{message: 'Naming convention MUST be used for pagination keys.'}]; + } + } + } + } + } + } + +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/get-resources-has-parameter.js b/api-linter/rulesets/functions/get-resources-has-parameter.js new file mode 100644 index 0000000..9e7a27b --- /dev/null +++ b/api-linter/rulesets/functions/get-resources-has-parameter.js @@ -0,0 +1,19 @@ +const jp = require('jsonpath') + +const isCollectionResponse = (schema) => { + var props = jp.query(schema, '$.responses.*..data'); + if (props.length>0){ + if ( props[0].type == 'array') { + return true; + } + } + return false; +}; + +export default (targetValue, options) => { + if (isCollectionResponse(targetValue)){ + if(targetValue.parameters == null || targetValue.parameters.filter((r) => r.in === 'query' && r.name === options).length == 0){ + return [{message: 'API MAY provide projection of '+ options +' in response'}]; + } + } +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/get-status-code.js b/api-linter/rulesets/functions/get-status-code.js new file mode 100644 index 0000000..406947c --- /dev/null +++ b/api-linter/rulesets/functions/get-status-code.js @@ -0,0 +1,59 @@ +'use strict'; +const jp = require('jsonpath') + +const checkIsTypeOfOption = (schema, options) => { + var props = jp.query(schema, '$..*..data'); + if (Array.isArray(props) && props.length > 0){ + if (options == 'individual' && ((props[0] != null && props[0].type == 'object') + || (props[0].allOf!=null && props[0].allOf[0].type == 'object'))) { + return true; + } + else if (options == 'collection' && (props[0].type == 'array')) { + return true; + } + return false; + } + else { + if (options == 'individual' & props.type == 'object') { + return true; + } + else if (options == 'collection' && props.type == 'array') { + return true; + } + return false; + } +}; + +const checkOption = (object, options) => { + var schemas = jp.query(object, '$..content..schema'); + var isTypeOfOption = false; + if (Array.isArray(schemas) && schemas.length > 0){ + schemas.filter(schema => typeof schema === 'object' && schema !== null).forEach(schema => { + isTypeOfOption = isTypeOfOption || checkIsTypeOfOption(schema, options); + }) + return isTypeOfOption; + } + return true; +}; + +export default (targetValue, options) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + const results = []; + if (options=='individual' && checkOption(targetValue, options)){ + if(typeof targetValue['200'] == 'undefined'){ + results.push({message: "A Successful fetch of individual resources MUST return the status code 200"}) + } + } + else if(options=='collection' && checkOption(targetValue, options)){ + var exist = false; + for(var key in targetValue){ + if (key.match("^2\\d\\d$")){ + exist = true; + } + } + if (!exist){ + results.push({message: "A successful fetch of resource collection request MUST return a 2xx status code"}) + } + } + return results; +}; diff --git a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js new file mode 100644 index 0000000..c844633 --- /dev/null +++ b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js @@ -0,0 +1,21 @@ +export default (targetVal, options) => { + if (typeof targetVal !== 'object' || targetVal == null) return; + const results = []; + if (targetVal.parameters == null){ + results.push({message: 'No parameters provided.'}) + return results; + } + var params = targetVal.parameters; + var exist = false; + for (const param of params){ + for (const ops of options){ + if (param[ops['property']] === ops['value'] && param['in'] === "header"){ + exist = true; + } + } + } + if (!exist){ + results.push({message: 'No header parameter provided in the options'}) + } + return results; +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/has-headers-with-property.js b/api-linter/rulesets/functions/has-headers-with-property.js new file mode 100644 index 0000000..6f89dbf --- /dev/null +++ b/api-linter/rulesets/functions/has-headers-with-property.js @@ -0,0 +1,11 @@ +export default (targetVal, options) => { + if (typeof targetVal !== 'object' || targetVal == null) return; + const results = []; + if (typeof targetVal["headers"] == 'undefined'){ + results.push({message: "Response should have headers for Api-Version"}) + } + else if (typeof targetVal["headers"][options['property']] == 'undefined'){ + results.push({message: "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'"}) + } + return results; +}; \ No newline at end of file diff --git a/api-linter/rulesets/functions/is-meta-object.js b/api-linter/rulesets/functions/is-meta-object.js new file mode 100644 index 0000000..39f5009 --- /dev/null +++ b/api-linter/rulesets/functions/is-meta-object.js @@ -0,0 +1,29 @@ +'use strict'; + +const assertObjectSchema = (schema) => { + if (schema.type !== 'object') { + throw 'Schema type is not `object`'; + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertObjectSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/is-object-schema.js b/api-linter/rulesets/functions/is-object-schema.js new file mode 100644 index 0000000..145d307 --- /dev/null +++ b/api-linter/rulesets/functions/is-object-schema.js @@ -0,0 +1,29 @@ +'use strict'; + +const assertObjectSchema = (schema) => { + if (schema.type !== 'object' && !schema.$ref) { + throw 'Schema type is not `object`'; + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertObjectSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/is-problem-json-schema.js b/api-linter/rulesets/functions/is-problem-json-schema.js new file mode 100644 index 0000000..8f7fdd1 --- /dev/null +++ b/api-linter/rulesets/functions/is-problem-json-schema.js @@ -0,0 +1,68 @@ +'use strict'; + +/* +Minimal required problem json schema: + +type: object +properties: + type: + type: string + format: uri + title: + type: string + status: + type: integer + format: int32 + detail: + type: string + instance: + type: string +*/ + +const assertProblemSchema = (schema) => { + if (schema.type !== 'object') { + throw "Problem json must have type 'object'"; + } + const type = (schema.properties || {}).type || {}; + if (type.type !== 'string' || type.format !== 'uri') { + throw "Problem json must have property 'type' with type 'string' and format 'uri'"; + } + const title = (schema.properties || {}).title || {}; + if (title.type !== 'string') { + throw "Problem json must have property 'title' with type 'string'"; + } + const status = (schema.properties || {}).status || {}; + if (status.type !== 'integer' || status.format !== 'int32') { + throw "Problem json must have property 'status' with type 'integer' and format 'int32'"; + } + const detail = (schema.properties || {}).detail || {}; + if (detail.type !== 'string') { + throw "Problem json must have property 'detail' with type 'string'"; + } + const instance = (schema.properties || {}).instance || {}; + if (instance.type !== 'string') { + throw "Problem json must have property 'instance' with type 'string'"; + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertProblemSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/links-has-self.js b/api-linter/rulesets/functions/links-has-self.js new file mode 100644 index 0000000..c777fb4 --- /dev/null +++ b/api-linter/rulesets/functions/links-has-self.js @@ -0,0 +1,42 @@ +'use strict'; +const jp = require('jsonpath') + +const checkSelf = (link) => { + if (link["self"] == null){ + throw 'self property not found in links object'; + } +} + +const assertLinkSchema = (schema) => { + const paths = jp.paths(schema, '$..*..links.properties'); + + for (const path of paths) { + if (path.some(p => p === 'relationships')) { + continue; + } + const link = jp.value(schema, jp.stringify(path)); + checkSelf(link); + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertLinkSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js new file mode 100644 index 0000000..3506ad3 --- /dev/null +++ b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js @@ -0,0 +1,34 @@ +'use strict'; + +const validateResource = (resource) => { + if (! /^([a-z][a-z0-9]*)((-)[a-z0-9]+)*$/ .test(resource)){ + throw "Resource names SHOULD be in lowercase with hyphen"; + } +} + +const check = (path) => { + if (path == null) { + return; + } + var resources = path.split('/'); + for (let index = 0; index < resources.length; index++) { + const element = resources[index]; + if (element.length > 0 && !element.startsWith('{') && !element.endsWith('}')) + { + validateResource(element); + } + } +}; + +export default (targetValue) => { + if (targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/query-parameters-length.js b/api-linter/rulesets/functions/query-parameters-length.js new file mode 100644 index 0000000..965584e --- /dev/null +++ b/api-linter/rulesets/functions/query-parameters-length.js @@ -0,0 +1,18 @@ +export default (targetValue, options) => { + if (targetValue == null) return; + var checkField = options.nameCheck != null; + var queryParameterCount = targetValue.filter((r) => r.in === 'query').length; + var hasFilter = targetValue.filter((r) => r.in === 'query' && r.name === 'filter').length > 0; + if (((queryParameterCount > options.max && !hasFilter) || (hasFilter && queryParameterCount -1 > options.max)) && !checkField){ + return [{message: 'API MAY not support more than '+ options.max + + ' parameters at once for selecting resources. ' + + '(Linter is unable to determine whether the parameter belongs to the filtering condition or not.) ' + }]; + } + if (queryParameterCount > options.max && checkField && !hasFilter){ + return [{message: "The query parameter 'filter' SHOULD be used to filter or query data. " + + "(Linter is unable to determine whether the parameters used for filtering or not.) " + }]; + } +}; + \ No newline at end of file diff --git a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js new file mode 100644 index 0000000..1b2adba --- /dev/null +++ b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js @@ -0,0 +1,37 @@ +'use strict'; + +const assertObjectSchema = (schema) => { + var exist = false; + for(var key in schema.properties) + { + if (key === "data"){ + exist = true; + break; + } + } + if (!exist && !schema.$ref) { + throw 'A request document SHOULD contain at least data property'; + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertObjectSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js new file mode 100644 index 0000000..e637177 --- /dev/null +++ b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js @@ -0,0 +1,38 @@ +'use strict'; + +const assertObjectSchema = (schema) => { + var doc_structure = ["data", "errors", "meta", "links"]; + var exist = false; + for(var key in schema.properties) + { + if (doc_structure.includes(key)){ + exist = true; + break; + } + } + if (!exist) { + throw 'A response document SHOULD contain at least one of the following top-level members:data,errors,meta,links.'; + } +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertObjectSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/schema-test.js b/api-linter/rulesets/functions/schema-test.js new file mode 100644 index 0000000..22bb820 --- /dev/null +++ b/api-linter/rulesets/functions/schema-test.js @@ -0,0 +1,29 @@ +'use strict'; + +const assertObjectSchema = (schema) => { + console.log("==========================================") + console.log(schema) +}; + +const check = (schema) => { + const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; + if (combinedSchemas.length > 0) { + combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); + } else { + assertObjectSchema(schema); + } +}; + +export default (targetValue) => { + if (typeof targetValue !== 'object' || targetValue == null) return; + try { + console.log("*********************************") + check(targetValue); + } catch (ex) { + return [ + { + message: ex, + }, + ]; + } +}; diff --git a/api-linter/rulesets/functions/successful-response-status-code.js b/api-linter/rulesets/functions/successful-response-status-code.js new file mode 100644 index 0000000..83c5d3c --- /dev/null +++ b/api-linter/rulesets/functions/successful-response-status-code.js @@ -0,0 +1,13 @@ +export default (targetValue) => { + const results = []; + var exist = false; + for(var key in targetValue){ + if (key.match("^2\\d\\d$")){ + exist = true; + } + } + if (!exist){ + results.push({message: "API MUST respond successful response with 2xx success status code"}) + } + return results; +}; diff --git a/api-linter/rulesets/functions/validate-b3-tracing.js b/api-linter/rulesets/functions/validate-b3-tracing.js new file mode 100644 index 0000000..4dc9325 --- /dev/null +++ b/api-linter/rulesets/functions/validate-b3-tracing.js @@ -0,0 +1,26 @@ +'use strict'; + +export default (targetValue) => { + if (!Array.isArray(targetValue)) { + return [ + { + message: `No array given, provide $.paths.*.*.parameters`, + }, + ]; + } + + const b3Params = targetValue.filter( + (param) => + param.name && (param.name.toLowerCase() === 'x-b3-traceid' || param.name.toLowerCase() === 'x-b3-spanid'), + ); + + if (b3Params.length !== 2 || !b3Params.every((param) => param.in === 'header')) { + return [ + { + message: `B3 header X-B3-Traceid or X-B3-Spanid missing`, + }, + ]; + } + + return []; +}; diff --git a/api-linter/rulesets/semantic-versioning.yml b/api-linter/rulesets/semantic-versioning.yml new file mode 100644 index 0000000..ab2ea98 --- /dev/null +++ b/api-linter/rulesets/semantic-versioning.yml @@ -0,0 +1,14 @@ +rules: + + Semantic-Versioning-[2.0.0]: + message: '{{error}}' + description: Semantic versioning MUST be used to version individual APIs + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#api-version-numbering + severity: error + given: $.info.version + then: + function: schema + functionOptions: + schema: + type: string + match: '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$' \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-common-operation.yml b/api-linter/rulesets/siemens-api-common-operation.yml new file mode 100644 index 0000000..8b0c78e --- /dev/null +++ b/api-linter/rulesets/siemens-api-common-operation.yml @@ -0,0 +1,115 @@ +functions: + - is-object-schema + - get-status-code + - links-has-self + - successful-response-status-code + - has-header-parameter-with-property-value + +rules: + + Siemens-API-[800.1]: + message: A Successful fetch of individual resources MUST return the status code 200 + description: A server MUST respond to a successful request to fetch an individual resource or resource collection with a 200 status code response. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops800.1 + severity: error + given: $.paths.*.get.responses + then: + function: get-status-code + functionOptions: individual + + Siemens-API-[800.2]: + message: A successful fetch of resource collection request MUST return a 2xx status code + description: A successful fetch of resource collection request MUST return a 2xx status code. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops800.2 + severity: error + given: $.paths.*.get.responses + then: + function: get-status-code + functionOptions: collection + + Siemens-API-[800.4]: + message: '{{error}}' + description: An API Provider MUST support fetching resource data for provided links. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops800.4 + severity: error + given: $.paths..get.responses..content..schema + then: + function: links-has-self + + Siemens-API-[801]: + message: The POST request MUST include a single resource object as primary data + description: The POST request MUST include a single resource object as primary data + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops801 + severity: error + given: $.paths..post.requestBody..content..schema + then: + function: is-object-schema + + Siemens-API-[801.4]: + message: API MUST respond to successful POST creation request with 2xx success status code + description: API MUST respond to successful POST creation request with 2xx success status code + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops801.4 + severity: error + given: $.paths.*.post.responses + then: + function: successful-response-status-code + + Siemens-API-[802.3]: + message: A PATCH request SHOULD address a single resource only + description: A PATCH request SHOULD address a single resource only + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops802.3 + severity: warn + given: $.paths.*.patch.requestBody..content..schema + then: + function: is-object-schema + + Siemens-API-[802.6]: + message: API MUST respond to successful PATCH update request with 2xx success status code + description: API MUST respond to successful PATCH update request with 2xx success status code + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops802.6 + severity: error + given: $.paths.*.patch.responses + then: + function: successful-response-status-code + + Siemens-API-[803.1]: + message: PUT update request SHOULD be provided only for single resource objects + description: PUT update request SHOULD be provided only for single resource objects + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops803.1 + severity: warn + given: $.paths.*.put.requestBody..content..schema + then: + function: is-object-schema + + Siemens-API-[803.2]: + message: API MUST respond to successful PUT update request with 2xx success status code + description: API MUST respond to successful PUT update request with 2xx success status code + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops803.2 + severity: error + given: $.paths.*.put.responses + then: + function: successful-response-status-code + + Siemens-API-[803.6]: + message: The API consumer MAY use conditional header information to solve concurrent update requests + description: To prevent unnoticed concurrent updates when using PUT, the server endpoint MAY consider to support ETag together with If-Match/If-None-Match header + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops803.6 + severity: info + given: $.paths.*.put + then: + function: has-header-parameter-with-property-value + functionOptions: + - property: name + value: If-Match + - property: name + value: If-None-Match + + Siemens-API-[804.1]: + message: MUST respond to successful DELETE request with 2xx success status code + description: MUST respond to successful DELETE request with 2xx success status code + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops804.1 + severity: error + given: $.paths.*.delete.responses + then: + function: successful-response-status-code + diff --git a/api-linter/rulesets/siemens-api-error-reporting.yml b/api-linter/rulesets/siemens-api-error-reporting.yml new file mode 100644 index 0000000..d4dfb8a --- /dev/null +++ b/api-linter/rulesets/siemens-api-error-reporting.yml @@ -0,0 +1,187 @@ +rules: + + Siemens-API-[300]: + message: '{{property}} is not using an official response code' + description: API MUST use official HTTP status codes as intended. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule300 + severity: error + given: $.paths.*.*.responses.*~ + then: + function: enumeration + functionOptions: + values: + - '100' + - '101' + - '102' + - '103' + - '200' + - '201' + - '202' + - '203' + - '204' + - '205' + - '206' + - '207' + - '208' + - '226' + - '300' + - '301' + - '302' + - '303' + - '304' + - '305' + - '306' + - '307' + - '308' + - '400' + - '401' + - '402' + - '403' + - '404' + - '405' + - '406' + - '407' + - '408' + - '409' + - '410' + - '411' + - '412' + - '413' + - '414' + - '415' + - '416' + - '417' + - '418' + - '421' + - '422' + - '423' + - '424' + - '425' + - '426' + - '427' + - '428' + - '429' + - '430' + - '431' + - '451' + - '500' + - '501' + - '502' + - '503' + - '504' + - '505' + - '506' + - '507' + - '508' + - '509' + - '510' + - '511' + - default + + Siemens-API-[301]: + message: '{{property}} is not a standardized response code' + description: SHOULD only use most common HTTP status codes + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule301 + severity: warn + given: $.paths.*.*.responses.*~ + then: + function: enumeration + functionOptions: + values: + - '200' + - '201' + - '202' + - '204' + - '301' + - '303' + - '304' + - '305' + - '307' + - '400' + - '401' + - '403' + - '404' + - '405' + - '406' + - '408' + - '409' + - '412' + - '415' + - '429' + - '500' + - '501' + - '503' + - '504' + - default + + Siemens-API-[302]: + message: '{{property}} is not using most specific HTTP status code for error' + description: Xcelerator API SHOULD use the most specific HTTP status code when returning information about the request processing state or reported error situations + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule302 + severity: warn + given: $.components.examples..*.errors.*.status + then: + function: enumeration + functionOptions: + values: + - '400' + - '401' + - '403' + - '404' + - '405' + - '406' + - '408' + - '409' + - '412' + - '415' + - '429' + - '500' + - '501' + - '503' + + Siemens-API-[305]-1: + message: Error object SHOULD be represented according to the defined structure fields + description: Error object SHOULD be represented according to the defined structure fields + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule305 + severity: warn + given: $.components.schemas.Errors..*..errors.*.properties.*~ + then: + function: enumeration + functionOptions: + values: + - 'id' + - 'code' + - 'status' + - 'title' + - 'detail' + - 'links' + - 'correlationId' + - 'source' + + Siemens-API-[305]-2: + message: 'The error links resource object MAY contain the members: about, type' + description: 'The error links resource object MAY contain the members: about, type' + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule305 + severity: info + given: $.components.schemas.Errors..*..links.properties.*~ + then: + function: enumeration + functionOptions: + values: + - 'about' + - 'type' + + Siemens-API-[305]-3: + message: 'The source object SHOULD include one of the members or be omitted: pointer, parameter, header' + description: 'The source object SHOULD include one of the members or be omitted: pointer, parameter, header' + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule305 + severity: warn + given: $.components.schemas.Errors..*..source.properties.*~ + then: + function: enumeration + functionOptions: + values: + - 'pointer' + - 'parameter' + - 'header' + diff --git a/api-linter/rulesets/siemens-api-express.yml b/api-linter/rulesets/siemens-api-express.yml new file mode 100644 index 0000000..4c30b41 --- /dev/null +++ b/api-linter/rulesets/siemens-api-express.yml @@ -0,0 +1,10 @@ +extends: + - ./siemens-api-media-type.yml + - ./siemens-api-error-reporting.yml + - ./siemens-api-filtering.yml + - ./siemens-api-sparse-fieldsets.yml + - ./siemens-api-pagination.yml + - ./siemens-api-sorting.yml + - ./siemens-api-common-operation.yml + - ./siemens-api-versioning.yml + - ./siemens-api-security.yml \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-filtering.yml b/api-linter/rulesets/siemens-api-filtering.yml new file mode 100644 index 0000000..e647bbf --- /dev/null +++ b/api-linter/rulesets/siemens-api-filtering.yml @@ -0,0 +1,29 @@ +functions: + - query-parameters-length + +rules: + + Siemens-API-[400]: + message: '{{error}}' + description: An API provider SHOULD NOT support more than 4 parameters at once for selecting resources + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/filtering.html#queryingrule400 + severity: hint + given: $.paths..get.parameters + then: + function: query-parameters-length + functionOptions: + max: 4 + + Siemens-API-[401]: + message: '{{error}}' + description: The query parameter filter SHOULD be used to filter or query data + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/filtering.html#queryingrule401 + severity: hint + given: $.paths..get.parameters + then: + function: query-parameters-length + functionOptions: + max: 4 + nameCheck: filter + + diff --git a/api-linter/rulesets/siemens-api-media-type.yml b/api-linter/rulesets/siemens-api-media-type.yml new file mode 100644 index 0000000..552fb99 --- /dev/null +++ b/api-linter/rulesets/siemens-api-media-type.yml @@ -0,0 +1,118 @@ +functions: + - is-object-schema + - is-meta-object + - assert-http-codes-for-operation + - count-resource-types + - is-problem-json-schema + - response-is-defined-document-structure-schema + - request-is-defined-document-structure-schema + - path-resource-name-is-lowercase-with-hyphen + +rules: + + Siemens-API-[100]: + message: SHOULD use JSON-based media types + description: Siemens Xcelerator recommends use either the media type application/json for exchanging data, or a more specific media type based on JSON. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule100 + severity: info + given: $.paths.*.*.responses.*.content.*~ + then: + function: pattern + functionOptions: + match: ^application\/(json|.*?\+json)$ + + Siemens-API-[101.1]: + message: 'SHOULD use a top-level JSON object' + description: The root of every document SHOULD contain a JSON object. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.1 + severity: warn + given: $.paths.*.*[responses,requestBody]..content..schema + then: + function: is-object-schema + + Siemens-API-[101.2]-1: + message: 'SHOULD use the defined document structure' + description: A response document SHOULD contain at least one of the following top-level members:data,errors,meta,links. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.2 + severity: warn + given: $.paths.*.*[responses]..content..schema + then: + function: response-is-defined-document-structure-schema + + Siemens-API-[101.2]-2: + message: 'SHOULD use the defined document structure' + description: A request document SHOULD contain at least data. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.2 + severity: warn + given: $.paths.*.*[requestBody]..content..schema + then: + function: request-is-defined-document-structure-schema + + Siemens-API-[101.4.1]: + message: The data type MUST be compliant with the types defined + description: The data type MUST be compliant with the types defined in the OpenAPI specification + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.4.1 + severity: error + given: $.paths.*.*[responses,requestBody]..content..schema..properties..*..type + then: + function: pattern + functionOptions: + match: ^(boolean|object|array|integer|number|string)$ + + Siemens-API-[101.5]: + message: A links object SHOULD contain one or more links + description: A links object SHOULD contain one or more links + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.5 + severity: warn + given: $.*..schema..links + then: + function: is-object-schema + + Siemens-API-[101.7]: + message: A JSON document MAY provide meta information. + description: Meta information can be used to include additional information to a JSON object. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.7 + severity: info + given: $.*..schema..meta + then: + function: is-object-schema + + Siemens-API-[101.7.2]: + message: A meta object SHOULD be used to represent meta information as a JSON object. + description: The value of each meta field MUST be a JSON object + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.7.2 + severity: error + given: $.*..schema..meta + then: + function: is-meta-object + + Siemens-API-[101.8]: + message: Field names SHOULD use lower camel case + description: Field names SHOULD use lower camel case + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.8 + severity: warn + given: $.paths.*.*[responses,requestBody]..content..schema..properties.*~ + then: + function: casing + functionOptions: + type: camel + + Siemens-API-[101.8.1]: + message: Field names MUST use the allowed characters only + description: Field names MUST use the allowed characters only + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/media-type.html#mediatyperule101.8.1 + severity: error + given: $.paths.*.*[responses,requestBody]..content..schema..properties.*~ + then: + function: pattern + functionOptions: + match: ^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]$ + + Siemens-API-[101.9]: + message: Resource names SHOULD be in lowercase with hyphen + description: Resource names in an URL path (including resource names) SHOULD be lower case words separated by hyphens + severity: warn + given: $.paths.*~ + then: + function: path-resource-name-is-lowercase-with-hyphen + diff --git a/api-linter/rulesets/siemens-api-pagination.yml b/api-linter/rulesets/siemens-api-pagination.yml new file mode 100644 index 0000000..11b9ed5 --- /dev/null +++ b/api-linter/rulesets/siemens-api-pagination.yml @@ -0,0 +1,85 @@ +functions: + - get-resources-has-pagination + - get-resources-has-pagination-strategies + - get-resources-has-pagination-strategies-meta + +rules: + + Siemens-API-[600]-1: + message: '{{error}}' + description: A server MAY provide links to traverse a paginated data set + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule600 + severity: info + given: $.paths..get + then: + function: get-resources-has-pagination + functionOptions: A + + Siemens-API-[600]-2: + message: '{{error}}' + description: Pagination links SHOULD appear in the top-level links object. + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule600 + severity: warn + given: $.paths..get + then: + function: get-resources-has-pagination + functionOptions: B + + Siemens-API-[600]-3: + message: '{{error}}' + description: Naming convention MUST be used for pagination keys + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule600 + severity: hint + given: $.paths..get + then: + function: get-resources-has-pagination + functionOptions: D + + Siemens-API-[601]: + message: '{{error}}' + description: Pagination SHOULD be implemented using query parameters + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule601 + severity: warn + given: $.paths..get + then: + function: get-resources-has-pagination-strategies + + Siemens-API-[601.1.1]: + message: '{{error}}' + description: Server MAY provide pagination meta information to the client + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule601.1.1 + severity: info + given: $.paths..get + then: + function: get-resources-has-pagination-strategies-meta + functionOptions: cursor + + Siemens-API-[601.2.1]: + message: '{{error}}' + description: Server MAY provide pagination meta information to the client + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule601.2.1 + severity: info + given: $.paths..get + then: + function: get-resources-has-pagination-strategies-meta + functionOptions: offset + + Siemens-API-[601.3.1]-1: + message: '{{error}}' + description: Server MAY provide pagination meta information to the client + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule601.3.1 + severity: info + given: $.paths..get + then: + function: get-resources-has-pagination-strategies-meta + functionOptions: index1 + + Siemens-API-[601.3.1]-2: + message: '{{error}}' + description: Server MAY provide pagination meta information to the client + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/pagination.html#paginationrule601.3.1 + severity: info + given: $.paths..get + then: + function: get-resources-has-pagination-strategies-meta + functionOptions: index2 \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-security.js b/api-linter/rulesets/siemens-api-security.js new file mode 100644 index 0000000..45cecb7 --- /dev/null +++ b/api-linter/rulesets/siemens-api-security.js @@ -0,0 +1,57 @@ +var apiSecurity = global.apiSecurity; +const hasHeaderWithPropertyValue = (targetVal, options) => { + const results = []; + if (targetVal.parameters == null){ + results.push({message: 'No request header parameters provided.'}) + return results; + } + var exist = false; + for (const param of targetVal.parameters){ + if (param[options['property']] === options['value'] && param['in'] === "header"){ + exist = true; + } + } + if (!exist){ + results.push({message: 'A request header '+ options['value'] +' MUST be supported.'}) + } + return results; +}; + +var ruleset = {}; +if (typeof apiSecurity == 'undefined') { + apiSecurity = "n"; +} +switch (apiSecurity.toLowerCase()){ + case "y": + case "t": + case "true": + case "yes": + ruleset.rules = { + "Siemens-API-Security": { + message: "{{error}}", + description: "When calling a secured REST API, the request header Authorization with the value Bearer MUST be present.", + documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/security.html", + severity: "error", + given: [ + "$.paths.*" + ], + then: { + function: hasHeaderWithPropertyValue, + functionOptions: { + property: "name", + value: "Authorization" + } + } + } + } + break; + case "ignore": + case "n": + case "no": + case "f": + case "false": + default: + ruleset.rules = {} + break; +} +export default ruleset; \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-security.yml b/api-linter/rulesets/siemens-api-security.yml new file mode 100644 index 0000000..32b73f7 --- /dev/null +++ b/api-linter/rulesets/siemens-api-security.yml @@ -0,0 +1,2 @@ +extends: + - ./siemens-api-security.js diff --git a/api-linter/rulesets/siemens-api-sorting.yml b/api-linter/rulesets/siemens-api-sorting.yml new file mode 100644 index 0000000..67cd771 --- /dev/null +++ b/api-linter/rulesets/siemens-api-sorting.yml @@ -0,0 +1,15 @@ +functions: + - get-resources-has-parameter + +rules: + + Siemens-API-[700]: + message: '{{error}}' + description: API MAY provide projection of sort in response + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/sorting.html#sortingrule700 + severity: info + given: $.paths..get + then: + function: get-resources-has-parameter + functionOptions: sort + \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-sparse-fieldsets.yml b/api-linter/rulesets/siemens-api-sparse-fieldsets.yml new file mode 100644 index 0000000..784835a --- /dev/null +++ b/api-linter/rulesets/siemens-api-sparse-fieldsets.yml @@ -0,0 +1,16 @@ +functions: + - get-resources-has-parameter + +rules: + + Siemens-API-[500]: + message: '{{error}}' + description: API MAY provide projection of fieldset in response + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/sparse-fieldsets.html#sparsefieldsetrule500 + severity: info + given: $.paths..get + then: + function: get-resources-has-parameter + functionOptions: fields + + diff --git a/api-linter/rulesets/siemens-api-versioning.js b/api-linter/rulesets/siemens-api-versioning.js new file mode 100644 index 0000000..128917a --- /dev/null +++ b/api-linter/rulesets/siemens-api-versioning.js @@ -0,0 +1,94 @@ +const {pattern} = require('@stoplight/spectral-functions') + +const apiVersioning = global.apiVersioning; +const hasPropertyValue = (targetVal, options) => { + const results = []; + var exist = false; + for (const param of targetVal){ + if (param[options['property']] === options['value']){ + exist = true; + } + } + if (!exist){ + results.push({message: 'A request header Api-Version MUST be supported to allow client to specify the version.'}) + } + return results; +}; + +const hasProperty = (targetVal, options) => { + const results = []; + if (typeof targetVal["headers"] == 'undefined'){ + results.push({message: "Response should have headers for Api-Version"}) + } + else if (typeof targetVal["headers"][options['property']] == 'undefined'){ + results.push({message: "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'"}) + } + return results; +}; + +var ruleset = {}; +switch (apiVersioning){ + case "ignore": + ruleset.rules = {} + break; + case "url": + ruleset.rules = { + "Siemens-API-[200.1]": { + message: "The Major version number MUST be specified in the URI as a path segment", + description: "The Major version number MUST be specified in the URI as a path segment.", + documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.1", + severity: "error", + given: [ + "$.servers..url" + ], + then: { + function: pattern, + functionOptions: { + match: "/[\\.|\\/|](v)?[0-9]+/i", + notMatch: "/[\\.|\\/|](v)?[0-9]+\\.[0-9]+/i" + } + } + } + } + break; + case "header": + ruleset.rules = { + "Siemens-API-[200.2]": { + message: "{{message}}", + description: "A request HTTP header e.g., Api-Version Should be supported to allow client to specify the version.", + documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.2", + severity: "error", + given: [ + "$.paths[*]..parameters" + ], + then: { + function: hasPropertyValue, + functionOptions: { + property: "name", + value: "Api-Version" + } + } + } + } + break; + default: + break; +} +if (apiVersioning == 'url' || apiVersioning == 'header'){ + ruleset.rules["Siemens-API-[201]"] = { + message: "{{message}}", + description: "A header with full semantic version value SHOULD be returned in the response with 'Api-Version: ..'", + documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule201", + severity: "warn", + given: [ + "$.paths..responses[?(@.content)]" + ], + then: { + function: hasProperty, + functionOptions: { + property: "Api-Version" + } + } + } +} +export default ruleset; \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-versioning.yml b/api-linter/rulesets/siemens-api-versioning.yml new file mode 100644 index 0000000..3190e98 --- /dev/null +++ b/api-linter/rulesets/siemens-api-versioning.yml @@ -0,0 +1,3 @@ +extends: + - ./semantic-versioning.yml + - ./siemens-api-versioning.js diff --git a/api-linter/rulesets/siemens-api.yml b/api-linter/rulesets/siemens-api.yml new file mode 100644 index 0000000..8f0948e --- /dev/null +++ b/api-linter/rulesets/siemens-api.yml @@ -0,0 +1,11 @@ +extends: + - ./siemens-api-media-type.yml + - ./siemens-api-versioning.yml + - ./siemens-api-error-reporting.yml + - ./siemens-api-filtering.yml + - ./siemens-api-sparse-fieldsets.yml + - ./siemens-api-pagination.yml + - ./siemens-api-sorting.yml + - ./siemens-api-common-operation.yml + - ./siemens-api-security.yml + - "spectral:oas" \ No newline at end of file diff --git a/api-linter/rulesets/vs-extension.yml b/api-linter/rulesets/vs-extension.yml new file mode 100644 index 0000000..eace2ca --- /dev/null +++ b/api-linter/rulesets/vs-extension.yml @@ -0,0 +1,10 @@ +extends: + - ./siemens-api-media-type.yml + - ./siemens-api-error-reporting.yml + - ./siemens-api-filtering.yml + - ./siemens-api-sparse-fieldsets.yml + - ./siemens-api-pagination.yml + - ./siemens-api-sorting.yml + - ./siemens-api-common-operation.yml + - ./semantic-versioning.yml + - "spectral:oas" \ No newline at end of file diff --git a/api-linter/src/argument.js b/api-linter/src/argument.js new file mode 100644 index 0000000..1e7a012 --- /dev/null +++ b/api-linter/src/argument.js @@ -0,0 +1,48 @@ +'use strict'; +const { Command, Option } = require("commander"); + +exports.argument = () => { + const program = new Command(); + + program.name("api-linter") + .requiredOption("-s, --specPath ", "path to openapi specification") + .requiredOption("-r, --rulesetPath ", "path to ruleset file",(value, previous) => { + if (!Array.isArray(previous)) { + return [value]; + } + previous.push(value); + return previous; + }, + [] + ) + .addOption(new Option("-f, --failSeverity ", "fail severity").default("warn")) + .addOption(new Option("-c, --consoleSeverity ", "console output severity").default("warn")) + .addOption(new Option("-o, --outputFilename ", "output filename").default("linter-result.html")) + .addOption(new Option("-p, --jsonFile ", "output json file").default("spectral_result.json")) + .addOption(new Option("-v, --apiVersioning ", "api versioning") + .choices(["ignore", "url", "header"]) + .default("ignore")) + .addOption(new Option("-a, --apiSecurity ", "api security") + .choices(["y","yes","t","true","n","no","f","false"]) + .default("n")) + .option("--resolve", "follow external $refs (same as Spectral --resolve)", false); + + program.parse(process.argv); + + const options = program.opts(); + const { specPath, rulesetPath, failSeverity, consoleSeverity, + apiVersioning, apiSecurity, outputFilename, resolve, jsonFile } = options; + global.apiVersioning = apiVersioning; + global.apiSecurity = apiSecurity; + return ({ + specPath, + rulesetPath, + failSeverity, + consoleSeverity, + apiVersioning, + apiSecurity, + outputFilename, + resolve, + jsonFile + }); +} \ No newline at end of file diff --git a/api-linter/src/extension.js b/api-linter/src/extension.js new file mode 100644 index 0000000..335259d --- /dev/null +++ b/api-linter/src/extension.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const spectralCore = require('@stoplight/spectral-core'); +const Parsers = require('@stoplight/spectral-parsers'); +const spectralRuntime = require('@stoplight/spectral-runtime'); +const {bundleAndLoadRuleset} = require('@stoplight/spectral-ruleset-bundler/with-loader'); +const fetch = spectralRuntime; +const {Spectral, Document} = spectralCore; + +const linter = async (specFilePath, rulesetFilepath) => { + const myDocument = new Document( + fs.readFileSync(specFilePath, "utf-8").trim(), + Parsers.Yaml, + "openapi.yml", + ); + const spectral = new Spectral(); + var rules = await bundleAndLoadRuleset(rulesetFilepath,{ fs, fetch }); + spectral.setRuleset(rules); + var binded = {}; + await spectral.run(myDocument).then(results => { + binded.rules = spectral.ruleset.rules; + binded.results = results; + }); + return binded; +} + +exports.validator = () => { + const validate = async (specFilePath, ruleSetFilePath) => { + var ret = {}; + await linter(specFilePath, ruleSetFilePath).then(linterResult => { + ret = linterResult; + }); + return ret; + }; + return ( + validate + ); +} + + diff --git a/api-linter/src/index.js b/api-linter/src/index.js new file mode 100755 index 0000000..88d8054 --- /dev/null +++ b/api-linter/src/index.js @@ -0,0 +1,329 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); +const {join} = require('path'); +const process = require('process') +const spectralCore = require('@stoplight/spectral-core'); +const Parsers = require('@stoplight/spectral-parsers'); +const spectralRuntime = require('@stoplight/spectral-runtime'); +const { resolver } = require('@stoplight/spectral-ref-resolver'); +const {DiagnosticSeverity} = require('@stoplight/types'); +const {bundleAndLoadRuleset} = require('@stoplight/spectral-ruleset-bundler/with-loader'); + +const Handlebars = require('handlebars'); +const Underscore = require('underscore'); +const {argument} = require('./argument'); + +const fetch = spectralRuntime; +const {Spectral, Document} = spectralCore; +const {specPath, rulesetPath, failSeverity, consoleSeverity, outputFilename, jsonFile,resolve: resolveRefs } = argument(); +const yaml = require('js-yaml'); + +var reportFileName = outputFilename; +if (!outputFilename.endsWith(".html")){ + reportFileName = reportFileName + ".html"; +} + +const fileExists = (filepath) => { + return fs.existsSync(path.join(filepath)); +} + +const loadFile = (filepath) => { + return fs.readFileSync(path.join(filepath), { encoding: "utf8" }); +} + +const writeToFile = (data, filename) => { + fs.writeFileSync(path.join(filename), data, { encoding: "utf8" }); +} + +const specFilePath = path.resolve(specPath); +if (!fileExists(specFilePath)){ + throw Error(`Unable to resolve spec file path ${specFilePath}`); +} + +for (const filepath of rulesetPath) { + const abs_filepath = path.resolve(filepath) + if (!fileExists(abs_filepath)){ + throw Error(`Unable to resolve ruleset file path ${abs_filepath}`); + } +} + +const formatJSON = (rules, results) => { + const severityMap = getSeverityMap(); + var totalRuleCount = 0; + var enabledCount = 0; + var data = []; + var index = 0; + for (const key in rules){ + var rule = rules[key]; + var ruleResult = {}; + ruleResult.ruleName = rule.name; + ruleResult.ruleDescription = rule.description; + ruleResult.documentUrl = rule.documentationUrl; + ruleResult.details = []; + ruleResult.severity = rule.severity; + ruleResult.hasDetails = false; + if (rule.enabled){ + ruleResult.success = true; + ruleResult.enabled = true; + ruleResult.class = "table-success"; + ruleResult.message = "success"; + ruleResult.index = index; + enabledCount++; + index++; + data.push(ruleResult); + totalRuleCount++; + } + } + var newResults = []; + results.forEach( o => { + let newObj = {}; + newObj.line = (o.range.start.line + 1) + ":" + (o.range.start.character + 1); + newObj.severity = severityMap[o.severity]; + newObj.code = o.code; + newObj.message = o.message; + newObj.path = o.path.join("_"); + newResults.push(newObj); + for (const ruleResult of data){ + if (ruleResult.ruleName == o.code){ + ruleResult.success = false; + if (newObj.severity == "error"){ + ruleResult.class = "table-danger"; + } + else if (newObj.severity == "warn"){ + ruleResult.class = "table-warning"; + } + else { + ruleResult.class = "table-info"; + } + ruleResult.message = (ruleResult.details.length + 1) + " " + newObj.severity; + if (ruleResult.details.length > 0){ + ruleResult.message = ruleResult.message + "s"; + } + ruleResult.hasDetails = true; + ruleResult.details.push(newObj); + break; + } + } + }); + let jsonResult = { + "data": data, + "timestamp": new Date().toLocaleString(), + }; + let severityDist = Underscore.countBy(newResults, "severity"); + jsonResult.messageCount = results.length; + jsonResult.errorCount = severityDist.error || 0; + jsonResult.warnCount = severityDist.warn || 0; + jsonResult.infoCount = severityDist.info || 0; + jsonResult.hintCount = severityDist.hint || 0; + jsonResult.totalCount = totalRuleCount || 0; + jsonResult.enabledCount = enabledCount || 0; + return jsonResult; +} + +const getSeverityMap = () => { + const severityMap = {}; + severityMap[DiagnosticSeverity.Error] = "error"; + severityMap[DiagnosticSeverity.Warning] = "warn"; + severityMap[DiagnosticSeverity.Information] = "info"; + severityMap[DiagnosticSeverity.Hint] = "hint"; + return severityMap; +} + +const mapSeverity = (severity) => { + var severityValue = DiagnosticSeverity.Error; + switch(severity) + { + case "error": + severityValue = DiagnosticSeverity.Error; + break; + case "warn": + severityValue = DiagnosticSeverity.Warning; + break; + case "info": + severityValue = DiagnosticSeverity.Information; + break; + case "hint": + severityValue = DiagnosticSeverity.Hint; + break; + default: + break; + } + return severityValue; +} + +const generateReport = (jsonObj) => { + let htmlStr = loadFile(join(__dirname, "/templates/template.html")); + Handlebars.registerHelper("inc", (val) => { + return parseInt(val) + 1; + }); + let template = Handlebars.compile(htmlStr); + let data = template(jsonObj); + writeToFile(data, reportFileName); +} + +const linter = async (specFilePath, rulesetPath, followRefs) => { + const myDocument = new Document( + fs.readFileSync(specFilePath, "utf-8").trim(), + Parsers.Yaml, + specFilePath + ); + + const spectral = new Spectral( { resolver } ); + var tempFilePath = ""; + var isMultiRuleFiles = false; + + if (rulesetPath.length > 1) { + isMultiRuleFiles = true; + const masterRulesetContent = { + extends: rulesetPath.map(file => path.resolve(file)), + }; + const contentString = yaml.dump(masterRulesetContent, { indent: 2 }); + const tempDir = process.cwd(); + const tempFileName = `.spectral-${Date.now()}.yaml`; + tempFilePath = path.join(tempDir, tempFileName); + fs.writeFileSync(tempFilePath, contentString, 'utf8'); + } + else { + tempFilePath = path.resolve(rulesetPath[0]); + } + spectral.setRuleset(await bundleAndLoadRuleset(tempFilePath, { fs, fetch })); + var binded = {}; + + const runPromise = followRefs + ? spectral.run(myDocument, { resolve: true }) + : spectral.run(myDocument); + + await runPromise.then(results => { + binded.rules = spectral.ruleset.rules; + binded.results = results; + }); + + try { + if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { + fs.unlinkSync(tempFilePath); + } + } catch (cleanupErr) { + console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); + } + + return binded; +} + +const severeEnoughToFail = (results, failSeverity) => { + const diagnosticSeverity = mapSeverity(failSeverity); + return results.some(r => r.severity <= diagnosticSeverity); +} + +const consoleMsgPart = (results, consoleSeverity) => { + const diagnosticSeverity = mapSeverity(consoleSeverity); + return results.filter(r => r.severity <= diagnosticSeverity).sort((a, b) => a.severity - b.severity); +} + +const getSeverityMsgMap = () => { + const severityMap = {}; + severityMap[DiagnosticSeverity.Error] = "Error"; + severityMap[DiagnosticSeverity.Warning] = "Warning"; + severityMap[DiagnosticSeverity.Information] = "Information"; + severityMap[DiagnosticSeverity.Hint] = "Hint"; + return severityMap; +} + +const resolveRuleDependencyResult = (rules, results) => { + const dependsOnMap = {}; + for (const [ruleName, ruleDef] of Object.entries(rules)) { + const deps = ruleDef?.definition?.['x-dependsOn']; + if (deps) { + dependsOnMap[ruleName] = Array.isArray(deps) ? deps : [deps]; + } + } + + const allDepsCache = {}; + const getAllDependencies = (ruleName, visited = new Set()) => { + if (allDepsCache[ruleName]) return allDepsCache[ruleName]; + const directDeps = dependsOnMap[ruleName] || []; + const deps = new Set(); + + for (const dep of directDeps) { + if (visited.has(dep)) continue; + deps.add(dep); + const transitiveDeps = getAllDependencies(dep, new Set(visited).add(ruleName)); + for (const d of transitiveDeps) { + deps.add(d); + } + } + + allDepsCache[ruleName] = deps; + return deps; + }; + + const issuesByLocation = new Map(); + for (const issue of results) { + const locationKey = issue.path?.join('.') || ''; + if (!issuesByLocation.has(locationKey)) { + issuesByLocation.set(locationKey, []); + } + issuesByLocation.get(locationKey).push(issue); + } + + const filteredResults = []; + + for (const [_, issues] of issuesByLocation.entries()) { + const failedRules = new Set(issues.map(i => i.code)); + + for (const issue of issues) { + const ruleCode = issue.code; + const allDeps = getAllDependencies(ruleCode); + const hasFailedAncestor = [...allDeps].some(dep => failedRules.has(dep)); + + if (!hasFailedAncestor) { + filteredResults.push(issue); + } + } + } + + return filteredResults; +}; + +linter(specFilePath, rulesetPath, resolveRefs).then(linterResult => { + const spectralResult = resolveRuleDependencyResult(linterResult.rules, linterResult.results); + + const spectralReport = path.resolve(jsonFile); + fs.writeFileSync(spectralReport, JSON.stringify(spectralResult), { encoding: "utf8" }); + + const jsonResult = formatJSON(linterResult.rules, spectralResult); + generateReport(jsonResult); + const reportFilePath = path.resolve(reportFileName); + const isErrorSeverity = mapSeverity(failSeverity) === DiagnosticSeverity.Error; + const failed = severeEnoughToFail(spectralResult, failSeverity); + const consolePart = consoleMsgPart(spectralResult, consoleSeverity); + const consoleMsg = consolePart.map(error=> + `-------------------------------------------------- +${getSeverityMsgMap()[error.severity]}: +Line: [${error.range.start.line}:${error.range.start.character}-${error.range.end.line}:${error.range.end.character}] +Path: [${error.path.join('.')}] +Desc: [${error.code} ${error.message} ]`).join('\n'); + if (failed) + { + + process.stdout.write( + `Results with severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + + consoleMsg + + `\n-------------------------------------------------- +Detailed report: ` + reportFilePath + '\n', + ); + process.exit(1); + } + else { + process.stdout.write( + `No results with a severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + + consoleMsg + + `\n-------------------------------------------------- +Detailed report: ` + reportFilePath + '\n', + ); + process.exit(0); + } +}); + + diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html new file mode 100644 index 0000000..36a141b --- /dev/null +++ b/api-linter/src/templates/template.html @@ -0,0 +1,161 @@ + + + + + Siemens Xcelerator-API Linter Report + + + + + + + +
+
+

Siemens API Linter Report

+
+
+
+
+ +
+
Total Rules Count: {{this.enabledCount}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SeverityProblems
Errors{{this.errorCount}}
Warnings{{this.warnCount}}
Info{{this.infoCount}}
Hints{{this.hintCount}}
+
+ +
+

Detailed report

+
+ +
+ + + + {{#each this.data}} + + + + + {{#if hasDetails}} + + {{else}} + + {{/if}} + + + + + + {{/each}} + +
+ {{#if hasDetails}} + + + + + + + + + + + + {{#each details}} + + + + + + {{/each}} + +
#LineSeverityPathmessage
{{inc @index}} + {{line}}{{severity}}{{path}}{{message}} +
+ {{/if}} +
+
+
+ + + + + + + \ No newline at end of file diff --git a/api-linter/test/api-commonops.test.js b/api-linter/test/api-commonops.test.js new file mode 100644 index 0000000..6f148eb --- /dev/null +++ b/api-linter/test/api-commonops.test.js @@ -0,0 +1,123 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyInfos } = require("./base.js") + +const path = 'commonops/'; +const rulesetPath = "test/testdata/commonops/.spectral.yml"; + +test('A Successful fetch of individual resources MUST return the status code 200', async () => { + const specFilePath = getSpecFilePath(path, "800-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[800.1]"); + //Problem in line:29 + assertOnlyErrors(results); + }); +}) + +test('A successful fetch of resource collection request MUST return a 2xx status code', async () => { + const specFilePath = getSpecFilePath(path, "800-2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[800.2]"); + //Problem in line:37 + assertOnlyErrors(results); + }); +}) + +test('An API Provider MUST support fetching resource data for provided links', async () => { + const specFilePath = getSpecFilePath(path, "800-4.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[800.4]"); + //Problem in line:50 + assertOnlyErrors(results); + }); +}) + +test('The POST request MUST include a single resource object as primary data', async () => { + const specFilePath = getSpecFilePath(path, "801.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[801]"); + //Problem in line:45-47 + assertOnlyErrors(results); + }); +}) + +test('API MUST respond to successful POST creation request with 2xx success status code', async () => { + const specFilePath = getSpecFilePath(path, "801-4.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[801.4]"); + //Problem in line:34 + assertOnlyErrors(results); + }); +}) + +test('API MUST respond to successful PATCH update request with 2xx success status code', async () => { + const specFilePath = getSpecFilePath(path, "802-6.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[802.6]"); + //Problem in line:42 + assertOnlyErrors(results); + }); +}) + +test('API MUST respond to successful PUT update request with 2xx success status code', async () => { + const specFilePath = getSpecFilePath(path, "803-2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[803.2]"); + //Problem in line:42 + assertOnlyErrors(results); + }); +}) + +test('API MUST respond to successful DELETE request with 2xx success status code', async () => { + const specFilePath = getSpecFilePath(path, "804-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[804.1]"); + //Problem in line:37 + assertOnlyErrors(results); + }); +}) + +test('The API consumer MAY use conditional header information to solve concurrent update requests', async () => { + const specFilePath = getSpecFilePath(path, "803-6.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[803.6]"); + //Problem in line:37-40 + assertOnlyInfos(results); + }); +}) + diff --git a/api-linter/test/api-errors-refs.test.js b/api-linter/test/api-errors-refs.test.js new file mode 100644 index 0000000..db05af4 --- /dev/null +++ b/api-linter/test/api-errors-refs.test.js @@ -0,0 +1,42 @@ +// test/api-errors-refs.test.js +const fs = require('fs'); +const { Document } = require('@stoplight/spectral-core'); +const Parsers = require('@stoplight/spectral-parsers'); + +// 👇 RE-ADD setupSpectral here +const { setupSpectral } = + require('@jamietanna/spectral-test-harness'); + +const { resultsForSeverity } = require('./base.js'); +const { resolver } = require('@stoplight/spectral-ref-resolver'); +const path = require('path'); + +const rulesetPath = 'test/testdata/refs/.spectral.yml'; +const specFilePath = path.join(__dirname, 'testdata/refs', '300.yml'); // ABSOLUTE + +test('API MUST use official HTTP status codes as intended', async () => { + // ───────────── arrange ───────────── + /* ── Spectral with resolver ── */ + const spectral = await setupSpectral(rulesetPath, { resolver }); + + /* ── Document with correct source (real path!) ── */ + const raw = fs.readFileSync(specFilePath, 'utf8'); + const document = new Document(raw, Parsers.Yaml, specFilePath); + // … but give it the real filename so $ref resolution works + document.source = specFilePath; + + // ───────────── act ───────────── + const results = await spectral.run( + document, + { resolve: { external: true } } + ); + + // ───────────── assert ───────────── + const errors = resultsForSeverity(results, 'Error'); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe('Siemens-API-[300]'); + //Problem in line:35-40 + const warnings = resultsForSeverity(results, 'Warning'); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe('Siemens-API-[301]'); +}); diff --git a/api-linter/test/api-errors.test.js b/api-linter/test/api-errors.test.js new file mode 100644 index 0000000..4cf0453 --- /dev/null +++ b/api-linter/test/api-errors.test.js @@ -0,0 +1,85 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyWarnings, assertOnlyInfos } = require("./base.js") + +const path = 'error/'; +const rulesetPath = "test/testdata/error/.spectral.yml"; + +test('API MUST use official HTTP status codes as intended', async () => { + const specFilePath = getSpecFilePath(path, "300.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[300]"); + //Problem in line:35-40 + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[301]"); + }); +}) + +test('SHOULD only use most common HTTP status codes', async () => { + const specFilePath = getSpecFilePath(path, "301.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:35-40 + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[301]"); + assertOnlyWarnings(results); + }); +}) + + test('SHOULD use the most specific HTTP status code when returning errors', async () => { + const specFilePath = getSpecFilePath(path, "302.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:130 + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[302]"); + assertOnlyWarnings(results); + }); + }) + + test('Error object SHOULD be represented according to the defined structure fields', async () => { + const specFilePath = getSpecFilePath(path, "305.1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:110 + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[305]-1"); + assertOnlyWarnings(results); + }); + }) + + test('The error links resource object MAY contain the members: about, type', async () => { + const specFilePath = getSpecFilePath(path, "305.2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:114-117 + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[305]-2"); + assertOnlyInfos(results) + }); + }) + + test('The source object SHOULD include one of the members or be omitted: pointer, parameter, header', async () => { + const specFilePath = getSpecFilePath(path, "305.3.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:114-117 + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[305]-3"); + assertOnlyWarnings(results); + }); + }) \ No newline at end of file diff --git a/api-linter/test/api-filtering.test.js b/api-linter/test/api-filtering.test.js new file mode 100644 index 0000000..25f01ce --- /dev/null +++ b/api-linter/test/api-filtering.test.js @@ -0,0 +1,30 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyInfos, assertOnlyHints } = require("./base.js") + +const path = 'filtering/'; +const rulesetPath = "test/testdata/filtering/.spectral.yml"; + +test('An API provider MAY NOT support more than 4 parameters at once for selecting resources', async () => { + const specFilePath = getSpecFilePath(path, "400.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const hints = resultsForSeverity(results, "Hint"); + expect(hints).toHaveLength(2); + expect(hints[0].code).toBe("Siemens-API-[400]"); + expect(hints[1].code).toBe("Siemens-API-[401]"); + //Problem in line:29-62 + assertOnlyHints(results); + }); +}) + +test('The query parameter filter SHOULD be used to filter or query data', async () => { + const specFilePath = getSpecFilePath(path, "401.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(0); + assertOnlyInfos(results); + }); +}) \ No newline at end of file diff --git a/api-linter/test/api-linter-cli.test.js b/api-linter/test/api-linter-cli.test.js new file mode 100644 index 0000000..1fc1477 --- /dev/null +++ b/api-linter/test/api-linter-cli.test.js @@ -0,0 +1,60 @@ +const path = require('path'); +const fs = require('fs'); +const { spawnSync } = require('child_process'); + +/* ─────────── paths used by both tests ─────────── */ +const cli = path.join(__dirname, '..', 'src', 'index.js'); +const ruleset = path.join(__dirname, 'testdata', 'refs', '.spectral.yml'); +const spec = path.join(__dirname, 'testdata', 'refs', '300.yml'); + +/* handy wrapper to invoke the CLI */ +function runLinter({ resolveFlag, reportFile }) { + const args = [ + cli, + '--specPath', spec, + '--rulesetPath', ruleset, + '--failSeverity','error', + '--outputFilename', reportFile + ]; + if (resolveFlag) args.push('--resolve'); + + return spawnSync('node', args, { encoding: 'utf8' }); +} + +describe('api-linter CLI external $ref behaviour', () => { + const reportWith = path.join(__dirname, 'tmp-report-resolve.html'); + const reportWithout = path.join(__dirname, 'tmp-report-no-resolve.html'); + + /* clean-up generated HTML files after the suite finished */ + afterAll(() => { + [reportWith, reportWithout].forEach(f => { + if (fs.existsSync(f)) fs.unlinkSync(f); + }); + }); + + test('with --resolve follows external refs (no invalid-ref)', () => { + const { status, stdout } = runLinter({ + resolveFlag: true, + reportFile: reportWith + }); + + /* exit-code still 1 because the real rule fires */ + expect(status).toBe(1); + expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present + expect(stdout).not.toMatch(/invalid-ref/); // resolver worked + expect(fs.existsSync(reportWith)).toBe(true); // report created + }); + + test('without --resolve produces invalid-ref error', () => { + const { status, stdout } = runLinter({ + resolveFlag: false, + reportFile: reportWithout + }); + + expect(status).toBe(1); + expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present + expect(stdout).toMatch(/Siemens-API-\[301]/); // rule present + expect(stdout).not.toMatch(/invalid-ref/); // Spectral never tried to search for external references + expect(fs.existsSync(reportWithout)).toBe(true); + }); +}); \ No newline at end of file diff --git a/api-linter/test/api-mediatype.test.js b/api-linter/test/api-mediatype.test.js new file mode 100644 index 0000000..262c5df --- /dev/null +++ b/api-linter/test/api-mediatype.test.js @@ -0,0 +1,114 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyWarnings, assertOnlyInfos } = require("./base.js") + +const path = 'mediatype/'; +const rulesetPath = "test/testdata/mediatype/.spectral.yml"; + +test('Siemens Xcelerator recommends the media type application/json for exchanging data.', async () => { + const specFilePath = getSpecFilePath(path, "100.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[100]"); + //Problem in line:32 + assertOnlyInfos(results); + }); +}) + +test('The root of every document SHOULD contain a JSON object', async () => { + const specFilePath = getSpecFilePath(path, "101-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[101.1]"); + //Problem in line:38 + assertOnlyWarnings(results); + }); +}) + +test('A response document SHOULD contain at least one of the following:data,error,meta,links.', async () => { + const specFilePath = getSpecFilePath(path, "101-2.1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[101.2]-1"); + //Problem in line:40-42, properties should contain at least one of data,error,meta,links + assertOnlyWarnings(results); + }); +}) + +test('A request document SHOULD contain at least data', async () => { + const specFilePath = getSpecFilePath(path, "101-2.2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[101.2]-2"); + //Problem in line:45-47, properties should contain at least data + assertOnlyWarnings(results); + }); +}) + +test('The data type MUST be compliant with the types defined', async () => { + const specFilePath = getSpecFilePath(path, "101-4-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[101.4.1]"); + //Problem in line:87, should be one of boolean|object|array|integer|number|string + assertOnlyErrors(results); + }); +}) + +test('A meta object SHOULD be used to represent meta information as a JSON object', async () => { + const specFilePath = getSpecFilePath(path, "101-7-2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[101.7.2]"); + //Problem in line:77, should be type: object + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[101.7]"); + }); +}) + +test('Field names SHOULD use lower camel case', async () => { + const specFilePath = getSpecFilePath(path, "101-8.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[101.8]"); + //Problem in line:68, should be addressDetail + assertOnlyWarnings(results); + }); +}) + +test('Resource names SHOULD be in lowercase with hyphen', async () => { + const specFilePath = getSpecFilePath(path, "101-9.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[101.9]"); + //Problem in line:20, should be room-details + assertOnlyWarnings(results); + }); +}) + + + diff --git a/api-linter/test/api-pagination.test.js b/api-linter/test/api-pagination.test.js new file mode 100644 index 0000000..5d9dfa5 --- /dev/null +++ b/api-linter/test/api-pagination.test.js @@ -0,0 +1,102 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyInfos, assertOnlyHints } = require("./base.js") + +const path = 'pagination/'; +const rulesetPath = "test/testdata/pagination/.spectral.yml"; + +test('A server MAY provide links to traverse a paginated data set', async () => { + const specFilePath = getSpecFilePath(path, "600.1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[600]-1"); + assertOnlyInfos(results); + }); + }) + +test('Pagination links SHOULD appear in the top-level links object.', async () => { + const specFilePath = getSpecFilePath(path, "600.2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[600]-2"); + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[600]-1"); + }); +}) + +test('Naming convention MUST be used for pagination keys.', async () => { + const specFilePath = getSpecFilePath(path, "600.3.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const hints = resultsForSeverity(results, "Hint"); + expect(hints).toHaveLength(1); + expect(hints[0].code).toBe("Siemens-API-[600]-3"); + assertOnlyHints(results); + }); +}) + +test('Pagination SHOULD be implemented using query parameters.', async () => { + const specFilePath = getSpecFilePath(path, "601.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[601]"); + }); +}) + +test('Server MAY provide pagination meta information to the client [601.1.1].', async () => { + const specFilePath = getSpecFilePath(path, "601-1-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[601.1.1]"); + assertOnlyInfos(results); + }); +}) + +test('Server MAY provide pagination meta information to the client [601.2.1].', async () => { + const specFilePath = getSpecFilePath(path, "601-2-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[601.2.1]"); + assertOnlyInfos(results); + }); +}) + +test('Server MAY provide pagination meta information to the client [601.3.1].', async () => { + const specFilePath = getSpecFilePath(path, "601-3-1.1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[601.3.1]-1"); + assertOnlyInfos(results); + }); +}) + +test('Server MAY provide pagination meta information to the client [601.3.1].', async () => { + const specFilePath = getSpecFilePath(path, "601-3-1.2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[601.3.1]-2"); + assertOnlyInfos(results); + }); +}) \ No newline at end of file diff --git a/api-linter/test/api-security.test.js b/api-linter/test/api-security.test.js new file mode 100644 index 0000000..44a9ee5 --- /dev/null +++ b/api-linter/test/api-security.test.js @@ -0,0 +1,49 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyErrors } = require("./base.js") + +const path = 'security/'; +const rulesetPath = "test/testdata/security/.spectral.yml"; + +test('No security problem test 1', async () => { + global.apiSecurity = 'y'; + const specFilePath = getSpecFilePath(path, "valid.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + expect(results).toHaveLength(0); + }); +}) + +test('No security problem test 2', async () => { + global.apiSecurity = 'n'; + const specFilePath = getSpecFilePath(path, "invalid.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + expect(results).toHaveLength(0); + }); +}) + +test('No security problem test 3', async () => { + global.apiSecurity = 'n'; + const specFilePath = getSpecFilePath(path, "invalid.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + expect(results).toHaveLength(0); + }); +}) + +test('Has security problem test', async () => { + global.apiSecurity = 'y'; + const specFilePath = getSpecFilePath(path, "invalid.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + expect(results).toHaveLength(1); + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-Security"); + assertOnlyErrors(results); + }); +}) \ No newline at end of file diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js new file mode 100644 index 0000000..fc5c0fa --- /dev/null +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -0,0 +1,17 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require("./base.js") + +const path = 'fields/'; +const rulesetPath = "test/testdata/fields/.spectral.yml"; + +test('API MAY provide projection of fieldset in response', async () => { + const specFilePath = getSpecFilePath(path, "500.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe("Siemens-API-[500]"); + assertOnlyInfos(results); + }); + }) diff --git a/api-linter/test/api-versioning.test.js b/api-linter/test/api-versioning.test.js new file mode 100644 index 0000000..002ecea --- /dev/null +++ b/api-linter/test/api-versioning.test.js @@ -0,0 +1,61 @@ +const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') +const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyWarnings } = require("./base.js") + +const path = 'versioning/'; +const rulesetPath = "test/testdata/versioning/.spectral.yml"; + +test('Semantic versioning MUST be used to version individual APIs', async () => { + global.apiVersioning = 'url'; + const specFilePath = getSpecFilePath(path, "semantic-versioning.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Semantic-Versioning-[2.0.0]"); + //Problem in line:35-40 + assertOnlyErrors(results); + }); +}) + +test('The Major version number MUST be specified in the URI as a path segment', async () => { + global.apiVersioning = 'url'; + const specFilePath = getSpecFilePath(path, "200-1.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[200.1]"); + //Problem in line:13 + assertOnlyErrors(results); + }); +}) + +test('A request HTTP header e.g., Api-Version MUST be supported to allow client to specify the version.', async () => { + global.apiVersioning = 'header'; + const specFilePath = getSpecFilePath(path, "200-2.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe("Siemens-API-[200.2]"); + //Problem in line:29 + assertOnlyErrors(results); + }); +}) + +test("A header with full semantic version value SHOULD be returned in the response with 'Api-Version: ..'", async () => { + global.apiVersioning = 'header'; + const specFilePath = getSpecFilePath(path, "201.yml"); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe("Siemens-API-[201]"); + //Problem in line:44 + assertOnlyWarnings(results); + }); +}) \ No newline at end of file diff --git a/api-linter/test/base.js b/api-linter/test/base.js new file mode 100644 index 0000000..ab06f82 --- /dev/null +++ b/api-linter/test/base.js @@ -0,0 +1,54 @@ +const { DiagnosticSeverity } = require('@stoplight/types') + +function resultsForSeverity (results, severity) { + return results.filter((r) => DiagnosticSeverity[r.severity] === severity) +} + +const assertOnlyErrors = (results) => { + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(0); + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(0); + const hints = resultsForSeverity(results, "Hint"); + expect(hints).toHaveLength(0); +} + +const assertOnlyWarnings = (results) => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(0); + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(0); + const hints = resultsForSeverity(results, "Hint"); + expect(hints).toHaveLength(0); +} + +const assertOnlyInfos = (results) => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(0); + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(0); + const hints = resultsForSeverity(results, "Hint"); + expect(hints).toHaveLength(0); +} + +const assertOnlyHints = (results) => { + const errors = resultsForSeverity(results, "Error"); + expect(errors).toHaveLength(0); + const warnings = resultsForSeverity(results, "Warning"); + expect(warnings).toHaveLength(0); + const infos = resultsForSeverity(results, "Information"); + expect(infos).toHaveLength(0); +} + +const getSpecFilePath = (path, fileName) => { + return path + fileName; +} + +module.exports = { + resultsForSeverity, + getSpecFilePath, + assertOnlyErrors, + assertOnlyWarnings, + assertOnlyInfos, + assertOnlyHints +} diff --git a/api-linter/test/testdata/commonops/.spectral.yml b/api-linter/test/testdata/commonops/.spectral.yml new file mode 100644 index 0000000..3ea18f4 --- /dev/null +++ b/api-linter/test/testdata/commonops/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-common-operation.yml \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/800-1.yml b/api-linter/test/testdata/commonops/800-1.yml new file mode 100644 index 0000000..96c1ac5 --- /dev/null +++ b/api-linter/test/testdata/commonops/800-1.yml @@ -0,0 +1,77 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + get: + summary: Returns a Room + description: | + Query the specified Room according to the id parameter by this get action. + operationId: ReadRoom + tags: + - Rooms + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomReadResponse" +components: + schemas: + RoomReadResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/800-2.yml b/api-linter/test/testdata/commonops/800-2.yml new file mode 100644 index 0000000..900a4f4 --- /dev/null +++ b/api-linter/test/testdata/commonops/800-2.yml @@ -0,0 +1,94 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: Not-Api-Version + in: header + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "401": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/800-4.yml b/api-linter/test/testdata/commonops/800-4.yml new file mode 100644 index 0000000..3bb3443 --- /dev/null +++ b/api-linter/test/testdata/commonops/800-4.yml @@ -0,0 +1,77 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + get: + summary: Returns a Room + description: | + Query the specified Room according to the id parameter by this get action. + operationId: ReadRoom + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomReadResponse" +components: + schemas: + RoomReadResponse: + type: object + required: + - data + properties: + data: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + href: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/801-4.yml b/api-linter/test/testdata/commonops/801-4.yml new file mode 100644 index 0000000..93614f4 --- /dev/null +++ b/api-linter/test/testdata/commonops/801-4.yml @@ -0,0 +1,88 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms": + post: + summary: Creates a Room + description: | + Create a Room with the request content by this post action. + operationId: CreateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationRequest" + responses: + "301": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationResponse" +components: + schemas: + RoomCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/801.yml b/api-linter/test/testdata/commonops/801.yml new file mode 100644 index 0000000..5c7f2c9 --- /dev/null +++ b/api-linter/test/testdata/commonops/801.yml @@ -0,0 +1,88 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms": + post: + summary: Creates a Room + description: | + Create a Room with the request content by this post action. + operationId: CreateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationResponse" +components: + schemas: + RoomCreationRequest: + type: array + required: + - content + properties: + content: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/802-6.yml b/api-linter/test/testdata/commonops/802-6.yml new file mode 100644 index 0000000..250625a --- /dev/null +++ b/api-linter/test/testdata/commonops/802-6.yml @@ -0,0 +1,106 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: 7eeea381-872c-4b83-a228-31878e5b8de8 + patch: + summary: Updates a Room + description: | + Update the specified Room according to the id parameter by this patch action. + operationId: UpdateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateRequest" + responses: + "301": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateResponse" +components: + schemas: + RoomUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Room" + RoomUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + Room: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 846650de-20fd-4197-867b-00ac7606cffd + - $ref: "#/components/schemas/RoomBase" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/803-2.yml b/api-linter/test/testdata/commonops/803-2.yml new file mode 100644 index 0000000..087bd2a --- /dev/null +++ b/api-linter/test/testdata/commonops/803-2.yml @@ -0,0 +1,111 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: 7eeea381-872c-4b83-a228-31878e5b8de8 + put: + summary: Updates a Room + description: | + Update the specified Room according to the id parameter by this put action. + operationId: UpdateRoom + parameters: + - name: If-Match + in: header + - name: If-None-Match + in: header + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateRequest" + responses: + "301": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateResponse" +components: + schemas: + RoomUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Room" + RoomUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + Room: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 846650de-20fd-4197-867b-00ac7606cffd + - $ref: "#/components/schemas/RoomBase" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/803-6.yml b/api-linter/test/testdata/commonops/803-6.yml new file mode 100644 index 0000000..e5608be --- /dev/null +++ b/api-linter/test/testdata/commonops/803-6.yml @@ -0,0 +1,111 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: 7eeea381-872c-4b83-a228-31878e5b8de8 + put: + summary: Updates a Room + description: | + Update the specified Room according to the id parameter by this put action. + operationId: UpdateRoom + tags: + - Rooms + parameters: + - name: NOT-If-Match + in: header + - name: NOT-If-None-Match + in: header + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateRequest" + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomUpdateResponse" +components: + schemas: + RoomUpdateRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/Room" + RoomUpdateResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + Room: + allOf: + - required: + - id + - type: object + properties: + id: + type: string + example: 846650de-20fd-4197-867b-00ac7606cffd + - $ref: "#/components/schemas/RoomBase" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + \ No newline at end of file diff --git a/api-linter/test/testdata/commonops/804-1.yml b/api-linter/test/testdata/commonops/804-1.yml new file mode 100644 index 0000000..f6ba6a9 --- /dev/null +++ b/api-linter/test/testdata/commonops/804-1.yml @@ -0,0 +1,38 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + "/rooms/{id}": + parameters: + - name: id + in: path + required: true + description: Identifier of a Room resource. + schema: + type: string + example: 7eeea381-872c-4b83-a228-31878e5b8de8 + delete: + summary: Deletes a Room + description: | + Delete the specified Room according to the id parameter by this delete action. + operationId: DeleteRoom + tags: + - Rooms + responses: + "404": + description: No content \ No newline at end of file diff --git a/api-linter/test/testdata/error/.spectral.yml b/api-linter/test/testdata/error/.spectral.yml new file mode 100644 index 0000000..e0af132 --- /dev/null +++ b/api-linter/test/testdata/error/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-error-reporting.yml \ No newline at end of file diff --git a/api-linter/test/testdata/error/300.yml b/api-linter/test/testdata/error/300.yml new file mode 100644 index 0000000..bb3751d --- /dev/null +++ b/api-linter/test/testdata/error/300.yml @@ -0,0 +1,117 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + "99": + description: errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "99" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. diff --git a/api-linter/test/testdata/error/301.yml b/api-linter/test/testdata/error/301.yml new file mode 100644 index 0000000..5cb0a6a --- /dev/null +++ b/api-linter/test/testdata/error/301.yml @@ -0,0 +1,117 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + "423": + description: errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "423" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. diff --git a/api-linter/test/testdata/error/302.yml b/api-linter/test/testdata/error/302.yml new file mode 100644 index 0000000..e1d453b --- /dev/null +++ b/api-linter/test/testdata/error/302.yml @@ -0,0 +1,133 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "423" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. + responses: + DefaultErrors: + description: Standard errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" + examples: + Forbidden: + $ref: "#/components/examples/Forbidden" + examples: + Forbidden: + summary: forbidden + value: + errors: + - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 + status: "421" + code: forbidden + title: Forbidden + detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.1.yml b/api-linter/test/testdata/error/305.1.yml new file mode 100644 index 0000000..6486b27 --- /dev/null +++ b/api-linter/test/testdata/error/305.1.yml @@ -0,0 +1,133 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "423" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + info: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. + responses: + DefaultErrors: + description: Standard errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" + examples: + Forbidden: + $ref: "#/components/examples/Forbidden" + examples: + Forbidden: + summary: forbidden + value: + errors: + - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 + status: "403" + code: forbidden + title: Forbidden + detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.2.yml b/api-linter/test/testdata/error/305.2.yml new file mode 100644 index 0000000..83cdc6d --- /dev/null +++ b/api-linter/test/testdata/error/305.2.yml @@ -0,0 +1,139 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "423" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + responses: + DefaultErrors: + description: Standard errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" + examples: + Forbidden: + $ref: "#/components/examples/Forbidden" + examples: + Forbidden: + summary: forbidden + value: + errors: + - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 + status: "403" + code: forbidden + title: Forbidden + detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.3.yml b/api-linter/test/testdata/error/305.3.yml new file mode 100644 index 0000000..f63fd75 --- /dev/null +++ b/api-linter/test/testdata/error/305.3.yml @@ -0,0 +1,139 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + default: + $ref: "#/components/responses/DefaultErrors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "404" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. + source: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + responses: + DefaultErrors: + description: Standard errors + content: + application/json: + schema: + $ref: "#/components/schemas/Errors" + examples: + Forbidden: + $ref: "#/components/examples/Forbidden" + examples: + Forbidden: + summary: forbidden + value: + errors: + - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 + status: "403" + code: forbidden + title: Forbidden + detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/fields/.spectral.yml b/api-linter/test/testdata/fields/.spectral.yml new file mode 100644 index 0000000..ae2fb30 --- /dev/null +++ b/api-linter/test/testdata/fields/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-sparse-fieldsets.yml \ No newline at end of file diff --git a/api-linter/test/testdata/fields/500.yml b/api-linter/test/testdata/fields/500.yml new file mode 100644 index 0000000..130dcbf --- /dev/null +++ b/api-linter/test/testdata/fields/500.yml @@ -0,0 +1,108 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "401": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/filtering/.spectral.yml b/api-linter/test/testdata/filtering/.spectral.yml new file mode 100644 index 0000000..4ece15f --- /dev/null +++ b/api-linter/test/testdata/filtering/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-filtering.yml \ No newline at end of file diff --git a/api-linter/test/testdata/filtering/400.yml b/api-linter/test/testdata/filtering/400.yml new file mode 100644 index 0000000..6691952 --- /dev/null +++ b/api-linter/test/testdata/filtering/400.yml @@ -0,0 +1,121 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: field + in: query + required: true + description: Identifier of a Course resource. + schema: + type: string + - name: param + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/filtering/401.yml b/api-linter/test/testdata/filtering/401.yml new file mode 100644 index 0000000..f384313 --- /dev/null +++ b/api-linter/test/testdata/filtering/401.yml @@ -0,0 +1,121 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: field + in: query + required: true + description: Identifier of a Course resource. + schema: + type: string + - name: filter + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/.spectral.yml b/api-linter/test/testdata/mediatype/.spectral.yml new file mode 100644 index 0000000..4513222 --- /dev/null +++ b/api-linter/test/testdata/mediatype/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-media-type.yml \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/100.yml b/api-linter/test/testdata/mediatype/100.yml new file mode 100644 index 0000000..7278a7f --- /dev/null +++ b/api-linter/test/testdata/mediatype/100.yml @@ -0,0 +1,80 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/vndjson: + schema: + $ref: "#/components/schemas/RoomsReadResponse" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-1.yml b/api-linter/test/testdata/mediatype/101-1.yml new file mode 100644 index 0000000..afc8584 --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-1.yml @@ -0,0 +1,80 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" +components: + schemas: + RoomsReadResponse: + type: array + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-2.1.yml b/api-linter/test/testdata/mediatype/101-2.1.yml new file mode 100644 index 0000000..3861312 --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-2.1.yml @@ -0,0 +1,81 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" +components: + schemas: + RoomsReadResponse: + type: object + required: + - items + properties: + items: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-2.2.yml b/api-linter/test/testdata/mediatype/101-2.2.yml new file mode 100644 index 0000000..3181532 --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-2.2.yml @@ -0,0 +1,88 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + post: + summary: Creates a Room + description: | + Create a Room with the request content by this post action. + operationId: CreateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationResponse" +components: + schemas: + RoomCreationRequest: + type: object + required: + - item + properties: + item: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-4-1.yml b/api-linter/test/testdata/mediatype/101-4-1.yml new file mode 100644 index 0000000..12f2caf --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-4-1.yml @@ -0,0 +1,88 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + post: + summary: Creates a Room + description: | + Create a Room with the request content by this post action. + operationId: CreateRoom + tags: + - Rooms + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationRequest" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/RoomCreationResponse" +components: + schemas: + RoomCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: double + example: 85734 + \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-7-2.yml b/api-linter/test/testdata/mediatype/101-7-2.yml new file mode 100644 index 0000000..d3b4387 --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-7-2.yml @@ -0,0 +1,168 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + parameters: + - name: cursor + in: query + description: Opaque cursor to fetch specific page + schema: + type: string + default: first page + - name: limit + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + - meta + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + $ref: "#/components/schemas/RoomPageCursor" + meta: + type: array + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + RoomCreationRequest: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomBase" + RoomCreationResponse: + type: object + required: + - data + properties: + data: + $ref: "#/components/schemas/RoomLink" + RoomLink: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85734" + RoomPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + self: + type: string + example: https://api.siemens.com/reference/api/rooms?limit=1 + description: | + Opaque cursor to fetch next elements. To be used as value of query parameter cursor. + Is only added if more elements are present. + next: + type: string + example: https://api.siemens.com/reference/api/rooms?cursor=cXdlcnR5&limit=1 + description: Returned the next elements after the cursor. + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + - totalElements + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. + \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-8.yml b/api-linter/test/testdata/mediatype/101-8.yml new file mode 100644 index 0000000..28eb6ff --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-8.yml @@ -0,0 +1,81 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" +components: + schemas: + RoomsReadResponse: + type: object + required: + - items + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address-detail: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-9.yml b/api-linter/test/testdata/mediatype/101-9.yml new file mode 100644 index 0000000..5d1c626 --- /dev/null +++ b/api-linter/test/testdata/mediatype/101-9.yml @@ -0,0 +1,81 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /roomDetails: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" +components: + schemas: + RoomsReadResponse: + type: object + required: + - items + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/.spectral.yml b/api-linter/test/testdata/pagination/.spectral.yml new file mode 100644 index 0000000..a2ac465 --- /dev/null +++ b/api-linter/test/testdata/pagination/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-pagination.yml \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/600.1.yml b/api-linter/test/testdata/pagination/600.1.yml new file mode 100644 index 0000000..c91d4c6 --- /dev/null +++ b/api-linter/test/testdata/pagination/600.1.yml @@ -0,0 +1,161 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + $ref: "#/components/schemas/RoomPageCursor" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + notself: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + notfirst: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + notlast: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + notnext: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + elements: + type: integer + example: 100 + description: Amount of elements available. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/600.2.yml b/api-linter/test/testdata/pagination/600.2.yml new file mode 100644 index 0000000..bfc6849 --- /dev/null +++ b/api-linter/test/testdata/pagination/600.2.yml @@ -0,0 +1,167 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + $ref: "#/components/schemas/RoomPageCursor" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + page: + $ref: "#/components/schemas/RoomPageCursor2" + RoomPageCursor2: + type: object + description: Pagination links for cursor-based pagination. + properties: + self: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + first: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + last: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + next: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + elements: + type: integer + example: 100 + description: Amount of elements available. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/600.3.yml b/api-linter/test/testdata/pagination/600.3.yml new file mode 100644 index 0000000..ac2c831 --- /dev/null +++ b/api-linter/test/testdata/pagination/600.3.yml @@ -0,0 +1,161 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + $ref: "#/components/schemas/RoomPageCursor" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" + RoomPageCursor: + type: object + description: Pagination links for cursor-based pagination. + properties: + self: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + first: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + notlast: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + next: + type: string + example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + elements: + type: integer + example: 100 + description: Amount of elements available. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/601-1-1.yml b/api-linter/test/testdata/pagination/601-1-1.yml new file mode 100644 index 0000000..4f0f22e --- /dev/null +++ b/api-linter/test/testdata/pagination/601-1-1.yml @@ -0,0 +1,136 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: cursor + in: query + description: Opaque cursor to fetch specific page + schema: + type: string + default: first page + - name: limit + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - next + properties: + next: + type: string + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/601-2-1.yml b/api-linter/test/testdata/pagination/601-2-1.yml new file mode 100644 index 0000000..456b1dc --- /dev/null +++ b/api-linter/test/testdata/pagination/601-2-1.yml @@ -0,0 +1,148 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: offset + in: query + description: Opaque cursor to fetch specific page + schema: + type: integer + default: 0 + - name: limit + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - elements + - offset + - totalElements + properties: + # elements: + # type: integer + # example: 1 + # description: number of records in the current page. + offset: + type: integer + example: 0 + description: current offset. + totalElements: + type: integer + example: 100 + description: Total amount of elements available. + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/601-3-1.1.yml b/api-linter/test/testdata/pagination/601-3-1.1.yml new file mode 100644 index 0000000..5fc9914 --- /dev/null +++ b/api-linter/test/testdata/pagination/601-3-1.1.yml @@ -0,0 +1,148 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + description: Opaque cursor to fetch specific page + schema: + type: integer + default: 1 + - name: size + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + # number: + # type: integer + # example: 1 + # description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/601-3-1.2.yml b/api-linter/test/testdata/pagination/601-3-1.2.yml new file mode 100644 index 0000000..17be859 --- /dev/null +++ b/api-linter/test/testdata/pagination/601-3-1.2.yml @@ -0,0 +1,156 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + description: Opaque cursor to fetch specific page + schema: + type: integer + default: 1 + - name: size + in: query + description: Desired maximum number of elements to be returned. A server may return less elements. + schema: + type: integer + default: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + meta: + type: object + required: + - page + properties: + page: + $ref: "#/components/schemas/PageIndex" + PageIndex: + type: object + description: Pagination metadata for index-based pagination. + required: + - number + - size + - totalPages + properties: + number: + type: integer + example: 1 + description: Current page number, starting from 1. + size: + type: integer + example: 1 + description: Returned number of elements. + totalPages: + type: integer + example: 100 + description: Total amount of pages available. + elements: + type: integer + example: 1 + description: Representing the number of records returned in the current page. + # totalElements: + # type: integer + # example: 1 + # description: Representing the total number of elements. + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/pagination/601.yml b/api-linter/test/testdata/pagination/601.yml new file mode 100644 index 0000000..87946ba --- /dev/null +++ b/api-linter/test/testdata/pagination/601.yml @@ -0,0 +1,109 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + first: + type: string + example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + last: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + next: + type: string + example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/refs/.spectral.yml b/api-linter/test/testdata/refs/.spectral.yml new file mode 100644 index 0000000..e0af132 --- /dev/null +++ b/api-linter/test/testdata/refs/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-error-reporting.yml \ No newline at end of file diff --git a/api-linter/test/testdata/refs/300.yml b/api-linter/test/testdata/refs/300.yml new file mode 100644 index 0000000..155c0cb --- /dev/null +++ b/api-linter/test/testdata/refs/300.yml @@ -0,0 +1,86 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + "99": + description: errors + content: + application/json: + schema: + $ref: "./common_errors.yml#/components/schemas/Errors" +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" diff --git a/api-linter/test/testdata/refs/common_errors.yml b/api-linter/test/testdata/refs/common_errors.yml new file mode 100644 index 0000000..eeb6cfe --- /dev/null +++ b/api-linter/test/testdata/refs/common_errors.yml @@ -0,0 +1,48 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api +paths: + +components: + schemas: + Errors: + type: object + required: + - errors + properties: + errors: + type: array + items: + title: Error + type: object + properties: + id: + type: string + description: Unique identifier for this particular occurrence of the error. + example: df873142-804e-4146-8956-02682c20d23d + status: + type: string + description: HTTP status code applicable to this error. + example: "99" + code: + type: string + description: Unique identifier for this type of error. + example: exampleError + title: + type: string + description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. + example: Example error + detail: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. diff --git a/api-linter/test/testdata/security/.spectral.yml b/api-linter/test/testdata/security/.spectral.yml new file mode 100644 index 0000000..a6a6f68 --- /dev/null +++ b/api-linter/test/testdata/security/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-security.yml \ No newline at end of file diff --git a/api-linter/test/testdata/security/invalid.yml b/api-linter/test/testdata/security/invalid.yml new file mode 100644 index 0000000..4d28497 --- /dev/null +++ b/api-linter/test/testdata/security/invalid.yml @@ -0,0 +1,122 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + # parameters: + # - name: Authorization + # in: header + # required: true + # description: The security token signature. + # schema: + # type: string + # example: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2VuLWlzc3Vlci5zaWVtZW5zLmNvbSIsImlhdCI6MTY5OTg3NTc1OCwiZXhwIjoxNzMxNDExNzU4LCJhdWQiOiJodHRwczovL2V3cy5zaWVtZW5zLmNvbSIsInN1YiI6ImpvaG5AZG9lLmNvbSIsInNjb3BlIjpbImV3cy53ZWF0aGVyLnJlYWQiLCJld3Mud2VhdGhlci5hZG1pbiJdfQ.WwTZepkPTHrCysZ9AiLuN0k7QSDRFs-z4CxN9cvYDgA + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: field + in: query + required: true + description: Identifier of a Course resource. + schema: + type: string + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/security/valid.yml b/api-linter/test/testdata/security/valid.yml new file mode 100644 index 0000000..fddaf12 --- /dev/null +++ b/api-linter/test/testdata/security/valid.yml @@ -0,0 +1,122 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + parameters: + - name: Authorization + in: header + required: true + description: The security token signature. + schema: + type: string + example: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2VuLWlzc3Vlci5zaWVtZW5zLmNvbSIsImlhdCI6MTY5OTg3NTc1OCwiZXhwIjoxNzMxNDExNzU4LCJhdWQiOiJodHRwczovL2V3cy5zaWVtZW5zLmNvbSIsInN1YiI6ImpvaG5AZG9lLmNvbSIsInNjb3BlIjpbImV3cy53ZWF0aGVyLnJlYWQiLCJld3Mud2VhdGhlci5hZG1pbiJdfQ.WwTZepkPTHrCysZ9AiLuN0k7QSDRFs-z4CxN9cvYDgA + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: number + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: size + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: sort + in: query + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + - name: field + in: query + required: true + description: Identifier of a Course resource. + schema: + type: string + responses: + "201": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/versioning/.spectral.yml b/api-linter/test/testdata/versioning/.spectral.yml new file mode 100644 index 0000000..0ab46a9 --- /dev/null +++ b/api-linter/test/testdata/versioning/.spectral.yml @@ -0,0 +1,2 @@ +extends: + - ../../../rulesets/xcelerator-api-versioning.yml \ No newline at end of file diff --git a/api-linter/test/testdata/versioning/200-1.yml b/api-linter/test/testdata/versioning/200-1.yml new file mode 100644 index 0000000..3895be3 --- /dev/null +++ b/api-linter/test/testdata/versioning/200-1.yml @@ -0,0 +1,18 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1.1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. \ No newline at end of file diff --git a/api-linter/test/testdata/versioning/200-2.yml b/api-linter/test/testdata/versioning/200-2.yml new file mode 100644 index 0000000..19ac06f --- /dev/null +++ b/api-linter/test/testdata/versioning/200-2.yml @@ -0,0 +1,94 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: Not-Api-Version + in: header + required: true + description: Identifier of a Course resource. + schema: + type: integer + example: 1 + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/versioning/201.yml b/api-linter/test/testdata/versioning/201.yml new file mode 100644 index 0000000..0161346 --- /dev/null +++ b/api-linter/test/testdata/versioning/201.yml @@ -0,0 +1,94 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. +paths: + /rooms: + get: + summary: Queries Rooms + description: | + Query a collection of Rooms with the request by this get action. + operationId: ReadRooms + tags: + - Rooms + parameters: + - name: Api-Version + in: header + required: true + description: Identifier of a Course resource. + schema: + type: string + example: 275bd2a1-e6cb-4ec3-80f3-22167c6bcaab + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/RoomsReadResponse" + headers: + "Not-Api-Version": + description: The API semantic-version string + schema: + type: string + example: 1.2.1 +components: + schemas: + RoomsReadResponse: + type: object + required: + - data + properties: + data: + type: array + items: + allOf: + - $ref: "#/components/schemas/RoomBase" + - type: object + properties: + links: + type: object + properties: + self: + type: string + example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + description: "#servers/url" + lessons: + type: string + example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + description: "#servers/url" + RoomBase: + type: object + description: Place where course lessons take place. + properties: + code: + type: string + description: Code of the room in a building or site. + example: MI 07.02.013 + address: + type: object + description: Address of the room. + properties: + street: + type: string + example: Boltzmannstr. 3 + city: + type: string + example: Garching b. München + zip: + type: string + example: "85748" \ No newline at end of file diff --git a/api-linter/test/testdata/versioning/semantic-versioning.yml b/api-linter/test/testdata/versioning/semantic-versioning.yml new file mode 100644 index 0000000..7e09ee3 --- /dev/null +++ b/api-linter/test/testdata/versioning/semantic-versioning.yml @@ -0,0 +1,18 @@ +openapi: 3.0.1 +info: + title: Reference OpenAPI Specification + version: 2.0 + contact: + name: API Guidance Team + url: https://api.siemens.com + email: noreply@siemens.com + description: | + This is an example API specification serving as reference for designing and + specifying APIs according to the API guidelines. +servers: + - url: https://api.siemens.com/reference/api/v1 +tags: + - name: Rooms + description: | + Rooms describe the locations where lessons take place. A room can only be + deleted when there are no related lessons. \ No newline at end of file diff --git a/package.json b/package.json index 4e4181a..2c29f09 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "eslint-config-typescript", "eslint-plugin-defaultvalue", "prettier-config", - "stylelint-config-scss" + "stylelint-config-scss", + "api-linter" ] } From bdd99d48ce6ba032de5f6ea63dba1a575d5a7651 Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:18:49 +0200 Subject: [PATCH 02/33] chore: sync npm lockfile with api-linter workspace --- package-lock.json | 22111 ++++++++++++++++++++++++++++++-------------- 1 file changed, 15096 insertions(+), 7015 deletions(-) diff --git a/package-lock.json b/package-lock.json index 734532a..6e7a297 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "eslint-config-typescript", "eslint-plugin-defaultvalue", "prettier-config", - "stylelint-config-scss" + "stylelint-config-scss", + "api-linter" ], "devDependencies": { "@commitlint/cli": "21.2.1", @@ -43,6 +44,31 @@ "typescript-eslint": "8.66.0" } }, + "api-linter": { + "name": "@siemens/api-linter", + "version": "0.8.4", + "license": "MIT", + "dependencies": { + "@jamietanna/spectral-test-harness": "^0.3.0", + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-ruleset-bundler": "^1.5.2", + "commander": "^12.0.0", + "handlebars": "^4.7.7", + "js-yaml": "^4.1.0", + "jsonpath": "^1.1.1", + "standard": "^17.0.0", + "underscore": "^1.13.1" + }, + "bin": { + "api-linter": "src/index.js" + }, + "devDependencies": { + "jest": "^29.0.0", + "jest-junit": "^16.0.0", + "jsonpath": "^1.1.1" + } + }, "commitlint-config": { "name": "@siemens/commitlint-config", "version": "0.0.0-development", @@ -348,6 +374,15 @@ "node": ">=22.13.0" } }, + "node_modules/@asyncapi/specs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.11.1.tgz", + "integrity": "sha512-A3WBLqAKGoJ2+6FWFtpjBlCQ1oFCcs4GxF7zsIGvNqp/klGUHjlA3aAcZ9XMMpLGE8zPeYDz2x9FmO6DSuKraQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.11" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -362,3094 +397,2810 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { + "node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@cacheable/memory": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", - "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.5.0", - "@keyv/bigmap": "^1.3.1", - "hookified": "^1.15.1", - "keyv": "^5.6.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", - "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, "license": "MIT", "dependencies": { - "hashery": "^1.4.0", - "hookified": "^1.15.0" + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "keyv": "^5.6.0" + "node": ">=6.9.0" } }, - "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.1.1" + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@cacheable/utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", - "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", - "license": "MIT", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", "dependencies": { - "hashery": "^1.5.1", - "keyv": "^5.6.0" + "yallist": "^3.0.2" } }, - "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/cli": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.2.1.tgz", - "integrity": "sha512-blsZGe29hJ72VGEFVl72IVYX+1vsfINpjA9yWQA6i7OKD/McGEOXg08sKIRKjFk4JvzhV/9n0l3i6NooPLTNfg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-conventional": "^21.2.0", - "@commitlint/format": "^21.2.0", - "@commitlint/lint": "^21.2.0", - "@commitlint/load": "^21.2.0", - "@commitlint/read": "^21.2.1", - "@commitlint/types": "^21.2.0", - "tinyexec": "^1.0.0", - "yargs": "^18.0.0" - }, - "bin": { - "commitlint": "cli.js" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/config-conventional": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.2.0.tgz", - "integrity": "sha512-Qf8WRDVcyVd14if6VTWenebxFbKnVnbzPUJjlzjkyJGeHK2xCGd63Dr1XZzj0plXKQb9P0BfOxoc1HVeCo2BWQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^21.2.0", - "conventional-changelog-conventionalcommits": "^10.0.0" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@commitlint/config-validator": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.0.tgz", - "integrity": "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, "license": "MIT", - "dependencies": { - "@commitlint/types": "^21.2.0", - "ajv": "^8.11.0" - }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/ensure": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.0.tgz", - "integrity": "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==", + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, "license": "MIT", - "dependencies": { - "@commitlint/types": "^21.2.0", - "es-toolkit": "^1.46.0" - }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/execute-rule": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", - "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/format": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.0.tgz", - "integrity": "sha512-c4q64xaav2U83t7k7RyzJerBZurPer7FxUOY0RL5L/6CZijZ7K+s6HIBGIghj0ey1P2+seRX0J9XQYtDued6tg==", + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, "license": "MIT", - "dependencies": { - "@commitlint/types": "^21.2.0", - "picocolors": "^1.1.1" - }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/is-ignored": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.0.tgz", - "integrity": "sha512-4/eB0vBN7L88O/oC4ajAEqi7j2ZfNgxl/+11RfAV9YosejZgDXhY2C9VcHnHJhOzPLoSy5P3Mg/46kqeyJfXKw==", + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^21.2.0", - "semver": "^7.6.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/lint": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.0.tgz", - "integrity": "sha512-ceO5dp9pLjEZ6y6qbq/uXWXDPykqqlTsyzoQ0NzecpisSJhK3kTy9qzQoPeJuWG/IMNdV1lO0RgmzqoAlSi1uw==", + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^21.2.0", - "@commitlint/parse": "^21.2.0", - "@commitlint/rules": "^21.2.0", - "@commitlint/types": "^21.2.0" + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.0.0" } }, - "node_modules/@commitlint/load": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.0.tgz", - "integrity": "sha512-RjlzWQqruRwIenJEfZtq7kG97co97nKoHpflE5YnF61tDLXxHPrdWImgzw6VL6MlFyaOcVlk74eBV8ZQmc3oIA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^21.2.0", - "@commitlint/execute-rule": "^21.0.1", - "@commitlint/resolve-extends": "^21.2.0", - "@commitlint/types": "^21.2.0", - "cosmiconfig": "^9.0.1", - "cosmiconfig-typescript-loader": "^6.1.0", - "es-toolkit": "^1.46.0", - "is-plain-obj": "^4.1.0", - "picocolors": "^1.1.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=22.12.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/message": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.2.0.tgz", - "integrity": "sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/parse": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.0.tgz", - "integrity": "sha512-QHWxG4d0PLTF634/AdyZ0MQS+CLn5YOuJlCFhMMlSGKFxzYGUetkHBj18xgBD+6fVzUrA2lrCdi/vlS2f/oYXg==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^21.2.0", - "conventional-changelog-angular": "^9.0.0", - "conventional-commits-parser": "^7.0.0" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=22.12.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/read": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.1.tgz", - "integrity": "sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/top-level": "^21.2.0", - "@commitlint/types": "^21.2.0", - "@conventional-changelog/git-client": "^3.0.0", - "tinyexec": "^1.0.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.0.tgz", - "integrity": "sha512-4O/1j51+79Wth9s/MGxt/5gs0XYLDgNlYpltQfhAvLE0itusLKs9zruxbiNg1oOkmkb9L9L4USYGjEj7n87NxA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^21.2.0", - "@commitlint/types": "^21.2.0", - "es-toolkit": "^1.46.0", - "global-directory": "^5.0.0", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@commitlint/rules": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.0.tgz", - "integrity": "sha512-C2yXMNpiB8ETZKfx5JD8+ExgF8vTU1VQMKPSUUYwqKpw9oJWQBrlXBpdU038mj2WPjof7o9UzFpmTyBeGMZwZg==", - "license": "MIT", - "dependencies": { - "@commitlint/ensure": "^21.2.0", - "@commitlint/message": "^21.2.0", - "@commitlint/to-lines": "^21.0.1", - "@commitlint/types": "^21.2.0" + "node": ">=6.9.0" }, - "engines": { - "node": ">=22.12.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/to-lines": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", - "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=22.12.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/top-level": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.2.0.tgz", - "integrity": "sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "license": "MIT", "dependencies": { - "escalade": "^3.2.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=22.12.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/types": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.0.tgz", - "integrity": "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, "license": "MIT", "dependencies": { - "conventional-commits-parser": "^7.0.0", - "picocolors": "^1.1.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { - "node": ">=22.12.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@conventional-changelog/git-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-3.1.0.tgz", - "integrity": "sha512-Tqa/gHco2WJWa740NRjOrfKVvzIqxkZpecb8bemaQ8sKM5PXb1UK4uTyTb/1wIqNuOVaDOFxyBdhTIQZn6gdjQ==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "license": "MIT", "dependencies": { - "@simple-libs/child-process-utils": "^2.0.0", - "@simple-libs/stream-utils": "^2.0.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=22" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { - "conventional-commits-filter": "^6.0.1", - "conventional-commits-parser": "^7.0.1" - }, - "peerDependenciesMeta": { - "conventional-commits-filter": { - "optional": true - }, - "conventional-commits-parser": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@conventional-changelog/template": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@conventional-changelog/template/-/template-1.2.1.tgz", - "integrity": "sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=22" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=20.19.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=20.19.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", - "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=20.19.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/media-query-list-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", - "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=20.19.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/selector-resolve-nested": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.1.tgz", - "integrity": "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=20.19.0" + "node": ">=6.9.0" }, "peerDependencies": { - "postcss-selector-parser": "^7.1.1" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@csstools/selector-specificity": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", - "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { - "node": ">=20.19.0" + "node": ">=6.9.0" }, "peerDependencies": { - "postcss-selector-parser": "^7.1.1" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, + "license": "MIT" + }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, "engines": { - "node": ">=18" + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@keyv/serialize": "^1.1.1" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@keyv/serialize": "^1.1.1" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=0.1.90" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@commitlint/cli": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.2.1.tgz", + "integrity": "sha512-blsZGe29hJ72VGEFVl72IVYX+1vsfINpjA9yWQA6i7OKD/McGEOXg08sKIRKjFk4JvzhV/9n0l3i6NooPLTNfg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/config-conventional": "^21.2.0", + "@commitlint/format": "^21.2.0", + "@commitlint/lint": "^21.2.0", + "@commitlint/load": "^21.2.0", + "@commitlint/read": "^21.2.1", + "@commitlint/types": "^21.2.0", + "tinyexec": "^1.0.0", + "yargs": "^18.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@commitlint/config-conventional": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.2.0.tgz", + "integrity": "sha512-Qf8WRDVcyVd14if6VTWenebxFbKnVnbzPUJjlzjkyJGeHK2xCGd63Dr1XZzj0plXKQb9P0BfOxoc1HVeCo2BWQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "conventional-changelog-conventionalcommits": "^10.0.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@commitlint/config-validator": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.0.tgz", + "integrity": "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "ajv": "^8.11.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@commitlint/ensure": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.0.tgz", + "integrity": "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "es-toolkit": "^1.46.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@commitlint/execute-rule": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", + "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@commitlint/format": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.0.tgz", + "integrity": "sha512-c4q64xaav2U83t7k7RyzJerBZurPer7FxUOY0RL5L/6CZijZ7K+s6HIBGIghj0ey1P2+seRX0J9XQYtDued6tg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/@commitlint/is-ignored": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.0.tgz", + "integrity": "sha512-4/eB0vBN7L88O/oC4ajAEqi7j2ZfNgxl/+11RfAV9YosejZgDXhY2C9VcHnHJhOzPLoSy5P3Mg/46kqeyJfXKw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "semver": "^7.6.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@commitlint/lint": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.0.tgz", + "integrity": "sha512-ceO5dp9pLjEZ6y6qbq/uXWXDPykqqlTsyzoQ0NzecpisSJhK3kTy9qzQoPeJuWG/IMNdV1lO0RgmzqoAlSi1uw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@commitlint/is-ignored": "^21.2.0", + "@commitlint/parse": "^21.2.0", + "@commitlint/rules": "^21.2.0", + "@commitlint/types": "^21.2.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@commitlint/load": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.0.tgz", + "integrity": "sha512-RjlzWQqruRwIenJEfZtq7kG97co97nKoHpflE5YnF61tDLXxHPrdWImgzw6VL6MlFyaOcVlk74eBV8ZQmc3oIA==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@commitlint/config-validator": "^21.2.0", + "@commitlint/execute-rule": "^21.0.1", + "@commitlint/resolve-extends": "^21.2.0", + "@commitlint/types": "^21.2.0", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "es-toolkit": "^1.46.0", + "is-plain-obj": "^4.1.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@commitlint/message": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.2.0.tgz", + "integrity": "sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@commitlint/parse": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.0.tgz", + "integrity": "sha512-QHWxG4d0PLTF634/AdyZ0MQS+CLn5YOuJlCFhMMlSGKFxzYGUetkHBj18xgBD+6fVzUrA2lrCdi/vlS2f/oYXg==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@commitlint/types": "^21.2.0", + "conventional-changelog-angular": "^9.0.0", + "conventional-commits-parser": "^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@commitlint/read": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.1.tgz", + "integrity": "sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@commitlint/top-level": "^21.2.0", + "@commitlint/types": "^21.2.0", + "@conventional-changelog/git-client": "^3.0.0", + "tinyexec": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@commitlint/resolve-extends": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.0.tgz", + "integrity": "sha512-4O/1j51+79Wth9s/MGxt/5gs0XYLDgNlYpltQfhAvLE0itusLKs9zruxbiNg1oOkmkb9L9L4USYGjEj7n87NxA==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@commitlint/config-validator": "^21.2.0", + "@commitlint/types": "^21.2.0", + "es-toolkit": "^1.46.0", + "global-directory": "^5.0.0", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@commitlint/rules": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.0.tgz", + "integrity": "sha512-C2yXMNpiB8ETZKfx5JD8+ExgF8vTU1VQMKPSUUYwqKpw9oJWQBrlXBpdU038mj2WPjof7o9UzFpmTyBeGMZwZg==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@commitlint/ensure": "^21.2.0", + "@commitlint/message": "^21.2.0", + "@commitlint/to-lines": "^21.0.1", + "@commitlint/types": "^21.2.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@commitlint/to-lines": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", + "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@commitlint/top-level": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.2.0.tgz", + "integrity": "sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "escalade": "^3.2.0" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@commitlint/types": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.0.tgz", + "integrity": "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "conventional-commits-parser": "^7.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": ">=22.12.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "node_modules/@conventional-changelog/git-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-3.1.0.tgz", + "integrity": "sha512-Tqa/gHco2WJWa740NRjOrfKVvzIqxkZpecb8bemaQ8sKM5PXb1UK4uTyTb/1wIqNuOVaDOFxyBdhTIQZn6gdjQ==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@simple-libs/child-process-utils": "^2.0.0", + "@simple-libs/stream-utils": "^2.0.0", + "semver": "^7.5.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=22" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "conventional-commits-filter": "^6.0.1", + "conventional-commits-parser": "^7.0.1" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@conventional-changelog/template": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/template/-/template-1.2.1.tgz", + "integrity": "sha512-TzlTVpKPjaqW6qOYjQcYUDuGsLCNsvFHVBXkYGTAnf5V37jCWrE5haKNXzz0WZUtVHjrpV76L1buANjwXMfT8w==", "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=22" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1" - }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" + "node": ">=20.19.0" }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "peer": true, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": ">=20.19.0" }, "peerDependencies": { - "eslint": "^10.0.0" + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" }, "peerDependenciesMeta": { - "eslint": { + "css-tree": { "optional": true } } }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", - "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=20.19.0" } }, - "node_modules/@hono/node-server": { - "version": "1.19.17", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.17.tgz", - "integrity": "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==", + "node_modules/@csstools/media-query-list-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", + "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "peer": true, "engines": { - "node": ">=18.14.1" + "node": ">=20.19.0" }, "peerDependencies": { - "hono": "^4" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.1.tgz", + "integrity": "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" + "node": ">=20.19.0" }, - "engines": { - "node": ">=18.18.0" + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" } }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "license": "Apache-2.0", + "node_modules/@csstools/selector-specificity": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=18.18.0" + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "license": "Apache-2.0", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "license": "Apache-2.0", + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@inquirer/ansi": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", - "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + "node": ">=18" } }, - "node_modules/@inquirer/checkbox": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", - "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/core": "^11.2.1", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/confirm": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", - "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/core": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", - "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7", - "cli-width": "^4.1.0", - "fast-wrap-ansi": "^0.2.0", - "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/editor": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", - "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/external-editor": "^3.0.3", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/expand": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", - "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/figures": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", - "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + "node": ">=18" } }, - "node_modules/@inquirer/input": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", - "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/number": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", - "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/password": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", - "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/prompts": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", - "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/checkbox": "^5.2.1", - "@inquirer/confirm": "^6.1.1", - "@inquirer/editor": "^5.2.2", - "@inquirer/expand": "^5.1.1", - "@inquirer/input": "^5.1.2", - "@inquirer/number": "^4.1.1", - "@inquirer/password": "^5.1.1", - "@inquirer/rawlist": "^5.3.1", - "@inquirer/search": "^4.2.1", - "@inquirer/select": "^5.2.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/rawlist": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", - "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/search": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", - "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/select": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", - "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/core": "^11.2.1", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@inquirer/type": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", - "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "license": "MIT" - }, - "node_modules/@listr2/prompt-adapter-inquirer": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-4.2.4.tgz", - "integrity": "sha512-/KRI2DMD7JGSYaREF0Ygl7AefJ/2ase4Gc5cBiKqT5l4tFjsSJfhFGcc5nSkgl0Sp9LkCQNzl/cqbVJYP2L3dw==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@inquirer/type": "^4.0.6" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=22.13.0" - }, - "peerDependencies": { - "@inquirer/prompts": ">= 3 < 9", - "listr2": "10.2.1" + "node": ">=18" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", - "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", - "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.18.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 20" + "node": ">=18" } }, - "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 20" + "node": ">=18" } }, - "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", - "dev": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.2" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">= 20" + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", - "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", - "dev": true, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "license": "Apache-2.0", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" }, "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=7" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "license": "Apache-2.0", "dependencies": { - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" + "@eslint/core": "^1.2.1" }, "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": "^7.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@octokit/request": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", - "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "license": "Apache-2.0", "dependencies": { - "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "content-type": "^2.0.0", - "json-with-bigint": "^3.5.3", - "universal-user-agent": "^7.0.2" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">= 20" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", - "dev": true, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 20" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@octokit/request/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "dev": true, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", - "dev": true, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^27.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=12.22.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, "engines": { - "node": ">=12.22.0" + "node": ">= 4" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, - "node_modules/@pnpm/npm-conf": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", - "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/@schematics/angular": { - "version": "22.1.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-22.1.2.tgz", - "integrity": "sha512-52udja/QGSNH5geSnL4JWFOEfx8M7tqf7LNXz8byjki4VshVOkKHTawQcL4YbJfo3MfwwXm4AsoadMOk8EST2w==", + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "license": "MIT", "peer": true, - "dependencies": { - "@angular-devkit/core": "22.1.2", - "@angular-devkit/schematics": "22.1.2", - "jsonc-parser": "3.3.1", - "typescript": "6.0.3" - }, "engines": { - "node": "^22.22.3 || ^24.15.0 || >=26.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", - "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-writer": "^8.0.0", - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0", - "debug": "^4.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "engines": { - "node": ">=20.8.1" + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "semantic-release": ">=20.1.0" + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/@simple-libs/stream-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", - "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", - "dev": true, - "license": "MIT", + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "license": "Apache-2.0", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://ko-fi.com/dangreen" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-changelog-angular": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", - "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", - "dev": true, - "license": "ISC", + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "license": "Apache-2.0", "dependencies": { - "compare-func": "^2.0.0" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, + "node_modules/@hono/node-server": { + "version": "1.19.17", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.17.tgz", + "integrity": "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=18" + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-parser": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", - "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", - "dev": true, - "license": "MIT", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "license": "Apache-2.0", "dependencies": { - "@simple-libs/stream-utils": "^1.2.0", - "meow": "^13.0.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" + "@humanfs/types": "^0.15.0" }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "dev": true, - "license": "MIT", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@semantic-release/github": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.9.tgz", - "integrity": "sha512-ODIqb0V3QqndipryEEiaBxUQCFjvv7Oese5Dt4omMGa60YRNEW0Sx3K+zri0uac2Y6S9nOlMehciWIzvvRCTGQ==", - "dev": true, - "license": "MIT", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", "dependencies": { - "@octokit/core": "^7.0.0", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/plugin-retry": "^8.0.0", - "@octokit/plugin-throttling": "^11.0.0", - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "debug": "^4.3.4", - "dir-glob": "^3.0.1", - "http-proxy-agent": "^9.0.0", - "https-proxy-agent": "^9.0.0", - "issue-parser": "^7.0.0", - "lodash-es": "^4.17.21", - "mime": "^4.0.0", - "p-filter": "^4.0.0", - "tinyglobby": "^0.2.14", - "undici": "^7.0.0", - "url-join": "^5.0.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": "^22.14.0 || >= 24.10.0" - }, - "peerDependencies": { - "semantic-release": ">=24.1.0" + "node": ">=10.10.0" } }, - "node_modules/@semantic-release/npm": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.5.tgz", - "integrity": "sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==", - "dev": true, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { - "@actions/core": "^3.0.0", - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "env-ci": "^11.2.0", - "execa": "^9.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^9.0.0", - "npm": "^11.6.2", - "rc": "^1.2.8", - "read-pkg": "^10.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": "^22.14.0 || >= 24.10.0" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", - "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", - "dev": true, - "license": "MIT", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-writer": "^8.0.0", - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0", - "debug": "^4.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "read-package-up": "^11.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=20.8.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" + "node": "*" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/@simple-libs/stream-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", - "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", - "dev": true, - "license": "MIT", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" }, "funding": { - "url": "https://ko-fi.com/dangreen" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-changelog-angular": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", - "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0" - }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", - "dev": true, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", "license": "MIT", + "peer": true, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-parser": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", - "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", - "dev": true, + "node_modules/@inquirer/checkbox": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", "license": "MIT", + "peer": true, "dependencies": { - "@simple-libs/stream-utils": "^1.2.0", - "meow": "^13.0.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "license": "MIT", + "peer": true, "dependencies": { - "lru-cache": "^10.0.1" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "dev": true, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@inquirer/editor": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "license": "MIT", + "peer": true, "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, + "node_modules/@inquirer/expand": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", "license": "MIT", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", - "dev": true, + "node_modules/@inquirer/external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", "license": "MIT", + "peer": true, "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, + "peer": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/@inquirer/input": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, "engines": { - "node": ">=16" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, + "node_modules/@inquirer/number": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@siemens/commitlint-config": { - "resolved": "commitlint-config", - "link": true - }, - "node_modules/@siemens/eslint-config-angular": { - "resolved": "eslint-config-angular", - "link": true - }, - "node_modules/@siemens/eslint-config-typescript": { - "resolved": "eslint-config-typescript", - "link": true - }, - "node_modules/@siemens/eslint-plugin-defaultvalue": { - "resolved": "eslint-plugin-defaultvalue", - "link": true - }, - "node_modules/@siemens/prettier-config": { - "resolved": "prettier-config", - "link": true - }, - "node_modules/@siemens/stylelint-config-scss": { - "resolved": "stylelint-config-scss", - "link": true - }, - "node_modules/@simple-libs/child-process-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-2.0.0.tgz", - "integrity": "sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==", + "node_modules/@inquirer/password": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", "license": "MIT", + "peer": true, "dependencies": { - "@simple-libs/stream-utils": "^2.0.0" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=22" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://ko-fi.com/dangreen" - } - }, - "node_modules/@simple-libs/stream-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-2.0.0.tgz", - "integrity": "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==", - "license": "MIT", - "engines": { - "node": ">=22" + "peerDependencies": { + "@types/node": ">=18" }, - "funding": { - "url": "https://ko-fi.com/dangreen" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, + "node_modules/@inquirer/prompts": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", + "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" + }, "engines": { - "node": ">=10" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "node_modules/@inquirer/rawlist": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, "engines": { - "node": ">=18" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "node_modules/@inquirer/search": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", "license": "MIT", + "peer": true, "dependencies": { - "undici-types": "~7.18.0" + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz", - "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==", + "node_modules/@inquirer/select": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", "license": "MIT", + "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/type-utils": "8.66.0", - "@typescript-eslint/utils": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.66.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", - "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", - "debug": "^4.4.3" - }, + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", - "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", - "license": "MIT", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.66.0", - "@typescript-eslint/types": "^8.66.0", - "debug": "^4.4.3" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/rule-tester": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.66.0.tgz", - "integrity": "sha512-un0c+WFK1Bu9EqgJxu+IsKfOZEhzjnMlRub35L9UKVGEc6nAAbKoDTPAVaf5EvGSOPuECBxErv2Zu9s8pkbs9Q==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/parser": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/utils": "8.66.0", - "ajv": "^6.12.6", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "4.6.2", - "semver": "^7.7.3" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=4" } }, - "node_modules/@typescript-eslint/rule-tester/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/@typescript-eslint/rule-tester/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", - "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0" + "p-locate": "^4.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", - "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz", - "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0", - "@typescript-eslint/utils": "8.66.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", - "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", - "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jamietanna/spectral-test-harness": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@jamietanna/spectral-test-harness/-/spectral-test-harness-0.3.0.tgz", + "integrity": "sha512-kAQmMVhR++o7VLA95dGlSKUwvA9nE0htASO0onAxCZwsFqf3rpUK1C4NPPoic9XKZ2iAYLlzbScdNQthIK7QbA==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/project-service": "8.66.0", - "@typescript-eslint/tsconfig-utils": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/visitor-keys": "8.66.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" + "@stoplight/spectral-core": "^1.8.0", + "@stoplight/spectral-parsers": "^1.0.1", + "@stoplight/spectral-ruleset-bundler": "^1.1.0", + "@stoplight/spectral-runtime": "^1.0.0", + "@stoplight/types": "^12.3.0" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz", - "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==", + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.66.0", - "@typescript-eslint/types": "8.66.0", - "@typescript-eslint/typescript-estree": "8.66.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.66.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", - "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.66.0", - "eslint-visitor-keys": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "license": "Apache-2.0", + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "type-fest": "^0.21.3" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agent-base": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", - "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 20" + "node": ">=8" } }, - "node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@jest/core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/angular-eslint": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-22.1.0.tgz", - "integrity": "sha512-LU5a6MOSeQTETnc4xaHi10p9S1cstNczr93sChi3rx8IzgH4+risIsjjQHVLSnQDrSGH2O8jAGCaChker7f7TQ==", + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 22.0.0 < 23.0.0", - "@angular-devkit/schematics": ">= 22.0.0 < 23.0.0", - "@angular-eslint/builder": "22.1.0", - "@angular-eslint/eslint-plugin": "22.1.0", - "@angular-eslint/eslint-plugin-template": "22.1.0", - "@angular-eslint/schematics": "22.1.0", - "@angular-eslint/template-parser": "22.1.0", - "@typescript-eslint/types": "^8.0.0", - "@typescript-eslint/utils": "^8.0.0" + "ansi-regex": "^5.0.1" }, - "peerDependencies": { - "@angular/cli": ">= 22.0.0 < 23.0.0", - "eslint": "^9.0.0 || ^10.0.0", - "typescript": "*", - "typescript-eslint": "^8.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, + "node_modules/@jest/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/argue-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/argue-cli/-/argue-cli-3.1.0.tgz", - "integrity": "sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==", "license": "MIT", - "engines": { - "node": ">=22" + "dependencies": { + "jest-get-type": "^29.6.3" }, - "funding": { - "url": "https://ko-fi.com/dangreen" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/@jest/reporters/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { - "node": "18 || 20 || >=22" + "node": ">=8" } }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", - "peer": true, "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" - }, - "engines": { - "node": ">=18" + "color-convert": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "peer": true, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "node_modules/@jest/reporters/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", - "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", - "license": "MIT", - "dependencies": { - "@cacheable/memory": "^2.2.0", - "@cacheable/utils": "^2.5.0", - "hookified": "^1.15.0", - "keyv": "^5.6.0", - "qified": "^0.10.1" - } - }, - "node_modules/cacheable/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "peer": true, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "peer": true, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/@jest/reporters/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/chardet": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", - "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", - "license": "MIT", - "peer": true - }, - "node_modules/clean-stack": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", - "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "5.0.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^5.0.0" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "node_modules/@jest/test-sequencer/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=8" } }, - "node_modules/cli-highlight/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cli-highlight/node_modules/ansi-styles": { + "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -3465,7 +3216,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/chalk": { + "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -3482,960 +3233,979 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@jest/transform/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "license": "ISC" }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "node_modules/@jest/transform/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/cli-highlight/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cli-highlight/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", - "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/cli-spinners": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.0.0" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "string-width": "^4.2.0" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "license": "MIT", "engines": { - "node": "10.* || >= 12.*" + "node": ">= 10.16.0" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/@jsep-plugin/ternary": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz", + "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "license": "MIT" + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-4.2.4.tgz", + "integrity": "sha512-/KRI2DMD7JGSYaREF0Ygl7AefJ/2ase4Gc5cBiKqT5l4tFjsSJfhFGcc5nSkgl0Sp9LkCQNzl/cqbVJYP2L3dw==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@inquirer/type": "^4.0.6" }, "engines": { - "node": ">=8" + "node": ">=22.13.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 9", + "listr2": "10.2.1" } }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" } }, - "node_modules/cli-truncate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "slice-ansi": "^8.0.0", - "string-width": "^8.2.0" - }, - "engines": { - "node": ">=20" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "license": "MIT", "peer": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" }, "engines": { - "node": ">=20" + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 8" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "engines": { + "node": ">= 20" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.6" + "node": ">= 20" } }, - "node_modules/conventional-changelog-angular": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-9.2.1.tgz", - "integrity": "sha512-oWSL6ZhnXbYraOFTK3PgRAQJ8fADDAEv5K6AdeyQPLvjFmhG8+ejL0jZZp/R7vTmGJaBvZEE+sE7dB4bCv7sAw==", - "license": "ISC", + "node_modules/@octokit/endpoint": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "dev": true, + "license": "MIT", "dependencies": { - "@conventional-changelog/template": "^1.2.1" + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">=22" + "node": ">= 20" } }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-10.2.1.tgz", - "integrity": "sha512-n4Kr1HFMTf3iMbES0TMxKIcYtUUv4rKqyQQp2JwfOEfFCOfGT3Tq4mCyJ8S9/YPyWhydjfKrrvnyl+gCjA+mJQ==", - "license": "ISC", + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "dev": true, + "license": "MIT", "dependencies": { - "@conventional-changelog/template": "^1.2.1" + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">=22" + "node": ">= 20" } }, - "node_modules/conventional-changelog-writer": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", - "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "dev": true, "license": "MIT", "dependencies": { - "@simple-libs/stream-utils": "^1.2.0", - "conventional-commits-filter": "^5.0.0", - "handlebars": "^4.7.7", - "meow": "^13.0.0", - "semver": "^7.5.2" - }, - "bin": { - "conventional-changelog-writer": "dist/cli/index.js" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">=18" + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" } }, - "node_modules/conventional-changelog-writer/node_modules/@simple-libs/stream-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", - "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "node_modules/@octokit/plugin-retry": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", + "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", "dev": true, "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, "engines": { - "node": ">=18" + "node": ">= 20" }, - "funding": { - "url": "https://ko-fi.com/dangreen" + "peerDependencies": { + "@octokit/core": ">=7" } }, - "node_modules/conventional-changelog-writer/node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "dev": true, "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, "engines": { - "node": ">=18" + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": "^7.0.0" } }, - "node_modules/conventional-changelog-writer/node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "node_modules/@octokit/request": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", + "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@octokit/endpoint": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "content-type": "^2.0.0", + "json-with-bigint": "^3.5.3", + "universal-user-agent": "^7.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 20" } }, - "node_modules/conventional-commits-parser": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-7.1.2.tgz", - "integrity": "sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==", + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "dev": true, "license": "MIT", "dependencies": { - "@simple-libs/stream-utils": "^2.0.0", - "argue-cli": "^3.1.0" - }, - "bin": { - "conventional-commits-parser": "dist/cli/index.js" + "@octokit/types": "^16.0.0" }, "engines": { - "node": ">=22" + "node": ">= 20" } }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "node_modules/@octokit/request/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" + "dependencies": { + "@octokit/openapi-types": "^27.0.0" } }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6.6.0" + "node": ">=12.22.0" } }, - "node_modules/copy-file": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/copy-file/-/copy-file-11.1.0.tgz", - "integrity": "sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.11", - "p-event": "^6.0.0" + "graceful-fs": "4.2.10" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.22.0" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "node_modules/@pnpm/npm-conf": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=12" } }, - "node_modules/cosmiconfig": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", - "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "node_modules/@rollup/plugin-commonjs": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.2.tgz", + "integrity": "sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==", "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">= 12.0.0" }, "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "rollup": "^2.68.0" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", - "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "node_modules/@rollup/plugin-commonjs/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { - "jiti": "2.6.1" - }, - "engines": { - "node": ">=v18" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=9", - "typescript": ">=5" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/cpy": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-13.2.2.tgz", - "integrity": "sha512-FEc7gmNSj4mDQCWNt3mByVn3qZX3EjMvggiqgCQPF1yJAFfyX6Ai/emN89w18TRp+QcFmdTLgX3hfNnIVgYHcw==", - "dev": true, - "license": "MIT", + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "dependencies": { - "copy-file": "^11.1.0", - "globby": "^16.1.0", - "junk": "^4.0.1", - "micromatch": "^4.0.8", - "p-filter": "^4.1.0", - "p-map": "^7.0.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=20" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cpy-cli": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-7.0.0.tgz", - "integrity": "sha512-uGCdhIxGfZcPXidCuT8w1jBknVXFx0un7NLjzqBZcdnkIWtLUnWMPk5TC37ceoVjwASLSNsRtTXXNTuFIyE2ng==", - "dev": true, + "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "license": "MIT", "dependencies": { - "cpy": "^13.2.0", - "globby": "^16.1.0", - "meow": "^14.0.0" - }, - "bin": { - "cpy": "cli.js" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "sourcemap-codec": "^1.4.8" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 8" + "node": "*" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=12" + "node": ">= 8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/css-functions-list": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", - "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", - "license": "MIT", - "engines": { - "node": ">=12" - } + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@schematics/angular": { + "version": "22.1.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-22.1.2.tgz", + "integrity": "sha512-52udja/QGSNH5geSnL4JWFOEfx8M7tqf7LNXz8byjki4VshVOkKHTawQcL4YbJfo3MfwwXm4AsoadMOk8EST2w==", "license": "MIT", + "peer": true, "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" + "@angular-devkit/core": "22.1.2", + "@angular-devkit/schematics": "22.1.2", + "jsonc-parser": "3.3.1", + "typescript": "6.0.3" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@semantic-release/commit-analyzer": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", + "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=6.0" + "node": ">=20.8.1" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/@semantic-release/commit-analyzer/node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "peer": true, + "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/@semantic-release/commit-analyzer/node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/@semantic-release/commit-analyzer/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT", - "peer": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "license": "BSD-2-Clause", - "peer": true, + "node_modules/@semantic-release/github": { + "version": "12.0.9", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.9.tgz", + "integrity": "sha512-ODIqb0V3QqndipryEEiaBxUQCFjvv7Oese5Dt4omMGa60YRNEW0Sx3K+zri0uac2Y6S9nOlMehciWIzvvRCTGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^7.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-retry": "^8.0.0", + "@octokit/plugin-throttling": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "http-proxy-agent": "^9.0.0", + "https-proxy-agent": "^9.0.0", + "issue-parser": "^7.0.0", + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "tinyglobby": "^0.2.14", + "undici": "^7.0.0", + "url-join": "^5.0.0" + }, "engines": { - "node": ">=20.19.0" + "node": "^22.14.0 || >= 24.10.0" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependencies": { + "semantic-release": ">=24.1.0" } }, - "node_modules/env-ci": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", - "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", + "node_modules/@semantic-release/npm": { + "version": "13.1.5", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.5.tgz", + "integrity": "sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^8.0.0", - "java-properties": "^1.0.2" + "@actions/core": "^3.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "env-ci": "^11.2.0", + "execa": "^9.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^9.0.0", + "npm": "^11.6.2", + "rc": "^1.2.8", + "read-pkg": "^10.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": "^22.14.0 || >= 24.10.0" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/env-ci/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/@semantic-release/release-notes-generator": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", + "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "read-package-up": "^11.0.0" }, "engines": { - "node": ">=16.17" + "node": ">=20.8.1" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/env-ci/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/@semantic-release/release-notes-generator/node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, "engines": { - "node": ">=16.17.0" + "node": ">=18" } }, - "node_modules/env-ci/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/conventional-commits-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "@simple-libs/stream-utils": "^1.2.0", + "meow": "^13.0.0" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "conventional-commits-parser": "dist/cli/index.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "node_modules/env-ci/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "mimic-fn": "^4.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/env-ci/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/env-ci/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/@semantic-release/release-notes-generator/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", + "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/@semantic-release/release-notes-generator/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, "engines": { "node": ">=18" }, @@ -4443,1756 +4213,2187 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "node_modules/@semantic-release/release-notes-generator/node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/@semantic-release/release-notes-generator/node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", + "node_modules/@semantic-release/release-notes-generator/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "node_modules/@semantic-release/release-notes-generator/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-toolkit": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", - "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks", - "tests/types" - ] + "node_modules/@siemens/api-linter": { + "resolved": "api-linter", + "link": true }, - "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, + "node_modules/@siemens/commitlint-config": { + "resolved": "commitlint-config", + "link": true + }, + "node_modules/@siemens/eslint-config-angular": { + "resolved": "eslint-config-angular", + "link": true + }, + "node_modules/@siemens/eslint-config-typescript": { + "resolved": "eslint-config-typescript", + "link": true + }, + "node_modules/@siemens/eslint-plugin-defaultvalue": { + "resolved": "eslint-plugin-defaultvalue", + "link": true + }, + "node_modules/@siemens/prettier-config": { + "resolved": "prettier-config", + "link": true + }, + "node_modules/@siemens/stylelint-config-scss": { + "resolved": "stylelint-config-scss", + "link": true + }, + "node_modules/@simple-libs/child-process-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-2.0.0.tgz", + "integrity": "sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@simple-libs/stream-utils": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=22" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "funding": { + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/@simple-libs/stream-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-2.0.0.tgz", + "integrity": "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=22" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, - "node_modules/escape-string-regexp": { + "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", - "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", - "license": "MIT", - "workspaces": [ - "packages/*" - ], + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.7.0", - "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.2", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "type-detect": "4.0.8" } }, - "node_modules/eslint-plugin-headers": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-headers/-/eslint-plugin-headers-1.3.4.tgz", - "integrity": "sha512-sfgmrq+geMaB7yilx1wbbzSHTmLRPm+hX6kxJhb6LQQwmF00CqZ8d3ks2ZADlDdREhP31THPHgRhcQuDogVZ4w==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "ISC", - "engines": { - "node": "^16.0.0 || >= 18.0.0" - }, - "peerDependencies": { - "eslint": ">=7" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/eslint-plugin-perfectionist": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.10.1.tgz", - "integrity": "sha512-Kprsp9Us0GqAesYaAIzUViw57xYp5WBqzXrcE0Mtww++E5fexWXYBipMuuD7yvyH4vvpBH0+oJ+OMAmZ0oYXkw==", - "license": "MIT", + "node_modules/@stoplight/better-ajv-errors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", + "integrity": "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/utils": "^8.65.0", - "natural-orderby": "^5.0.0" + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": "^20.0.0 || >=22.0.0" + "node": "^12.20 || >= 14.13" }, "peerDependencies": { - "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" + "ajv": ">=8" } }, - "node_modules/eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "license": "MIT", - "peerDependencies": { - "eslint": ">=2.0.0" + "node_modules/@stoplight/json": { + "version": "3.21.7", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.7.tgz", + "integrity": "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.5.2.tgz", - "integrity": "sha512-BlvqjWZdBJDIPO/YU3zcPCF23CvjYT3gyu63yo6b609NNV3D1b6zceAREy2xnweuBoDpZcLNuPyAUq9cvx6bbQ==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/json-ref-readers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz", + "integrity": "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==", + "license": "Apache-2.0", "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "@microsoft/tsdoc-config": "0.18.1", - "@typescript-eslint/utils": "~8.56.0" + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/json-ref-readers/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@stoplight/json-ref-resolver": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz", + "integrity": "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", - "debug": "^4.4.3" + "@stoplight/json": "^3.21.0", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", + "dependency-graph": "~0.11.0", + "fast-memoize": "^2.5.2", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "urijs": "^1.19.11" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": ">=8.3.0" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/json/node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^12.20 || >=14.13" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/json/node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "license": "MIT" + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz", + "integrity": "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": ">=8" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", - "dev": true, - "license": "MIT", + "node_modules/@stoplight/spectral-core": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.23.1.tgz", + "integrity": "sha512-VLC8OhpO/pMJKb6IHhurxJjXO1qB56Ng1unIb8b+hNxdw0+SEcASvmR+RpjfHYX/jv/DfSaA1x8QhFBJBmqBOQ==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "@scarf/scarf": "^1.4.0", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-parsers": "^1.0.0", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", + "ajv": "^8.18.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "es-aggregate-error": "^1.0.7", + "expr-eval-fork": "^3.0.1", + "jsonpath-plus": "^10.3.0", + "lodash": "^4.18.1", + "lodash.topath": "^4.5.2", + "minimatch": "^3.1.4", + "nimma": "0.2.3", + "pony-cause": "^1.1.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.6.0.tgz", + "integrity": "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", - "dev": true, + "node_modules/@stoplight/spectral-core/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "ajv": "^8.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", - "dev": true, + "node_modules/@stoplight/spectral-core/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@stoplight/spectral-core/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "eslint-visitor-keys": "^5.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "*" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.5.tgz", + "integrity": "sha512-xaC0rCH0p7/bzNJsz+JgLSj+Cp6uwYGWpePQxdLkF2G6a8Zyp3OyS7umkGYNiimEwKrOjvCNNTFJpeuiENZSBA==", "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "dependencies": { + "@scarf/scarf": "^1.4.0", + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.23.0", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/eslint-plugin-tsdoc/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.5.tgz", + "integrity": "sha512-vDCd0NJ93715bcUpZZ5vNHiyxd4cgHF6tuXsDiXOXKAByg+I1fR5/dMijEo6Ce1Lz95a+RZ22JKYhF1YuzVvuA==", "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "@scarf/scarf": "^1.4.0", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", + "@stoplight/spectral-core": "^1.23.0", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-runtime": "^1.1.2", + "ajv": "^8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "lodash": "^4.18.1", + "tslib": "^2.8.1" }, "engines": { - "node": ">=14.17" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "license": "BSD-2-Clause", + "node_modules/@stoplight/spectral-functions/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "ajv": "^8.0.0" }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@stoplight/spectral-parsers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz", + "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==", "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "license": "MIT", + "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^12.20 || >=14.13" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/@stoplight/spectral-ref-resolver": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz", + "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==", "license": "Apache-2.0", + "dependencies": { + "@stoplight/json-ref-readers": "1.2.2", + "@stoplight/json-ref-resolver": "~3.1.6", + "@stoplight/spectral-runtime": "^1.1.2", + "dependency-graph": "0.11.0", + "tslib": "^2.8.1" + }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-ruleset-bundler": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.7.0.tgz", + "integrity": "sha512-PpIdj5Wje0T7ktxY8EUzBWLU0+mGGQHznT8nlQxTMnRhWLNYsm6HvSZDXLtMi+86yqvTuf7loJy6JvLBDzHGAA==", + "license": "Apache-2.0", + "dependencies": { + "@rollup/plugin-commonjs": "~22.0.2", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-core": ">=1", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-functions": ">=1", + "@stoplight/spectral-parsers": ">=1", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-ruleset-migrator": "^1.9.6", + "@stoplight/spectral-rulesets": ">=1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@types/node": "*", + "pony-cause": "1.1.1", + "rollup": "~2.80.0", + "tslib": "^2.8.1", + "validate-npm-package-name": "3.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", + "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">= 4" + "node": "^12.20 || >=14.13" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "license": "MIT" }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "license": "BSD-2-Clause", + "node_modules/@stoplight/spectral-ruleset-bundler/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "license": "ISC", "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" + "builtins": "^1.0.3" + } + }, + "node_modules/@stoplight/spectral-ruleset-migrator": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.12.2.tgz", + "integrity": "sha512-9hTcyXnBGppM1kMA8vVvY6aWzF3vXbU7+mZvvd9wdPE8QdHj9NO//1s+A/TfiWOKdH9GOERC5NITCnVvbEYEWg==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/ordered-object-literal": "~1.0.4", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-functions": "^1.9.1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@stoplight/yaml": "~4.2.3", + "@types/node": "*", + "ajv": "^8.18.0", + "ast-types": "0.14.2", + "astring": "^1.9.0", + "reserved": "0.1.2", + "tslib": "^2.8.1", + "validate-npm-package-name": "3.0.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^12.20 || >=14.13" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/yaml": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", + "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.1", + "@stoplight/types": "^13.0.0", + "@stoplight/yaml-ast-parser": "0.0.48", + "tslib": "^2.2.0" + }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=10.8" + } + }, + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz", + "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==", + "license": "Apache-2.0" + }, + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "license": "MIT" + }, + "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "license": "ISC", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/@stoplight/spectral-rulesets": { + "version": "1.22.7", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.7.tgz", + "integrity": "sha512-cT1B6Ly21923lvr235lu7iIgmcnoCTJaN3ANOyTqr4D5GA/4p2k0+yhjhdfj/1ks/Os3kUzSFnFkzpWH7WszFA==", + "license": "Apache-2.0", + "dependencies": { + "@asyncapi/specs": "6.11.1", + "@scarf/scarf": "^1.4.0", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.23.0", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-functions": "^1.9.1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@types/json-schema": "^7.0.7", + "ajv": "^8.18.0", + "ajv-formats": "~2.1.1", + "json-schema-traverse": "^1.0.0", + "leven": "3.1.0", + "lodash": "^4.18.1", + "tslib": "^2.8.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "license": "BSD-3-Clause", + "node_modules/@stoplight/spectral-rulesets/node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "license": "Apache-2.0", "dependencies": { - "estraverse": "^5.1.0" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=0.10" + "node": "^12.20 || >=14.13" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", + "node_modules/@stoplight/spectral-rulesets/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.6.tgz", + "integrity": "sha512-Y8rEDyMN4bSMJCrDs2shdcVHYyCnH3FvXRP4dBhha4Z8iJv+JPp7KqOV/hwVB/hWFC209upiwj2oDmLfR0qCDg==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "lodash": "^4.18.1", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" }, "engines": { - "node": ">=4.0" + "node": "^16.20 || ^18.18 || >= 20.17" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", + "node_modules/@stoplight/spectral-runtime/node_modules/@stoplight/types": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.20.0.tgz", + "integrity": "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">=4.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", + "node_modules/@stoplight/types": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.5.0.tgz", + "integrity": "sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "peer": true, + "node_modules/@stoplight/yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.3.0.tgz", + "integrity": "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.5", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml-ast-parser": "0.0.50", + "tslib": "^2.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10.8" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT", - "peer": true + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz", + "integrity": "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==", + "license": "Apache-2.0" }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "peer": true, + "node_modules/@stoplight/yaml/node_modules/@stoplight/types": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-14.1.1.tgz", + "integrity": "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==", + "license": "Apache-2.0", "dependencies": { - "eventsource-parser": "^3.0.1" + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0.0" + "node": "^12.20 || >=14.13" } }, - "node_modules/eventsource-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=18.0.0" + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "@babel/types": "^7.0.0" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "@babel/types": "^7.28.2" } }, - "node_modules/express-rate-limit": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", - "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "node_modules/@types/es-aggregate-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", + "integrity": "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==", "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.4.3", - "ip-address": "^10.2.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" + "@types/node": "*" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@types/node": "*" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, "license": "MIT" }, - "node_modules/fast-string-truncated-width": { + "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", - "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } }, - "node_modules/fast-string-width": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", - "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "fast-string-truncated-width": "^3.0.2" + "@types/istanbul-lib-report": "*" } }, - "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, - "node_modules/fast-wrap-ansi": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", - "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", - "peer": true, "dependencies": { - "fast-string-width": "^3.0.2" + "undici-types": "~7.18.0" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/@types/urijs": { + "version": "1.19.26", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.26.tgz", + "integrity": "sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz", + "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==", "license": "MIT", "dependencies": { - "is-unicode-supported": "^2.0.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/type-utils": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=16.0.0" + "peerDependencies": { + "@typescript-eslint/parser": "^8.66.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@typescript-eslint/parser": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", + "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "debug": "^4.4.3" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", + "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "@typescript-eslint/tsconfig-utils": "^8.66.0", + "@typescript-eslint/types": "^8.66.0", + "debug": "^4.4.3" }, "engines": { - "node": ">= 18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@typescript-eslint/rule-tester": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.66.0.tgz", + "integrity": "sha512-un0c+WFK1Bu9EqgJxu+IsKfOZEhzjnMlRub35L9UKVGEc6nAAbKoDTPAVaf5EvGSOPuECBxErv2Zu9s8pkbs9Q==", + "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@typescript-eslint/parser": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.7.3" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "node_modules/@typescript-eslint/rule-tester/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/find-versions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", - "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", + "node_modules/@typescript-eslint/rule-tester/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", + "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", "license": "MIT", "dependencies": { - "semver-regex": "^4.0.5", - "super-regex": "^1.0.0" + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", + "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, "engines": { - "node": ">=16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "license": "ISC" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz", + "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==", "license": "MIT", - "peer": true, + "dependencies": { + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, "engines": { - "node": ">= 0.6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/@typescript-eslint/types": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", + "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fs-extra": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", - "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", + "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@typescript-eslint/project-service": "8.66.0", + "@typescript-eslint/tsconfig-utils": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=14.14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/@typescript-eslint/utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz", + "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/function-timeout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", - "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", - "dev": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", + "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.66.0", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "license": "MIT", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "license": "ISC" }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "peer": true, "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", - "engines": { - "node": ">=10" + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/git-log-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", - "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", - "dev": true, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "0.6.8" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "node_modules/agent-base": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 20" } }, - "node_modules/global-directory": { + "node_modules/aggregate-error": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", - "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, "license": "MIT", "dependencies": { - "ini": "6.0.0" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { - "global-prefix": "^3.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/global-prefix": { + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", + "node_modules/angular-eslint": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-22.1.0.tgz", + "integrity": "sha512-LU5a6MOSeQTETnc4xaHi10p9S1cstNczr93sChi3rx8IzgH4+risIsjjQHVLSnQDrSGH2O8jAGCaChker7f7TQ==", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@angular-devkit/core": ">= 22.0.0 < 23.0.0", + "@angular-devkit/schematics": ">= 22.0.0 < 23.0.0", + "@angular-eslint/builder": "22.1.0", + "@angular-eslint/eslint-plugin": "22.1.0", + "@angular-eslint/eslint-plugin-template": "22.1.0", + "@angular-eslint/schematics": "22.1.0", + "@angular-eslint/template-parser": "22.1.0", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" }, - "bin": { - "which": "bin/which" + "peerDependencies": { + "@angular/cli": ">= 22.0.0 < 23.0.0", + "eslint": "^9.0.0 || ^10.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" } }, - "node_modules/globby": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", - "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" + "environment": "^1.0.0" }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "license": "MIT" + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/handlebars": { - "version": "4.7.9", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", - "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/argue-cli": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/argue-cli/-/argue-cli-3.1.0.tgz", + "integrity": "sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://ko-fi.com/dangreen" } }, - "node_modules/hashery": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", - "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", - "license": "MIT", - "dependencies": { - "hookified": "^1.15.0" - }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", "engines": { - "node": ">=20" + "node": ">= 0.4" } }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/hono": { - "version": "4.12.33", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.33.tgz", - "integrity": "sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "license": "MIT", - "peer": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=16.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hook-std": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", - "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", - "dev": true, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hookified": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", - "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-10.1.1.tgz", - "integrity": "sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==", - "license": "ISC", - "peer": true, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", "dependencies": { - "lru-cache": "^11.1.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-tags": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", - "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=20.10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "license": "MIT", - "peer": true, "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy-agent": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", - "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", - "dev": true, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "license": "MIT", "dependencies": { - "agent-base": "9.0.0", - "debug": "^4.3.4", - "proxy-agent-negotiate": "1.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 20" + "node": ">= 0.4" } }, - "node_modules/https-proxy-agent": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", - "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", - "dev": true, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "license": "MIT", "dependencies": { - "agent-base": "9.0.0", - "debug": "^4.3.4", - "proxy-agent-negotiate": "1.1.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">= 20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">=18.18.0" + "node": ">=4" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", "bin": { - "husky": "bin.js" - }, + "astring": "bin/astring" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" + "node": ">= 0.4" } }, - "node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", - "peer": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", "engines": { - "node": ">= 4" + "node": ">= 0.4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/import-from-esm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", - "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "import-meta-resolve": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18.20" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "license": "MIT", + "node": ">=10" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=8" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/ip-address": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", - "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, "engines": { - "node": ">= 12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.10" + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "18 || 20 || >=22" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "get-east-asian-width": "^1.3.1" + "node_modules/baseline-browser-mapping": { + "version": "2.11.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz", + "integrity": "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.0.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", + "peer": true, "dependencies": { - "is-extglob": "^2.1.1" + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/is-interactive": { + "node_modules/body-parser/node_modules/content-type": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, "engines": { - "node": ">=0.12.0" + "node": "20 || >=22" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=12" + "node": ">= 0.8" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", "license": "MIT", "peer": true }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { "node": ">=18" }, @@ -6200,847 +6401,7757 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } }, - "node_modules/issue-parser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", - "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-highlight/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-9.2.1.tgz", + "integrity": "sha512-oWSL6ZhnXbYraOFTK3PgRAQJ8fADDAEv5K6AdeyQPLvjFmhG8+ejL0jZZp/R7vTmGJaBvZEE+sE7dB4bCv7sAw==", + "license": "ISC", + "dependencies": { + "@conventional-changelog/template": "^1.2.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-10.2.1.tgz", + "integrity": "sha512-n4Kr1HFMTf3iMbES0TMxKIcYtUUv4rKqyQQp2JwfOEfFCOfGT3Tq4mCyJ8S9/YPyWhydjfKrrvnyl+gCjA+mJQ==", + "license": "ISC", + "dependencies": { + "@conventional-changelog/template": "^1.2.1" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", + "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", + "conventional-commits-filter": "^5.0.0", + "handlebars": "^4.7.7", + "meow": "^13.0.0", + "semver": "^7.5.2" + }, + "bin": { + "conventional-changelog-writer": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer/node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/conventional-changelog-writer/node_modules/conventional-commits-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", + "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-commits-parser": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-7.1.2.tgz", + "integrity": "sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==", + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^2.0.0", + "argue-cli": "^3.1.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/copy-file": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/copy-file/-/copy-file-11.1.0.tgz", + "integrity": "sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.11", + "p-event": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "peer": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, + "node_modules/cpy": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-13.2.2.tgz", + "integrity": "sha512-FEc7gmNSj4mDQCWNt3mByVn3qZX3EjMvggiqgCQPF1yJAFfyX6Ai/emN89w18TRp+QcFmdTLgX3hfNnIVgYHcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-file": "^11.1.0", + "globby": "^16.1.0", + "junk": "^4.0.1", + "micromatch": "^4.0.8", + "p-filter": "^4.1.0", + "p-map": "^7.0.4" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cpy-cli": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-7.0.0.tgz", + "integrity": "sha512-uGCdhIxGfZcPXidCuT8w1jBknVXFx0un7NLjzqBZcdnkIWtLUnWMPk5TC37ceoVjwASLSNsRtTXXNTuFIyE2ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "cpy": "^13.2.0", + "globby": "^16.1.0", + "meow": "^14.0.0" + }, + "bin": { + "cpy": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-functions-list": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.406", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.406.tgz", + "integrity": "sha512-hWH5ORBi3d0IipnMh7BN5GDTaAmrSSSWmznwt2zltdiRNEWoEQyTwF0FFSBxzHO7hLSRT6loQu3IQGV0wg/Tvg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-ci": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", + "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-aggregate-error": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz", + "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types" + ] + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT", + "peer": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.1.tgz", + "integrity": "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-headers": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-headers/-/eslint-plugin-headers-1.3.4.tgz", + "integrity": "sha512-sfgmrq+geMaB7yilx1wbbzSHTmLRPm+hX6kxJhb6LQQwmF00CqZ8d3ks2ZADlDdREhP31THPHgRhcQuDogVZ4w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.0.0 || >= 18.0.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-perfectionist": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.10.1.tgz", + "integrity": "sha512-Kprsp9Us0GqAesYaAIzUViw57xYp5WBqzXrcE0Mtww++E5fexWXYBipMuuD7yvyH4vvpBH0+oJ+OMAmZ0oYXkw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.65.0", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "license": "MIT", + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.5.2.tgz", + "integrity": "sha512-BlvqjWZdBJDIPO/YU3zcPCF23CvjYT3gyu63yo6b609NNV3D1b6zceAREy2xnweuBoDpZcLNuPyAUq9cvx6bbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "@microsoft/tsdoc-config": "0.18.1", + "@typescript-eslint/utils": "~8.56.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT", + "peer": true + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "peer": true, + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expr-eval-fork": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/expr-eval-fork/-/expr-eval-fork-3.0.3.tgz", + "integrity": "sha512-BhC+hbc5lIVjygr840n5DEkW3MQq7H9o+mc1/N7Z5uIiCFVyESLL5DIE7LNq4CYUNxy+XjA+3jRrL/h0Kt2xcg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT", + "peer": true + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", + "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^4.0.5", + "super-regex": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-timeout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", + "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "0.6.8" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", + "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hono": { + "version": "4.12.33", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.33.tgz", + "integrity": "sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hook-std": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", + "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-10.1.1.tgz", + "integrity": "sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", + "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", + "license": "MIT", + "engines": { + "node": ">=20.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", + "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/https-proxy-agent": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", + "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", + "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=18.20" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT", + "peer": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/issue-parser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", + "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-config/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jose": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.6.tgz", + "integrity": "sha512-HwMtbJjMw8rC8dUTwCNilHJD+fxTeKM3JV1eprSmTjS41qwXSSt6exJXgyPK1QOu0jB9eDYLESRDkB3qaT3jnw==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.3.0.tgz", + "integrity": "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "1.2.5", + "static-eval": "2.1.1", + "underscore": "1.13.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", + "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==", + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jsonpath/node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/junk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", + "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/listr2": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", + "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==", + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "peer": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.0.0.tgz", + "integrity": "sha512-CGvjzMN08iv6w1mm4/x3Gh1hLb4VnyRUA15FFpl6CsCIGGoe36k7kY5KNz9QDbSBN5I/fWHM6ZlIkUTa5xdUEA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-asynchronous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", + "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "^1.5.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marked-terminal": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <16" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", + "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/meow": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", + "peer": true, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/nimma": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", + "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==", + "license": "Apache-2.0", + "dependencies": { + "@jsep-plugin/regex": "^1.0.1", + "@jsep-plugin/ternary": "^1.0.2", + "astring": "^1.8.1", + "jsep": "^1.2.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + }, + "optionalDependencies": { + "jsonpath-plus": "^6.0.1 || ^10.1.0", + "lodash.topath": "^4.5.2" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-package-data": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^9.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz", + "integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.19.0.tgz", + "integrity": "sha512-SDd/hHg3KqHE5Ht2NHWxNYNtqCQ2pXAPLl6OtQhPyED5PHsRfrOtO199MZTIG2cQoQ1ZRI9t28shrD+2cr3AAw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which" + ], + "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/config": "^10.12.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.5", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.4", + "@sigstore/tuf": "^4.0.2", + "abbrev": "^4.0.0", + "archy": "~1.0.0", + "cacache": "^20.0.4", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^13.0.6", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^9.0.3", + "ini": "^6.0.0", + "init-package-json": "^8.2.5", + "is-cidr": "^6.0.4", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.1.12", + "libnpmexec": "^10.3.2", + "libnpmfund": "^7.0.26", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.1.12", + "libnpmpublish": "^11.2.0", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.2", + "libnpmversion": "^8.0.4", + "make-fetch-happen": "^15.0.6", + "minimatch": "^10.2.5", + "minipass": "^7.1.3", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^12.4.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.2", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.5.1", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", + "qrcode-terminal": "^0.12.0", + "read": "^5.0.1", + "semver": "^7.8.5", + "spdx-expression-parse": "^4.0.0", + "ssri": "^13.0.1", + "supports-color": "^10.2.2", + "tar": "^7.5.19", + "text-table": "~0.2.0", + "tiny-relative-date": "^2.0.2", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^7.0.2", + "which": "^6.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-14.0.0.tgz", + "integrity": "sha512-69XQh3k+dtGa1p+7RaR57IuG3rCko96xr/nUfN4yDYBXbTYICiWcOpsFKLN2GtGE9cyIljE+f1exnaYt9MvM+Q==", + "license": "ISC", + "peer": true, "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "hosted-git-info": "^10.1.0", + "proc-log": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^8.0.0" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jose": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.6.tgz", - "integrity": "sha512-HwMtbJjMw8rC8dUTwCNilHJD+fxTeKM3JV1eprSmTjS41qwXSSt6exJXgyPK1QOu0jB9eDYLESRDkB3qaT3jnw==", - "license": "MIT", - "peer": true, + "node": ">=18" + }, "funding": { - "url": "https://github.com/sponsors/panva" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-tokens": { + "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT" - }, - "node_modules/json-with-bigint": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", - "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" + "engines": { + "node": ">=12" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/junk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", - "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.3", + "dev": true, + "inBundle": true, "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0" } }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "license": "MIT" + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "license": "MIT", + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": ">= 0.8.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/listr2": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", - "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "9.9.1", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "cli-truncate": "^5.2.0", - "eventemitter3": "^5.0.4", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^10.0.0" + "@gar/promise-retry": "^1.0.0", + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", + "common-ancestor-path": "^2.0.0", + "hosted-git-info": "^9.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "semver": "^7.3.7", + "ssri": "^13.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" + }, + "bin": { + "arborist": "bin/index.js" }, "engines": { - "node": ">=22.13.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/npm/node_modules/@npmcli/config": { + "version": "10.12.0", "dev": true, - "license": "MIT", + "inBundle": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "walk-up-path": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "5.0.0", "dev": true, - "license": "MIT", + "inBundle": true, + "license": "ISC", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "semver": "^7.3.5" }, "engines": { - "node": ">=4" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", + "node_modules/npm/node_modules/@npmcli/git": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "p-locate": "^5.0.0" + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "license": "MIT" - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "license": "MIT", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "bin": { + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "license": "BlueOak-1.0.0", + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { - "node": "20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/magic-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.0.0.tgz", - "integrity": "sha512-CGvjzMN08iv6w1mm4/x3Gh1hLb4VnyRUA15FFpl6CsCIGGoe36k7kY5KNz9QDbSBN5I/fWHM6ZlIkUTa5xdUEA==", - "license": "MIT", + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "7.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/make-asynchronous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", - "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", "dev": true, - "license": "MIT", + "inBundle": true, + "license": "ISC", "dependencies": { - "p-event": "^6.0.0", - "type-fest": "^4.6.0", - "web-worker": "^1.5.0" + "which": "^6.0.0" }, "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/make-asynchronous/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", "dev": true, - "license": "(MIT OR CC0-1.0)", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.4", "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" }, "engines": { - "node": ">= 18" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/marked-terminal": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", - "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", "dev": true, - "license": "MIT", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "ansi-escapes": "^7.0.0", - "ansi-regex": "^6.1.0", - "chalk": "^5.4.1", - "cli-highlight": "^2.1.11", - "cli-table3": "^0.6.5", - "node-emoji": "^2.2.0", - "supports-hyperlinks": "^3.1.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "marked": ">=1 <16" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/mathml-tag-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", - "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.5.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", - "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/meow": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", - "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", - "license": "MIT", - "engines": { - "node": ">=20" + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/merge-stream": { + "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "inBundle": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/npm/node_modules/@tufjs/models": { + "version": "4.1.0", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" }, "engines": { - "node": ">=8.6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", + "node_modules/npm/node_modules/abbrev": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/mime": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", - "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.4", "dev": true, - "funding": [ - "https://github.com/sponsors/broofa" - ], + "inBundle": true, "license": "MIT", - "bin": { - "mime": "bin/cli.js" - }, "engines": { - "node": ">=16" + "node": ">= 14" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/npm/node_modules/aproba": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "inBundle": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.6" + "node": "18 || 20 || >=22" } }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/bin-links": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "mime-db": "^1.54.0" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/npm/node_modules/binary-extensions": { + "version": "3.1.0", "dev": true, + "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "node_modules/npm/node_modules/brace-expansion": { + "version": "5.0.7", + "dev": true, + "inBundle": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "balanced-match": "^4.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "license": "BlueOak-1.0.0", + "node_modules/npm/node_modules/cacache": { + "version": "20.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.8" + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/npm/node_modules/chalk": { + "version": "5.6.2", "dev": true, + "inBundle": true, "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "node_modules/npm/node_modules/chownr": { + "version": "3.0.0", "dev": true, + "inBundle": true, "license": "BlueOak-1.0.0", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "node_modules/npm/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/mute-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", - "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "node_modules/npm/node_modules/cidr-regex": { + "version": "5.0.5", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", + "dev": true, + "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" } }, - "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "cssesc": "bin/cssesc" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=4" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" - }, - "node_modules/natural-orderby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", - "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "node_modules/npm/node_modules/debug": { + "version": "4.4.3", + "dev": true, + "inBundle": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "peer": true, + "node_modules/npm/node_modules/diff": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.6" + "node": ">=0.3.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", "dev": true, - "license": "MIT" + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.3", "dev": true, - "license": "MIT" + "inBundle": true, + "license": "Apache-2.0" }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", "dev": true, + "inBundle": true, "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", - "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", + "node_modules/npm/node_modules/glob": { + "version": "13.0.6", "dev": true, - "license": "BSD-2-Clause", + "inBundle": true, + "license": "BlueOak-1.0.0", "dependencies": { - "hosted-git-info": "^9.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", - "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" @@ -7049,492 +14160,476 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "inBundle": true, "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/normalize-url": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz", - "integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==", + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.7.2", "dev": true, + "inBundle": true, "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=20" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/npm": { - "version": "11.19.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.19.0.tgz", - "integrity": "sha512-SDd/hHg3KqHE5Ht2NHWxNYNtqCQ2pXAPLl6OtQhPyED5PHsRfrOtO199MZTIG2cQoQ1ZRI9t28shrD+2cr3AAw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/metavuln-calculator", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which" - ], + "node_modules/npm/node_modules/ignore-walk": { + "version": "8.0.0", "dev": true, - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], + "inBundle": true, + "license": "ISC", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.9.1", - "@npmcli/config": "^10.12.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/map-workspaces": "^5.0.3", - "@npmcli/metavuln-calculator": "^9.0.3", - "@npmcli/package-json": "^7.0.5", - "@npmcli/promise-spawn": "^9.0.1", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.4", - "@sigstore/tuf": "^4.0.2", - "abbrev": "^4.0.0", - "archy": "~1.0.0", - "cacache": "^20.0.4", - "chalk": "^5.6.2", - "ci-info": "^4.4.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^13.0.6", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.3", - "ini": "^6.0.0", - "init-package-json": "^8.2.5", - "is-cidr": "^6.0.4", - "json-parse-even-better-errors": "^5.0.0", - "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.12", - "libnpmexec": "^10.3.2", - "libnpmfund": "^7.0.26", - "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.12", - "libnpmpublish": "^11.2.0", - "libnpmsearch": "^9.0.1", - "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.4", - "make-fetch-happen": "^15.0.6", - "minimatch": "^10.2.5", - "minipass": "^7.1.3", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^12.4.0", - "nopt": "^9.0.0", - "npm-audit-report": "^7.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.2", - "npm-pick-manifest": "^11.0.3", - "npm-profile": "^12.0.2", - "npm-registry-fetch": "^19.1.1", - "npm-user-validate": "^4.0.0", - "p-map": "^7.0.4", - "pacote": "^21.5.1", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.1.0", - "qrcode-terminal": "^0.12.0", - "read": "^5.0.1", - "semver": "^7.8.5", - "spdx-expression-parse": "^4.0.0", - "ssri": "^13.0.1", - "supports-color": "^10.2.2", - "tar": "^7.5.19", - "text-table": "~0.2.0", - "tiny-relative-date": "^2.0.2", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^7.0.2", - "which": "^6.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" + "minimatch": "^10.0.3" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-package-arg": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-14.0.0.tgz", - "integrity": "sha512-69XQh3k+dtGa1p+7RaR57IuG3rCko96xr/nUfN4yDYBXbTYICiWcOpsFKLN2GtGE9cyIljE+f1exnaYt9MvM+Q==", + "node_modules/npm/node_modules/ini": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "8.2.5", + "dev": true, + "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { - "hosted-git-info": "^10.1.0", - "proc-log": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^8.0.0" + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "node_modules/npm/node_modules/ip-address": { + "version": "10.2.0", "dev": true, + "inBundle": true, "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" + "cidr-regex": "^5.0.4" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20" } }, - "node_modules/npm-run-path/node_modules/path-key": { + "node_modules/npm/node_modules/isexe": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "dev": true, + "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" - }, + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-run-path/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", "dev": true, - "license": "MIT", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "10.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" + }, "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "8.1.12", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.9.1", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@gar/promise-retry": { - "version": "1.0.3", + "node_modules/npm/node_modules/libnpmexec": { + "version": "10.3.2", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "read": "^5.0.1", + "semver": "^7.3.7", + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", + "node_modules/npm/node_modules/libnpmfund": { + "version": "7.0.26", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.4" + "@npmcli/arborist": "^9.9.1" }, "engines": { - "node": ">=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", + "node_modules/npm/node_modules/libnpmorg": { + "version": "8.0.1", "dev": true, "inBundle": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.2", + "node_modules/npm/node_modules/libnpmpack": { + "version": "9.1.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" + "@npmcli/arborist": "^9.9.1", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.9.1", + "node_modules/npm/node_modules/libnpmpublish": { + "version": "11.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", - "@npmcli/query": "^5.0.0", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.0", - "bin-links": "^6.0.0", - "cacache": "^20.0.1", - "common-ancestor-path": "^2.0.0", - "hosted-git-info": "^9.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^11.2.1", - "minimatch": "^10.0.3", - "nopt": "^9.0.0", - "npm-install-checks": "^8.0.0", + "ci-info": "^4.0.0", "npm-package-arg": "^13.0.0", - "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", - "pacote": "^21.0.2", - "parse-conflict-json": "^5.0.1", "proc-log": "^6.0.0", - "proggy": "^4.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", "semver": "^7.3.7", - "ssri": "^13.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^4.0.0" + "sigstore": "^4.0.0", + "ssri": "^13.0.0" }, - "bin": { - "arborist": "bin/index.js" + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.12.0", + "node_modules/npm/node_modules/libnpmteam": { + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "ini": "^6.0.0", - "nopt": "^9.0.0", + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "8.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", - "semver": "^7.3.5", - "walk-up-path": "^4.0.0" + "semver": "^7.3.7" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "5.0.0", + "node_modules/npm/node_modules/lru-cache": { + "version": "11.5.1", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "20 || >=22" } }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.2", + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "15.0.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", "proc-log": "^6.0.0", - "semver": "^7.3.5", - "which": "^6.0.0" + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "4.0.0", + "node_modules/npm/node_modules/minimatch": { + "version": "10.2.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" + "brace-expansion": "^5.0.5" }, - "bin": { - "installed-package-contents": "bin/index.js" + "engines": { + "node": "18 || 20 || >=22" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.1.3", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "5.0.3", + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "glob": "^13.0.0", - "minimatch": "^10.0.3" + "minipass": "^7.0.3" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.3", + "node_modules/npm/node_modules/minipass-fetch": { + "version": "5.0.2", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cacache": "^20.0.0", - "json-parse-even-better-errors": "^5.0.0", - "pacote": "^21.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5" + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "4.0.0", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^7.1.3" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "5.0.0", + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.5", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "spdx-expression-parse": "^4.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "which": "^6.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "5.0.0", + "node_modules/npm/node_modules/minizlib": { + "version": "3.1.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 18" } }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "4.0.0", + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -7542,265 +14637,277 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "10.0.4", + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "4.0.0", + "node_modules/npm/node_modules/node-gyp": { + "version": "12.4.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.2.1", + "node_modules/npm/node_modules/nopt": { + "version": "9.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.1", + "node_modules/npm/node_modules/npm-audit-report": { + "version": "7.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.1.1", + "node_modules/npm/node_modules/npm-bundled": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "@gar/promise-retry": "^1.0.2", - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.4", - "proc-log": "^6.1.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.2", + "node_modules/npm/node_modules/npm-install-checks": { + "version": "8.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.1.0" + "semver": "^7.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.1.1", + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0" - }, + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", + "node_modules/npm/node_modules/npm-package-arg": { + "version": "13.0.2", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "4.1.0", + "node_modules/npm/node_modules/npm-packlist": { + "version": "10.0.4", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^10.1.1" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/abbrev": { - "version": "4.0.0", + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "11.0.3", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.4", + "node_modules/npm/node_modules/npm-profile": { + "version": "12.0.2", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.1.0" + }, "engines": { - "node": ">= 14" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/aproba": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "4.0.4", + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "19.1.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, "engines": { - "node": "18 || 20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/bin-links": { - "version": "6.0.2", + "node_modules/npm/node_modules/npm-user-validate": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "proc-log": "^6.0.0", - "read-cmd-shim": "^6.0.0", - "write-file-atomic": "^7.0.0" - }, + "license": "BSD-2-Clause", "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "3.1.0", + "node_modules/npm/node_modules/p-map": { + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=18.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.7", + "node_modules/npm/node_modules/pacote": { + "version": "21.5.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^4.0.2" + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" }, "engines": { - "node": "18 || 20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cacache": { - "version": "20.0.4", + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0" + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/chalk": { - "version": "5.6.2", + "node_modules/npm/node_modules/path-scurry": { + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.4.0", + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "7.1.4", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "inBundle": true, "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.5", + "node_modules/npm/node_modules/proc-log": { + "version": "6.1.0", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", "engines": { - "node": ">=20" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "8.0.0", + "node_modules/npm/node_modules/proggy": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -7808,836 +14915,851 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "2.0.0", + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/debug": { - "version": "4.4.3", + "node_modules/npm/node_modules/promzard": { + "version": "3.0.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ms": "^2.1.3" + "read": "^5.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/diff": { - "version": "8.0.4", + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", "dev": true, "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", + "node_modules/npm/node_modules/read": { + "version": "5.0.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "mute-stream": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.3", + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "6.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", "dev": true, "inBundle": true, "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } + "optional": true }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", + "node_modules/npm/node_modules/semver": { + "version": "7.8.5", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/glob": { - "version": "13.0.6", + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, + "license": "ISC", "engines": { - "node": "18 || 20 || >=22" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.3", + "node_modules/npm/node_modules/sigstore": { + "version": "4.1.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "lru-cache": "^11.1.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/http-cache-semantics": { + "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", "dev": true, "inBundle": true, - "license": "BSD-2-Clause" + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", + "node_modules/npm/node_modules/socks": { + "version": "2.8.9", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 14" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.6", + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", - "debug": "4" + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.7.2", + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", "dev": true, "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } + "license": "CC-BY-3.0" }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "8.0.0", + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/npm/node_modules/ini": { - "version": "6.0.0", + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.23", "dev": true, "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "license": "CC0-1.0" }, - "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.5", + "node_modules/npm/node_modules/ssri": { + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/package-json": "^7.0.0", - "npm-package-arg": "^13.0.0", - "promzard": "^3.0.1", - "read": "^5.0.1", - "semver": "^7.7.2", - "validate-npm-package-name": "^7.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/ip-address": { - "version": "10.2.0", + "node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.4", + "node_modules/npm/node_modules/tar": { + "version": "7.5.19", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", + "license": "BlueOak-1.0.0", "dependencies": { - "cidr-regex": "^5.0.4" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/npm/node_modules/isexe": { - "version": "4.0.0", + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" - } + "license": "MIT" }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "5.0.0", + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "license": "MIT" }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", + "node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.17", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", + "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "10.0.3", + "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.12", + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1", - "@npmcli/installed-package-contents": "^4.0.0", - "binary-extensions": "^3.0.0", - "diff": "^8.0.2", - "minimatch": "^10.0.3", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "tar": "^7.5.1" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "10.3.2", + "node_modules/npm/node_modules/tuf-js": { + "version": "4.1.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.9.1", - "@npmcli/package-json": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "proc-log": "^6.0.0", - "read": "^5.0.1", - "semver": "^7.3.7", - "signal-exit": "^4.1.0", - "walk-up-path": "^4.0.0" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.26", + "node_modules/npm/node_modules/undici": { + "version": "6.27.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18.17" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "8.0.1", + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.12", + "node_modules/npm/node_modules/walk-up-path": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1", - "@npmcli/run-script": "^10.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "20 || >=22" } }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.2.0", + "node_modules/npm/node_modules/which": { + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7", - "sigstore": "^4.0.0", - "ssri": "^13.0.0" + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "9.0.1", + "node_modules/npm/node_modules/write-file-atomic": { + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^19.0.0" + "signal-exit": "^4.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "8.0.2", + "node_modules/npm/node_modules/yallist": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", "dependencies": { - "@npmcli/git": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "11.5.1", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "@npmcli/redact": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "10.2.5", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.3", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "dev": true, - "inBundle": true, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.2", - "dev": true, - "inBundle": true, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz", + "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.2", + "string-width": "^8.1.0" }, - "optionalDependencies": { - "iconv-lite": "^0.7.2" + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "license": "MIT", "dependencies": { - "minipass": "^7.1.3" + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "2.0.0", + "node_modules/p-filter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^7.1.2" + "p-map": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/minizlib": { + "node_modules/p-limit": { "version": "3.1.0", - "dev": true, - "inBundle": true, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { - "minipass": "^7.1.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/negotiator": { - "version": "1.0.0", + "node_modules/p-map": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/node-gyp": { - "version": "12.4.0", + "node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.4", - "tinyglobby": "^0.2.12", - "undici": "^6.25.0", - "which": "^6.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/nopt": { - "version": "9.0.0", + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^4.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "7.0.0", + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "5.0.0", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { - "npm-normalize-package-bin": "^5.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "13.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "peer": true, "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" + "entities": "^8.0.0" }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.1.tgz", + "integrity": "sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==", + "license": "MIT", + "peer": true, "dependencies": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.0.0" + "entities": "^8.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "11.0.3", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "parse5": "^6.0.1" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "12.0.2", + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "license": "MIT", + "peer": true, "dependencies": { - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.1.0" + "parse5": "^8.0.0" }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "19.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" - }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "peer": true, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/npm-user-validate": { + "node_modules/path-exists": { "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/p-map": { - "version": "7.0.4", - "dev": true, - "inBundle": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/pacote": { - "version": "21.5.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - }, - "bin": { - "pacote": "bin/index.js" - }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^5.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, - "node_modules/npm/node_modules/path-scurry": { + "node_modules/path-scurry": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, - "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -8650,659 +15772,716 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.4", + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/npm/node_modules/proc-log": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm/node_modules/proggy": { - "version": "4.0.0", + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.20.0" } }, - "node_modules/npm/node_modules/promzard": { - "version": "3.0.1", + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "read": "^5.0.0" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/npm/node_modules/read": { - "version": "5.0.1", + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "mute-stream": "^3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "6.0.0", + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, - "inBundle": true, "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "p-limit": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/npm/node_modules/sigstore": { - "version": "4.1.1", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "inBundle": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.1", - "@sigstore/tuf": "^4.0.2", - "@sigstore/verify": "^3.1.1" + "find-up": "^4.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.9", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.5", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.23", + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "inBundle": true, - "license": "CC0-1.0" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/npm/node_modules/ssri": { - "version": "13.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, + "node_modules/pony-cause": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-1.1.1.tgz", + "integrity": "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==", + "license": "0BSD", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=12.0.0" } }, - "node_modules/npm/node_modules/supports-color": { - "version": "10.2.2", - "dev": true, - "inBundle": true, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/tar": { - "version": "7.5.19", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/postcss": { + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=18" + "node": "^10 || ^12 || >=14" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "license": "MIT" }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "2.0.2", - "dev": true, - "inBundle": true, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "license": "MIT" }, - "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.17", - "dev": true, - "inBundle": true, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0" }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "dev": true, - "inBundle": true, + ], "license": "MIT", "engines": { - "node": ">=12" + "node": ">=12.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "postcss": "^8.4.29" } }, - "node_modules/npm/node_modules/tuf-js": { - "version": "4.1.0", - "dev": true, - "inBundle": true, + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", "dependencies": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/undici": { - "version": "6.27.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.17" + "node": ">=4" } }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/which": { - "version": "6.0.1", + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, + "license": "MIT", "bin": { - "node-which": "bin/which.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "7.0.1", + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "signal-exit": "^4.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/yallist": { - "version": "5.0.0", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ee-first": "1.1.1" + "parse-ms": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/proc-log": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-7.0.0.tgz", + "integrity": "sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==", "license": "ISC", "peer": true, - "dependencies": { - "wrappy": "1" + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "license": "MIT", "dependencies": { - "mimic-function": "^5.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/ora": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz", - "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", + "peer": true, "dependencies": { - "chalk": "^5.6.2", - "cli-cursor": "^5.0.0", - "cli-spinners": "^3.2.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.1.0", - "log-symbols": "^7.0.1", - "stdin-discarder": "^0.3.2", - "string-width": "^8.1.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 20" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/p-event": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", - "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", "license": "MIT", "dependencies": { - "p-timeout": "^6.1.2" + "hookified": "^2.1.1" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20" } }, - "node_modules/p-filter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", - "dev": true, - "license": "MIT", + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "p-map": "^7.0.1" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "peer": true, "engines": { - "node": ">=10" + "node": ">= 0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", + "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/p-map": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", - "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "rc": "cli.js" } }, - "node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" }, "engines": { - "node": ">=6" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/read-pkg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", + "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.4.4", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, "engines": { "node": ">=18" }, @@ -9310,809 +16489,994 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", - "license": "MIT", - "peer": true, - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.1.tgz", - "integrity": "sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==", - "license": "MIT", - "peer": true, - "dependencies": { - "entities": "^8.0.0", - "parse5": "^8.0.0", - "parse5-sax-parser": "^8.0.0" + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { - "parse5": "^6.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5-sax-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", - "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "license": "MIT", - "peer": true, "dependencies": { - "parse5": "^8.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14" } }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "node_modules/reserved": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved/-/reserved-0.1.2.tgz", + "integrity": "sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==", + "engines": { + "node": ">=0.8" + } }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pify": { + "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "peer": true, "engines": { - "node": ">=16.20.0" + "node": ">=8" } }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT", + "peer": true + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "p-try": "^1.0.0" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=4" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, + "node_modules/rollup": { + "version": "2.80.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, "engines": { - "node": ">=4" + "node": ">= 18" } }, - "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", - "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, - "node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=18.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">=12.0" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.4.29" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "peer": true + }, + "node_modules/semantic-release": { + "version": "25.0.9", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.9.tgz", + "integrity": "sha512-bxve7csK0/Txr++CkfrmV+X1r4jqiSOw2WsSad9E2S68R+ZfLBwDn8IceM8WfiOmKQIHgsQc1cNA8Dzg7U75pg==", + "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@semantic-release/commit-analyzer": "^13.0.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.1.1", + "@semantic-release/release-notes-generator": "^14.1.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^4.0.0", + "hosted-git-info": "^9.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^12.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "signale": "^1.2.1", + "yargs": "^18.0.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=4" + "node": "^22.14.0 || >= 24.10.0" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "node_modules/semantic-release/node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "license": "MIT", + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">=14" + "node": ">= 18" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "dev": true, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", + "peer": true, "dependencies": { - "parse-ms": "^4.0.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">=18" + "node": ">= 18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/proc-log": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-7.0.0.tgz", - "integrity": "sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==", - "license": "ISC", - "peer": true, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + "node": ">= 0.4" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC", + "peer": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/proxy-agent-negotiate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", - "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", - "dev": true, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { - "node": ">= 20" + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, - "peerDependencies": { - "kerberos": "^2.0.0" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "kerberos": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qified": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", - "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { - "hookified": "^2.1.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qified/node_modules/hookified": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", - "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" + } + }, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">=4" } }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "color-name": "1.1.3" } }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/read-package-up": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", - "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.1", - "read-pkg": "^10.0.0", - "type-fest": "^5.2.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/read-pkg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", - "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.4", - "normalize-package-data": "^8.0.0", - "parse-json": "^8.3.0", - "type-fest": "^5.4.4", - "unicorn-magic": "^0.4.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", + "peer": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/registry-auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^3.0.2" - }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=14" + "node": ">= 12" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "license": "ISC", + "dependencies": { + "through2": "~2.0.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "license": "MIT", "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "node_modules/standard": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "peer": true - }, - "node_modules/rimraf": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^13.0.3", - "package-json-from-dist": "^1.0.1" + "eslint": "^8.41.0", + "eslint-config-standard": "17.1.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.36.1", + "standard-engine": "^15.1.0", + "version-guard": "^1.1.1" }, "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "standard": "bin/cmd.cjs" }, "engines": { - "node": ">= 18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", "funding": [ { "type": "github", @@ -10129,493 +17493,632 @@ ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", + "node_modules/standard-engine/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/standard-engine/node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "license": "MIT", - "peer": true + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/semantic-release": { - "version": "25.0.9", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.9.tgz", - "integrity": "sha512-bxve7csK0/Txr++CkfrmV+X1r4jqiSOw2WsSad9E2S68R+ZfLBwDn8IceM8WfiOmKQIHgsQc1cNA8Dzg7U75pg==", - "dev": true, + "node_modules/standard-engine/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "license": "MIT", "dependencies": { - "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^12.0.0", - "@semantic-release/npm": "^13.1.1", - "@semantic-release/release-notes-generator": "^14.1.0", - "aggregate-error": "^5.0.0", - "cosmiconfig": "^9.0.0", - "debug": "^4.0.0", - "env-ci": "^11.0.0", - "execa": "^9.0.0", - "figures": "^6.0.0", - "find-versions": "^6.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^4.0.0", - "hosted-git-info": "^9.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "marked": "^15.0.0", - "marked-terminal": "^7.3.0", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-package-up": "^12.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "signale": "^1.2.1", - "yargs": "^18.0.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^22.14.0 || >= 24.10.0" + "node": ">=6" } }, - "node_modules/semantic-release/node_modules/hosted-git-info": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", - "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", - "dev": true, - "license": "ISC", + "node_modules/standard-engine/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { - "lru-cache": "^11.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/standard-engine/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true, + "node_modules/standard-engine/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "node_modules/standard-engine/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=4" } }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "node_modules/standard-engine/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "license": "MIT", - "peer": true, "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" }, "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "node_modules/standard/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/standard/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/standard/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "node_modules/standard/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "node_modules/standard/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/standard/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", - "peer": true, "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/standard/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/standard/node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", - "peer": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/standard/node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, + "node_modules/standard/node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" } }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "node_modules/standard/node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "node_modules/standard/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ms": "^2.1.1" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "node_modules/standard/node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/standard/node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", + "node_modules/standard/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "license": "MIT", + "node_modules/standard/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", "dependencies": { - "escape-string-regexp": "^1.0.5" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", + "node_modules/standard/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/standard/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, + "node_modules/standard/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "license": "MIT", "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", + "node_modules/standard/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=14.16" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/slice-ansi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", - "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "node_modules/standard/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^6.2.3", - "is-fullwidth-code-point": "^5.1.0" - }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">= 4" } }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "license": "BSD-3-Clause", + "node_modules/standard/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "node_modules/standard/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/standard/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true, - "license": "MIT" + "node_modules/standard/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/standard/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "node_modules/standard/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, + "node_modules/standard/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "through2": "~2.0.0" + "escodegen": "^2.1.0" } }, "node_modules/statuses": { @@ -10640,6 +18143,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -10661,6 +18177,43 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", @@ -10677,6 +18230,100 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -10696,7 +18343,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -10893,7 +18539,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -10923,7 +18568,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11097,6 +18741,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -11172,6 +18890,13 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11194,6 +18919,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/traverse": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", @@ -11219,6 +18950,30 @@ "typescript": ">=4.8.4" } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -11266,6 +19021,16 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", @@ -11315,6 +19080,80 @@ "url": "https://opencollective.com/express" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -11355,7 +19194,6 @@ "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, "license": "BSD-2-Clause", "optional": true, "bin": { @@ -11365,6 +19203,30 @@ "node": ">=0.8.0" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "license": "MIT" + }, "node_modules/undici": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", @@ -11446,6 +19308,37 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -11455,6 +19348,12 @@ "punycode": "^2.1.0" } }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "license": "MIT" + }, "node_modules/url-join": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", @@ -11471,6 +19370,41 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -11502,6 +19436,25 @@ "node": ">= 0.8" } }, + "node_modules/version-guard": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", + "license": "0BSD", + "engines": { + "node": ">=0.10.48" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/web-worker": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", @@ -11509,6 +19462,22 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11524,6 +19493,97 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -11537,7 +19597,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { @@ -11562,8 +19621,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "7.0.1", @@ -11577,6 +19635,22 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true, + "license": "MIT" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -11596,6 +19670,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", From 0a6df86c95542dac96a3d8f7f123d001bef88697 Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:19:51 +0200 Subject: [PATCH 03/33] style(api-linter): apply prettier formatting to project --- api-linter/README.md | 95 ++-- api-linter/example/openapi.yml | 452 ++++++++--------- api-linter/package.json | 92 ++-- .../assert-http-codes-for-operation.js | 6 +- .../functions/count-resource-types.js | 6 +- ...esources-has-pagination-strategies-meta.js | 160 ++++-- ...get-resources-has-pagination-strategies.js | 69 +-- .../functions/get-resources-has-pagination.js | 93 ++-- .../functions/get-resources-has-parameter.js | 21 +- .../rulesets/functions/get-status-code.js | 53 +- ...as-header-parameter-with-property-value.js | 38 +- .../functions/has-headers-with-property.js | 22 +- .../rulesets/functions/is-meta-object.js | 16 +- .../rulesets/functions/is-object-schema.js | 16 +- .../functions/is-problem-json-schema.js | 16 +- .../rulesets/functions/links-has-self.js | 24 +- ...-resource-name-is-lowercase-with-hyphen.js | 19 +- .../functions/query-parameters-length.js | 44 +- ...st-is-defined-document-structure-schema.js | 21 +- ...se-is-defined-document-structure-schema.js | 23 +- api-linter/rulesets/functions/schema-test.js | 22 +- .../successful-response-status-code.js | 10 +- .../rulesets/functions/validate-b3-tracing.js | 17 +- api-linter/rulesets/semantic-versioning.yml | 3 +- .../rulesets/siemens-api-common-operation.yml | 28 +- .../rulesets/siemens-api-error-reporting.yml | 142 +++--- api-linter/rulesets/siemens-api-express.yml | 2 +- api-linter/rulesets/siemens-api-filtering.yml | 9 +- .../rulesets/siemens-api-media-type.yml | 8 +- .../rulesets/siemens-api-pagination.yml | 13 +- api-linter/rulesets/siemens-api-security.js | 94 ++-- api-linter/rulesets/siemens-api-sorting.yml | 2 - .../rulesets/siemens-api-sparse-fieldsets.yml | 3 - api-linter/rulesets/siemens-api-versioning.js | 162 ++++--- api-linter/rulesets/siemens-api.yml | 2 +- api-linter/rulesets/vs-extension.yml | 2 +- api-linter/src/argument.js | 113 +++-- api-linter/src/extension.js | 58 ++- api-linter/src/index.js | 455 +++++++++--------- api-linter/src/templates/template.html | 301 ++++++------ api-linter/test/api-commonops.test.js | 84 ++-- api-linter/test/api-errors-refs.test.js | 12 +- api-linter/test/api-errors.test.js | 127 ++--- api-linter/test/api-filtering.test.js | 27 +- api-linter/test/api-linter-cli.test.js | 124 ++--- api-linter/test/api-mediatype.test.js | 85 ++-- api-linter/test/api-pagination.test.js | 101 ++-- api-linter/test/api-security.test.js | 26 +- api-linter/test/api-sparse-fieldsets.test.js | 26 +- api-linter/test/api-versioning.test.js | 43 +- api-linter/test/base.js | 50 +- .../test/testdata/commonops/.spectral.yml | 2 +- api-linter/test/testdata/commonops/800-1.yml | 18 +- api-linter/test/testdata/commonops/800-2.yml | 20 +- api-linter/test/testdata/commonops/800-4.yml | 18 +- api-linter/test/testdata/commonops/801-4.yml | 23 +- api-linter/test/testdata/commonops/801.yml | 23 +- api-linter/test/testdata/commonops/802-6.yml | 27 +- api-linter/test/testdata/commonops/803-2.yml | 27 +- api-linter/test/testdata/commonops/803-6.yml | 27 +- api-linter/test/testdata/commonops/804-1.yml | 6 +- api-linter/test/testdata/error/.spectral.yml | 2 +- api-linter/test/testdata/error/300.yml | 22 +- api-linter/test/testdata/error/301.yml | 22 +- api-linter/test/testdata/error/302.yml | 26 +- api-linter/test/testdata/error/305.1.yml | 26 +- api-linter/test/testdata/error/305.2.yml | 30 +- api-linter/test/testdata/error/305.3.yml | 30 +- api-linter/test/testdata/fields/.spectral.yml | 2 +- api-linter/test/testdata/fields/500.yml | 20 +- .../test/testdata/filtering/.spectral.yml | 2 +- api-linter/test/testdata/filtering/400.yml | 20 +- api-linter/test/testdata/filtering/401.yml | 20 +- .../test/testdata/mediatype/.spectral.yml | 2 +- api-linter/test/testdata/mediatype/100.yml | 16 +- api-linter/test/testdata/mediatype/101-1.yml | 16 +- .../test/testdata/mediatype/101-2.1.yml | 17 +- .../test/testdata/mediatype/101-2.2.yml | 21 +- .../test/testdata/mediatype/101-4-1.yml | 19 +- .../test/testdata/mediatype/101-7-2.yml | 33 +- api-linter/test/testdata/mediatype/101-8.yml | 17 +- api-linter/test/testdata/mediatype/101-9.yml | 17 +- .../test/testdata/pagination/.spectral.yml | 2 +- api-linter/test/testdata/pagination/600.1.yml | 26 +- api-linter/test/testdata/pagination/600.2.yml | 28 +- api-linter/test/testdata/pagination/600.3.yml | 26 +- .../test/testdata/pagination/601-1-1.yml | 30 +- .../test/testdata/pagination/601-2-1.yml | 30 +- .../test/testdata/pagination/601-3-1.1.yml | 30 +- .../test/testdata/pagination/601-3-1.2.yml | 30 +- api-linter/test/testdata/pagination/601.yml | 28 +- api-linter/test/testdata/refs/.spectral.yml | 2 +- api-linter/test/testdata/refs/300.yml | 20 +- .../test/testdata/refs/common_errors.yml | 2 +- .../test/testdata/security/.spectral.yml | 2 +- api-linter/test/testdata/security/invalid.yml | 20 +- api-linter/test/testdata/security/valid.yml | 20 +- .../test/testdata/versioning/.spectral.yml | 2 +- api-linter/test/testdata/versioning/200-1.yml | 2 +- api-linter/test/testdata/versioning/200-2.yml | 20 +- api-linter/test/testdata/versioning/201.yml | 20 +- .../versioning/semantic-versioning.yml | 2 +- 102 files changed, 2275 insertions(+), 2075 deletions(-) diff --git a/api-linter/README.md b/api-linter/README.md index 8243924..6ff33f5 100644 --- a/api-linter/README.md +++ b/api-linter/README.md @@ -4,6 +4,7 @@ This project implements a linter reporter for the [Stoplight Spectral](https://d The ruleset has been created based on the [Siemens Xcelerator API guidelines 2.5.0](https://developer.siemens.com/guidelines/api-guidelines/rest/index.html). ## Getting started + ### Directory structure - `example/`: contains a sample API spec file @@ -13,15 +14,15 @@ The ruleset has been created based on the [Siemens Xcelerator API guidelines 2.5 ### Installation -In order to include the rulesets and provide linting within your project, you can install the package from this project with this `@siemens/api-linter` package. +In order to include the rulesets and provide linting within your project, you can install the package from this project with this `@siemens/api-linter` package. ```json { "scripts": { - "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" + "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" }, "devDependencies": { - "@siemens/api-linter": "^0.8.4" + "@siemens/api-linter": "^0.8.4" } } ``` @@ -35,16 +36,20 @@ In order to trigger the linter on your API specifications, it provides a script "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" } ``` + Developers can change the spec file path with `-s` option, ruleset file path with `-r` option accordingly in the scripts.
Or just remove them and set them in the command line as:
Script: + ```json "scripts": { "test": "api-linter" } ``` + Command: + ```groovy npm test -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml ``` @@ -64,7 +69,7 @@ Options: -v, --apiVersioning the api versioning way (choices: "ignore", "url", "header", default: ignore) -a, --apiSecurity if enable authorization security (choices: "n/f/no/false/y/t/yes/true" default: n) --resolve enables follow external $refs (same as Spectral --resolve) (default is not enabled, i.e. external references are not resolved and ignored) - ``` +``` A linter report will be generated according to the execution as: @@ -81,7 +86,7 @@ build: script: - npm test artifacts: - name: "api-linter-report" + name: 'api-linter-report' paths: - linter-result.html when: always @@ -94,36 +99,45 @@ build: ### Selection of rulesets The package provides several rulesets according to Siemens REST API guidelines.
+ > They can be included as needed by providing a project specific `.spectral.yml` file on the projects root directory as follows: + ```yaml extends: - - "@siemens/api-linter/rulesets/siemens-api-media-type.yml" - - "@siemens/api-linter/rulesets/siemens-api-versioning.yml" - - "@siemens/api-linter/rulesets/siemens-api-error-reporting.yml" - - "@siemens/api-linter/rulesets/siemens-api-filtering.yml" - - "@siemens/api-linter/rulesets/siemens-api-sparse-fieldsets.yml" - - "@siemens/api-linter/rulesets/siemens-api-pagination.yml" - - "@siemens/api-linter/rulesets/siemens-api-sorting.yml" - - "@siemens/api-linter/rulesets/siemens-api-common-operation.yml" - - "@siemens/api-linter/rulesets/siemens-api-security.yml" + - '@siemens/api-linter/rulesets/siemens-api-media-type.yml' + - '@siemens/api-linter/rulesets/siemens-api-versioning.yml' + - '@siemens/api-linter/rulesets/siemens-api-error-reporting.yml' + - '@siemens/api-linter/rulesets/siemens-api-filtering.yml' + - '@siemens/api-linter/rulesets/siemens-api-sparse-fieldsets.yml' + - '@siemens/api-linter/rulesets/siemens-api-pagination.yml' + - '@siemens/api-linter/rulesets/siemens-api-sorting.yml' + - '@siemens/api-linter/rulesets/siemens-api-common-operation.yml' + - '@siemens/api-linter/rulesets/siemens-api-security.yml' ``` + > You MAY use as below to achieve this for guideline linting `WITHOUT` `"spectral:oas"`. + ```yaml extends: - - "@siemens/api-linter/rulesets/siemens-api-express.yml" + - '@siemens/api-linter/rulesets/siemens-api-express.yml' ``` + > `OR` just extends the `ALL-IN-ONE` ruleset which with `"spectral:oas"` enabled. + ```yaml extends: - - "@siemens/api-linter/rulesets/siemens-api.yml" + - '@siemens/api-linter/rulesets/siemens-api.yml' ``` + ### Disable any Ruleset or Rules + > You can disable any rules/rulesets as you wish by [Stoplight Spectral](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview). + ```yaml #e.g. disable spectral:oas ruleset and disable Siemens-API-[400] rules from the extended ruleset extends: - - "@siemens/api-linter/rulesets/siemens-api.yml" - - ["spectral:oas", "off"] + - '@siemens/api-linter/rulesets/siemens-api.yml' + - ['spectral:oas', 'off'] rules: Siemens-API-[400]: false @@ -131,41 +145,44 @@ rules: ``` ### Define rule dependency relations + > Sometimes, if you don't want to follow a ruleC that under a high level ruleP, which means when ruleP failed, you don't want to check ruleC. -Then we can define the rules with `"x-dependsOn"` attribute. +> Then we can define the rules with `"x-dependsOn"` attribute. + ```yaml #e.g. Siemens-API-[101.8.1] depends on Siemens-API-[101.8] extends: - - "@siemens/api-linter/rulesets/siemens-api.yml" + - '@siemens/api-linter/rulesets/siemens-api.yml' rules: - Siemens-API-[101.8.1]: + Siemens-API-[101.8.1]: x-dependsOn: - Siemens-API-[101.8] ``` ## Integration Using JavaScript + > In case you want to handle the linting results by yourself + ```javascript -const {validator} = require('@siemens/api-linter/src/extension'); -const {DiagnosticSeverity} = require('@stoplight/types'); -const path = require("path"); +const { validator } = require('@siemens/api-linter/src/extension'); +const { DiagnosticSeverity } = require('@stoplight/types'); +const path = require('path'); const validate = validator(); -const validateDoc = function(){ - const ruleSetFilePath = path.resolve(__dirname, 'reference-api-specs/.spectral.yml'); - const apiSpecFilePath = path.resolve(__dirname, 'reference-api-specs/openapi-prod.yml'); - validate(apiSpecFilePath, ruleSetFilePath).then(result => { - const diagnostics = []; - for (let msg of result.results || []){ - if (msg.severity <= DiagnosticSeverity.Information ){ - var diagnostic = { value: msg.code, severity: msg.severity, message: msg.message }; - diagnostics.push(diagnostic); - } - } - // Add your own processes to handle diagnostic array; - }); -} +const validateDoc = function () { + const ruleSetFilePath = path.resolve(__dirname, 'reference-api-specs/.spectral.yml'); + const apiSpecFilePath = path.resolve(__dirname, 'reference-api-specs/openapi-prod.yml'); + validate(apiSpecFilePath, ruleSetFilePath).then(result => { + const diagnostics = []; + for (let msg of result.results || []) { + if (msg.severity <= DiagnosticSeverity.Information) { + var diagnostic = { value: msg.code, severity: msg.severity, message: msg.message }; + diagnostics.push(diagnostic); + } + } + // Add your own processes to handle diagnostic array; + }); +}; validateDoc(); ``` - diff --git a/api-linter/example/openapi.yml b/api-linter/example/openapi.yml index f90ed5d..9ca8bc1 100644 --- a/api-linter/example/openapi.yml +++ b/api-linter/example/openapi.yml @@ -62,16 +62,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/CourseCreationRequest" + $ref: '#/components/schemas/CourseCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/CourseCreationResponse" + $ref: '#/components/schemas/CourseCreationResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' get: summary: Queries Courses description: | @@ -80,14 +80,14 @@ paths: tags: - Courses responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CoursesReadResponse" + $ref: '#/components/schemas/CoursesReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: fields in: query @@ -117,7 +117,7 @@ paths: enum: - id - name - "/courses/{id}": + '/courses/{id}': parameters: - name: id in: path @@ -134,14 +134,14 @@ paths: tags: - Courses responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CourseReadResponse" + $ref: '#/components/schemas/CourseReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: fields in: query @@ -161,16 +161,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/CourseUpdateRequest" + $ref: '#/components/schemas/CourseUpdateRequest' responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CourseUpdateResponse" + $ref: '#/components/schemas/CourseUpdateResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' delete: summary: Deletes a Course description: | @@ -179,11 +179,11 @@ paths: tags: - Courses responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" - "/courses/{id}/lessons": + $ref: '#/components/responses/DefaultErrors' + '/courses/{id}/lessons': parameters: - name: id in: path @@ -200,15 +200,15 @@ paths: tags: - Courses responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CourseRelatedLessonsResponse" + $ref: '#/components/schemas/CourseRelatedLessonsResponse' default: - $ref: "#/components/responses/DefaultErrors" - "/courses/{id}/participants": + $ref: '#/components/responses/DefaultErrors' + '/courses/{id}/participants': parameters: - name: id in: path @@ -228,12 +228,12 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/CourseParticipantsRequest" + $ref: '#/components/schemas/CourseParticipantsRequest' responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' get: summary: Returns the Person from the Course description: | @@ -242,14 +242,14 @@ paths: tags: - Courses responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CourseParticipantsResponse" + $ref: '#/components/schemas/CourseParticipantsResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: number in: query @@ -288,11 +288,11 @@ paths: tags: - Courses responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" - "/courses/{id}/teacher": + $ref: '#/components/responses/DefaultErrors' + '/courses/{id}/teacher': parameters: - name: id in: path @@ -309,14 +309,14 @@ paths: tags: - Courses responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/CourseRelatedTeacherResponse" + $ref: '#/components/schemas/CourseRelatedTeacherResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' post: summary: Adds a Teacher to the Course description: | @@ -328,12 +328,12 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/CourseRelatedTeacherRequest" + $ref: '#/components/schemas/CourseRelatedTeacherRequest' responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' /lessons: post: summary: Creates a Lesson @@ -346,17 +346,17 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/LessonCreationRequest" + $ref: '#/components/schemas/LessonCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/LessonCreationResponse" + $ref: '#/components/schemas/LessonCreationResponse' default: - $ref: "#/components/responses/DefaultErrors" - "/lessons/{id}": + $ref: '#/components/responses/DefaultErrors' + '/lessons/{id}': parameters: - name: id in: path @@ -376,16 +376,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/LessonUpdateRequest" + $ref: '#/components/schemas/LessonUpdateRequest' responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/LessonUpdateResponse" + $ref: '#/components/schemas/LessonUpdateResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' /people: post: summary: Creates a Person @@ -398,16 +398,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PersonCreationRequest" + $ref: '#/components/schemas/PersonCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/PersonCreationResponse" + $ref: '#/components/schemas/PersonCreationResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' get: summary: Queries People description: | @@ -416,14 +416,14 @@ paths: tags: - People responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/PeopleReadResponse" + $ref: '#/components/schemas/PeopleReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: fields in: query @@ -454,7 +454,7 @@ paths: - id - name - email - "/people/{id}": + '/people/{id}': parameters: - name: id in: path @@ -471,14 +471,14 @@ paths: tags: - People responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/PersonReadResponse" + $ref: '#/components/schemas/PersonReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: fields in: query @@ -498,16 +498,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PersonUpdateRequest" + $ref: '#/components/schemas/PersonUpdateRequest' responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/PersonUpdateResponse" + $ref: '#/components/schemas/PersonUpdateResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' delete: summary: Deletes a Person description: | @@ -516,11 +516,11 @@ paths: tags: - People responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" - "/people/{id}/participated-courses": + $ref: '#/components/responses/DefaultErrors' + '/people/{id}/participated-courses': parameters: - name: id in: path @@ -537,15 +537,15 @@ paths: tags: - People responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/PersonRelatedParticipatedCoursesResponse" + $ref: '#/components/schemas/PersonRelatedParticipatedCoursesResponse' default: - $ref: "#/components/responses/DefaultErrors" - "/people/{id}/taught-courses": + $ref: '#/components/responses/DefaultErrors' + '/people/{id}/taught-courses': parameters: - name: id in: path @@ -562,14 +562,14 @@ paths: tags: - People responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/PersonRelatedTaughtCoursesResponse" + $ref: '#/components/schemas/PersonRelatedTaughtCoursesResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' /rooms: post: summary: Creates a Room @@ -582,16 +582,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomCreationRequest" + $ref: '#/components/schemas/RoomCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/RoomCreationResponse" + $ref: '#/components/schemas/RoomCreationResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' get: summary: Queries Rooms description: | @@ -600,14 +600,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: fields in: query @@ -638,7 +638,7 @@ paths: - id - code - creationDate - "/rooms/{id}": + '/rooms/{id}': parameters: - name: id in: path @@ -655,14 +655,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomReadResponse" + $ref: '#/components/schemas/RoomReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' patch: summary: Updates a Room description: | @@ -674,16 +674,16 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateRequest" + $ref: '#/components/schemas/RoomUpdateRequest' responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateResponse" + $ref: '#/components/schemas/RoomUpdateResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' delete: summary: Deletes a Room description: | @@ -692,11 +692,11 @@ paths: tags: - Rooms responses: - "204": + '204': description: No content default: - $ref: "#/components/responses/DefaultErrors" - "/rooms/{id}/lessons": + $ref: '#/components/responses/DefaultErrors' + '/rooms/{id}/lessons': parameters: - name: id in: path @@ -713,14 +713,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomRelatedLessonsResponse" + $ref: '#/components/schemas/RoomRelatedLessonsResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' parameters: - name: cursor in: query @@ -758,38 +758,38 @@ components: Course: allOf: - required: - - id + - id - type: object properties: id: type: string example: 822a6549-4fd8-478a-b5ed-73bef7a066f4 - - $ref: "#/components/schemas/CourseBase" + - $ref: '#/components/schemas/CourseBase' CourseLink: allOf: - - $ref: "#/components/schemas/CourseBase" + - $ref: '#/components/schemas/CourseBase' - type: object properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' CourseCreationRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/CourseBase" + $ref: '#/components/schemas/CourseBase' CourseCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/CourseLink" + $ref: '#/components/schemas/CourseLink' CourseReadResponse: type: object required: @@ -797,7 +797,7 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/CourseBase" + - $ref: '#/components/schemas/CourseBase' - type: object properties: links: @@ -805,36 +805,36 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' participants: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + description: '#servers/url' teacher: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + description: '#servers/url' CourseRelatedLessonsResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/LessonLink" + $ref: '#/components/schemas/LessonLink' CourseRelatedTeacherRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' CourseRelatedTeacherResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' CourseParticipantsRequest: type: object required: @@ -843,7 +843,7 @@ components: data: type: array items: - $ref: "#/components/schemas/Person" + $ref: '#/components/schemas/Person' CourseParticipantsResponse: type: object required: @@ -852,43 +852,43 @@ components: data: type: array items: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses/1/participants?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses/1/participants?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses/1/participants?page=2&size=1" + example: 'https://api.siemens.com/reference/api/courses/1/participants?page=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' CourseUpdateRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/Course" + $ref: '#/components/schemas/Course' CourseUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/CourseLink" + $ref: '#/components/schemas/CourseLink' CoursesReadResponse: type: object required: @@ -898,8 +898,8 @@ components: data: type: array items: - allOf: - - $ref: "#/components/schemas/CourseBase" + allOf: + - $ref: '#/components/schemas/CourseBase' - type: object properties: links: @@ -907,38 +907,38 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' participants: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + description: '#servers/url' teacher: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' LessonBase: type: object description: Regularly scheduled occurrence of a course, associated to a room. @@ -970,24 +970,24 @@ components: Lesson: allOf: - required: - - id + - id - type: object properties: id: type: string example: d8272c80-62b1-43b3-ba84-02cbe0aab5a2 - - $ref: "#/components/schemas/LessonBase" + - $ref: '#/components/schemas/LessonBase' LessonLink: allOf: - - $ref: "#/components/schemas/LessonBase" + - $ref: '#/components/schemas/LessonBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' LessonCreationRequest: type: object @@ -995,18 +995,18 @@ components: - data properties: data: - $ref: "#/components/schemas/LessonBase" + $ref: '#/components/schemas/LessonBase' links: type: object properties: course: type: string - example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' room: type: string - example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' LessonCreationResponse: type: object required: @@ -1014,27 +1014,27 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/LessonLink" + - $ref: '#/components/schemas/LessonLink' - type: object - properties: + properties: links: type: object properties: course: type: string - example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' room: type: string - example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' LessonUpdateRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/Lesson" + $ref: '#/components/schemas/Lesson' LessonUpdateResponse: type: object required: @@ -1042,20 +1042,20 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/LessonLink" + - $ref: '#/components/schemas/LessonLink' - type: object - properties: + properties: links: type: object properties: course: type: string - example: "https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' room: type: string - example: "https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' RoomPageCursor: type: object description: Pagination links for cursor-based pagination. @@ -1124,7 +1124,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/PersonBase" + - $ref: '#/components/schemas/PersonBase' - type: object properties: links: @@ -1132,37 +1132,37 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + description: '#servers/url' participantdCourses: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' taughtCourses: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/people?number=1&size=1" + example: 'https://api.siemens.com/reference/api/people?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/people?number=1&size=1" + example: 'https://api.siemens.com/reference/api/people?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/people?number=2&size=1" + example: 'https://api.siemens.com/reference/api/people?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/people?number=2&size=1" + example: 'https://api.siemens.com/reference/api/people?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' PersonBase: type: object description: A person can participate in or teach courses. @@ -1178,38 +1178,38 @@ components: Person: allOf: - required: - - id + - id - type: object properties: id: type: string example: 54293c17-a305-4349-81d5-83001e9e4032 - - $ref: "#/components/schemas/PersonBase" + - $ref: '#/components/schemas/PersonBase' PersonLink: allOf: - - $ref: "#/components/schemas/PersonBase" + - $ref: '#/components/schemas/PersonBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' PersonCreationRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonBase" + $ref: '#/components/schemas/PersonBase' PersonCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' PersonReadResponse: type: object required: @@ -1217,7 +1217,7 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/PersonBase" + - $ref: '#/components/schemas/PersonBase' - type: object properties: links: @@ -1225,43 +1225,43 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032" + example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' participantdCourses: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' taughtCourses: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + description: '#servers/url' PersonRelatedParticipatedCoursesResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/CourseLink" + $ref: '#/components/schemas/CourseLink' PersonRelatedTaughtCoursesResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/CourseLink" + $ref: '#/components/schemas/CourseLink' PersonUpdateRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' PersonUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/PersonLink" + $ref: '#/components/schemas/PersonLink' RoomBase: type: object description: Place where course lessons take place. @@ -1282,42 +1282,42 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Room: allOf: - required: - - id + - id - type: object properties: id: type: string example: 846650de-20fd-4197-867b-00ac7606cffd - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomCreationRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomReadResponse: type: object required: @@ -1325,19 +1325,19 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomRelatedLessonsResponse: type: object required: @@ -1345,23 +1345,23 @@ components: - meta properties: data: - $ref: "#/components/schemas/Lesson" + $ref: '#/components/schemas/Lesson' links: - $ref: "#/components/schemas/LessonPageCursor" + $ref: '#/components/schemas/LessonPageCursor' RoomUpdateRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/Room" + $ref: '#/components/schemas/Room' RoomUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomsReadResponse: type: object required: @@ -1372,7 +1372,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -1380,21 +1380,21 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: - $ref: "#/components/schemas/RoomPageCursor" + $ref: '#/components/schemas/RoomPageCursor' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' Errors: type: object required: @@ -1413,7 +1413,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "404" + example: '404' code: type: string description: Unique identifier for this type of error. @@ -1432,31 +1432,31 @@ components: content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' examples: Forbidden: - $ref: "#/components/examples/Forbidden" + $ref: '#/components/examples/Forbidden' InternalError: - $ref: "#/components/examples/InternalError" + $ref: '#/components/examples/InternalError' InvalidBodyProperty: - $ref: "#/components/examples/InvalidBodyProperty" + $ref: '#/components/examples/InvalidBodyProperty' InvalidBodyPropertyValue: - $ref: "#/components/examples/InvalidBodyPropertyValue" + $ref: '#/components/examples/InvalidBodyPropertyValue' InvalidParameter: - $ref: "#/components/examples/InvalidParameter" + $ref: '#/components/examples/InvalidParameter' InvalidParameterValue: - $ref: "#/components/examples/InvalidParameterValue" + $ref: '#/components/examples/InvalidParameterValue' TooManyRequests: - $ref: "#/components/examples/TooManyRequests" + $ref: '#/components/examples/TooManyRequests' Unauthorized: - $ref: "#/components/examples/Unauthorized" + $ref: '#/components/examples/Unauthorized' examples: Forbidden: summary: forbidden value: errors: - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 - status: "403" + status: '403' code: forbidden title: Forbidden detail: The provided authorization means did not contain suitable permissions. @@ -1465,7 +1465,7 @@ components: value: errors: - id: a373b344-3e5c-4e2b-b282-c3808d455501 - status: "500" + status: '500' code: internalError title: Internal error detail: An internal error has occurred. @@ -1474,7 +1474,7 @@ components: value: errors: - id: eeb556b9-68be-48a6-b131-c9d744684084 - status: "400" + status: '400' code: invalidBodyProperty title: Invalid request body property detail: Provided request body property '{property}' is invalid. @@ -1483,7 +1483,7 @@ components: value: errors: - id: d2755b4b-7397-43d5-a348-0ec1e8b1e31a - status: "400" + status: '400' code: invalidBodyPropertyValue title: Invalid request body property value detail: Provided value '{value}' of request body property '{property}' is invalid. @@ -1492,7 +1492,7 @@ components: value: errors: - id: 18d1d99b-5658-4b27-95b5-890973d4a8f1 - status: "400" + status: '400' code: invalidParameter title: Invalid request parameter detail: Provided request parameter '{parameter}' is invalid. @@ -1501,7 +1501,7 @@ components: value: errors: - id: 9fffd3aa-6916-43ad-94f3-42f96775a4cc - status: "400" + status: '400' code: invalidParameterValue title: Invalid request parameter value detail: Provided value '{value}' of request parameter '{parameter}' is invalid. @@ -1510,7 +1510,7 @@ components: value: errors: - id: f774e735-9135-456c-ac4a-00cc2128f19f - status: "429" + status: '429' code: tooManyRequests title: Too many requests detail: The server is temporarily throttling requests from the client. @@ -1519,7 +1519,7 @@ components: value: errors: - id: dcfe5037-3380-4719-89d0-1a613d8a229c - status: "401" + status: '401' code: unauthorized title: Unauthorized request detail: No valid authorization means was provided in the request. diff --git a/api-linter/package.json b/api-linter/package.json index a729411..9b2034c 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -1,47 +1,47 @@ { - "name": "@siemens/api-linter", - "version": "0.8.4", - "description": "A linter tool with Rulesets follow Siemens REST API Guidelines", - "homepage": "https://github.com/siemens/lint", - "author": { - "name": "Siemens", - "email": "opensource@siemens.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/siemens/lint.git" - }, - "keywords": [ - "siemens", - "restapi", - "guidelines", - "lint", - "report" - ], - "main": "./src/index.js", - "bin":{ - "api-linter": "./src/index.js" - }, - "scripts": { - "test": "jest", - "dev": "node src/index.js" - }, - "dependencies": { - "@stoplight/spectral-core": "^1.15.1", - "@stoplight/spectral-ruleset-bundler": "^1.5.2", - "@stoplight/spectral-ref-resolver": "^1.0.4", - "@jamietanna/spectral-test-harness": "^0.3.0", - "handlebars": "^4.7.7", - "commander": "^12.0.0", - "underscore": "^1.13.1", - "standard": "^17.0.0", - "js-yaml": "^4.1.0", - "jsonpath": "^1.1.1" - }, - "devDependencies": { - "jest": "^29.0.0", - "jest-junit": "^16.0.0", - "jsonpath": "^1.1.1" - } -} \ No newline at end of file + "name": "@siemens/api-linter", + "version": "0.8.4", + "description": "A linter tool with Rulesets follow Siemens REST API Guidelines", + "homepage": "https://github.com/siemens/lint", + "author": { + "name": "Siemens", + "email": "opensource@siemens.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/siemens/lint.git" + }, + "keywords": [ + "siemens", + "restapi", + "guidelines", + "lint", + "report" + ], + "main": "./src/index.js", + "bin": { + "api-linter": "./src/index.js" + }, + "scripts": { + "test": "jest", + "dev": "node src/index.js" + }, + "dependencies": { + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-ruleset-bundler": "^1.5.2", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@jamietanna/spectral-test-harness": "^0.3.0", + "handlebars": "^4.7.7", + "commander": "^12.0.0", + "underscore": "^1.13.1", + "standard": "^17.0.0", + "js-yaml": "^4.1.0", + "jsonpath": "^1.1.1" + }, + "devDependencies": { + "jest": "^29.0.0", + "jest-junit": "^16.0.0", + "jsonpath": "^1.1.1" + } +} diff --git a/api-linter/rulesets/functions/assert-http-codes-for-operation.js b/api-linter/rulesets/functions/assert-http-codes-for-operation.js index bf3b9f2..7120809 100644 --- a/api-linter/rulesets/functions/assert-http-codes-for-operation.js +++ b/api-linter/rulesets/functions/assert-http-codes-for-operation.js @@ -12,16 +12,16 @@ export default (targetValue, { wellUnderstood }, context) => { if (!(code in wellUnderstood)) { result.push({ message: `${code} is not a well-understood HTTP status code`, - path: [...context.path, verb, 'responses', code], + path: [...context.path, verb, 'responses', code] }); continue; } - const allowedVerbs = wellUnderstood[code].map((verb) => verb.toUpperCase()); + const allowedVerbs = wellUnderstood[code].map(verb => verb.toUpperCase()); const upperCaseVerb = verb.toUpperCase(); if (!allowedVerbs.includes('ALL') && !allowedVerbs.includes(upperCaseVerb)) { result.push({ message: `${code} is not a well-understood HTTP status code for ${upperCaseVerb}`, - path: [...context.path, verb, 'responses', code], + path: [...context.path, verb, 'responses', code] }); continue; } diff --git a/api-linter/rulesets/functions/count-resource-types.js b/api-linter/rulesets/functions/count-resource-types.js index f477384..b30cb3f 100644 --- a/api-linter/rulesets/functions/count-resource-types.js +++ b/api-linter/rulesets/functions/count-resource-types.js @@ -1,6 +1,6 @@ 'use strict'; -const extractResourceTypeFromPath = (path) => { +const extractResourceTypeFromPath = path => { return path.split('/')[path.startsWith('/') ? 1 : 0]; }; @@ -13,7 +13,7 @@ export default (targetValue, { max }) => { return [ { - message: `More than ${max} resource types found`, - }, + message: `More than ${max} resource types found` + } ]; }; diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js index cadd047..7d6e601 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js @@ -1,98 +1,152 @@ -const jp = require('jsonpath') +const jp = require('jsonpath'); -const isCollectionResponse = (schema) => { +const isCollectionResponse = schema => { var props = jp.query(schema, '$.properties.data'); - if (props.length>0){ - if ( props[0].type == 'array') { + if (props.length > 0) { + if (props[0].type == 'array') { return true; } } return false; }; -const hasTopLink = (schema) => { +const hasTopLink = schema => { var props = jp.query(schema, '$.properties.links'); - if (props.length>0){ + if (props.length > 0) { return true; } return false; }; -const pageLinkKeys = ["first", "last", "prev", "next"]; +const pageLinkKeys = ['first', 'last', 'prev', 'next']; -const hasPageLinkKeys = (prob) => { +const hasPageLinkKeys = prob => { var has = false; pageLinkKeys.forEach(key => { - if(key in prob) { + if (key in prob) { has = true; } }); return has; -} +}; -const followCursorBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; -} +const followCursorBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit') + .length == 2 + ); +}; -const followOffsetBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; -} +const followOffsetBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit') + .length == 2 + ); +}; -const followIndexBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; -} +const followIndexBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == + 2 + ); +}; -const checkCursorMeta = (meta) => { - return jp.query(meta, '$.properties.page.properties.nextCursor').length > 0 -} +const checkCursorMeta = meta => { + return jp.query(meta, '$.properties.page.properties.nextCursor').length > 0; +}; -const checkOffsetMeta = (meta) => { - return jp.query(meta, '$.properties.page.properties.totalElements').length > 0 - && jp.query(meta, '$.properties.page.properties.offset').length > 0 - && jp.query(meta, '$.properties.page.properties.elements').length > 0 -} +const checkOffsetMeta = meta => { + return ( + jp.query(meta, '$.properties.page.properties.totalElements').length > 0 && + jp.query(meta, '$.properties.page.properties.offset').length > 0 && + jp.query(meta, '$.properties.page.properties.elements').length > 0 + ); +}; -const checkIndexMeta = (meta) => { - return jp.query(meta, '$.properties.page.properties.totalPages').length > 0 - && jp.query(meta, '$.properties.page.properties.number').length > 0 - && jp.query(meta, '$.properties.page.properties.size').length > 0 -} +const checkIndexMeta = meta => { + return ( + jp.query(meta, '$.properties.page.properties.totalPages').length > 0 && + jp.query(meta, '$.properties.page.properties.number').length > 0 && + jp.query(meta, '$.properties.page.properties.size').length > 0 + ); +}; -const checkIndexMeta2 = (meta) => { - return jp.query(meta, '$.properties.page.properties.elements').length > 0 - && jp.query(meta, '$.properties.page.properties.totalElements').length > 0 -} +const checkIndexMeta2 = meta => { + return ( + jp.query(meta, '$.properties.page.properties.elements').length > 0 && + jp.query(meta, '$.properties.page.properties.totalElements').length > 0 + ); +}; export default (targetValue, options) => { var responseSchema = jp.query(targetValue, '$.responses..schema'); - if (responseSchema.length > 0){ + if (responseSchema.length > 0) { var schema = responseSchema[0]; - if (isCollectionResponse(schema) && hasTopLink(schema)){ + if (isCollectionResponse(schema) && hasTopLink(schema)) { var linkProps = jp.query(schema, '$.properties.links.properties'); - if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); - var responseMeta = jp.query(schema, "$.properties.meta"); - if (options == 'cursor' && requestQueryParameters.length > 0 && followCursorBasedStrategies(requestQueryParameters)){ - if (responseMeta.length == 0 || !checkCursorMeta(responseMeta[0])){ - return [{message: 'The server MAY provide information about the nextCursor that is required to fetch the next page in the meta.page.nextCursor property'}]; + var responseMeta = jp.query(schema, '$.properties.meta'); + if ( + options == 'cursor' && + requestQueryParameters.length > 0 && + followCursorBasedStrategies(requestQueryParameters) + ) { + if (responseMeta.length == 0 || !checkCursorMeta(responseMeta[0])) { + return [ + { + message: + 'The server MAY provide information about the nextCursor that is required to fetch the next page in the meta.page.nextCursor property' + } + ]; } } - if (options == 'offset' && requestQueryParameters.length > 0 && followOffsetBasedStrategies(requestQueryParameters)){ - if (responseMeta.length == 0 || !checkOffsetMeta(responseMeta[0])){ - return [{message: 'Server SHOULD provide pagination meta [meta.page.totalElements, meta.page.offset, meta.page.elements] information to the client'}]; + if ( + options == 'offset' && + requestQueryParameters.length > 0 && + followOffsetBasedStrategies(requestQueryParameters) + ) { + if (responseMeta.length == 0 || !checkOffsetMeta(responseMeta[0])) { + return [ + { + message: + 'Server SHOULD provide pagination meta [meta.page.totalElements, meta.page.offset, meta.page.elements] information to the client' + } + ]; } } - if (options == 'index1' && requestQueryParameters.length > 0 && followIndexBasedStrategies(requestQueryParameters)){ - if (responseMeta.length == 0 || !checkIndexMeta(responseMeta[0])){ - return [{message: 'Server SHOULD provide pagination meta [meta.page.totalPages, meta.page.number, meta.page.size] information to the client'}]; + if ( + options == 'index1' && + requestQueryParameters.length > 0 && + followIndexBasedStrategies(requestQueryParameters) + ) { + if (responseMeta.length == 0 || !checkIndexMeta(responseMeta[0])) { + return [ + { + message: + 'Server SHOULD provide pagination meta [meta.page.totalPages, meta.page.number, meta.page.size] information to the client' + } + ]; } } - if (options == 'index2' && requestQueryParameters.length > 0 && followIndexBasedStrategies(requestQueryParameters)){ - if (responseMeta.length == 0 || (checkIndexMeta(responseMeta[0]) && !checkIndexMeta2(responseMeta[0]))) { - return [{message: 'Server SHOULD provide pagination meta [meta.page.elements, meta.page.totalElements] information to the client'}]; + if ( + options == 'index2' && + requestQueryParameters.length > 0 && + followIndexBasedStrategies(requestQueryParameters) + ) { + if ( + responseMeta.length == 0 || + (checkIndexMeta(responseMeta[0]) && !checkIndexMeta2(responseMeta[0])) + ) { + return [ + { + message: + 'Server SHOULD provide pagination meta [meta.page.elements, meta.page.totalElements] information to the client' + } + ]; } } } } } -}; \ No newline at end of file +}; diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js index 76a54a0..7f60546 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js @@ -1,60 +1,75 @@ -const jp = require('jsonpath') +const jp = require('jsonpath'); -const isCollectionResponse = (schema) => { +const isCollectionResponse = schema => { var props = jp.query(schema, '$.properties.data'); - if (props.length>0){ - if ( props[0].type == 'array') { + if (props.length > 0) { + if (props[0].type == 'array') { return true; } } return false; }; -const hasTopLink = (schema) => { +const hasTopLink = schema => { var props = jp.query(schema, '$.properties.links'); - if (props.length>0){ + if (props.length > 0) { return true; } return false; }; -const pageLinkKeys = ["first", "last", "prev", "next"]; +const pageLinkKeys = ['first', 'last', 'prev', 'next']; -const hasPageLinkKeys = (prob) => { +const hasPageLinkKeys = prob => { var has = false; pageLinkKeys.forEach(key => { - if(key in prob) { + if (key in prob) { has = true; } }); return has; -} +}; -const followCursorBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; -} +const followCursorBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit') + .length == 2 + ); +}; -const followOffsetBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; -} +const followOffsetBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit') + .length == 2 + ); +}; -const followIndexBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; -} +const followIndexBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == + 2 + ); +}; -export default (targetValue) => { +export default targetValue => { var responseSchema = jp.query(targetValue, '$.responses..schema'); - if (responseSchema.length > 0){ + if (responseSchema.length > 0) { var schema = responseSchema[0]; - if (isCollectionResponse(schema) && hasTopLink(schema)){ + if (isCollectionResponse(schema) && hasTopLink(schema)) { var linkProps = jp.query(schema, '$.properties.links.properties'); - if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); - if (requestQueryParameters.length == 0 || !(followCursorBasedStrategies(requestQueryParameters) - || followOffsetBasedStrategies(requestQueryParameters) || followIndexBasedStrategies(requestQueryParameters))){ - return [{message: 'Pagination SHOULD be implemented using query parameters.'}]; + if ( + requestQueryParameters.length == 0 || + !( + followCursorBasedStrategies(requestQueryParameters) || + followOffsetBasedStrategies(requestQueryParameters) || + followIndexBasedStrategies(requestQueryParameters) + ) + ) { + return [{ message: 'Pagination SHOULD be implemented using query parameters.' }]; } } } } -}; \ No newline at end of file +}; diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js index 10369ff..317bbea 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -1,94 +1,105 @@ -const jp = require('jsonpath') +const jp = require('jsonpath'); -const isCollectionResponse = (schema) => { +const isCollectionResponse = schema => { var props = jp.query(schema, '$.properties.data'); - if (props.length>0){ - if ( props[0].type == 'array') { + if (props.length > 0) { + if (props[0].type == 'array') { return true; } } return false; }; -const hasTopLink = (schema) => { +const hasTopLink = schema => { var props = jp.query(schema, '$.properties.links'); - if (props.length>0){ + if (props.length > 0) { return true; } return false; }; -const pageLinkKeys = ["first", "last", "prev", "next", "self"]; +const pageLinkKeys = ['first', 'last', 'prev', 'next', 'self']; -const hasPageLinkKeys = (prob) => { +const hasPageLinkKeys = prob => { var has = false; pageLinkKeys.forEach(key => { - if(key in prob) { + if (key in prob) { has = true; } }); return has; -} +}; -const notInPageKeys = (prob) => { +const notInPageKeys = prob => { const result = Object.keys(prob).filter(key => !pageLinkKeys.includes(key)); return result.length > 0; -} +}; -const followCursorBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit').length == 2; -} +const followCursorBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'cursor' || param.name == 'limit') + .length == 2 + ); +}; -const followOffsetBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit').length == 2; -} +const followOffsetBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'offset' || param.name == 'limit') + .length == 2 + ); +}; -const followIndexBasedStrategies = (requestQueryParameters) =>{ - return requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == 2; -} +const followIndexBasedStrategies = requestQueryParameters => { + return ( + requestQueryParameters.filter(param => param.name == 'number' || param.name == 'size').length == + 2 + ); +}; export default (targetValue, options) => { //valid only targetValue using pagination var requestQueryParameters = jp.query(targetValue, "$.parameters[?(@.in=='query')]"); - if (requestQueryParameters.length > 0 && (followCursorBasedStrategies(requestQueryParameters) - || followOffsetBasedStrategies(requestQueryParameters) || followIndexBasedStrategies(requestQueryParameters))){ - var response = jp.query(targetValue, '$.responses..schema'); - if (response.length > 0){ + if ( + requestQueryParameters.length > 0 && + (followCursorBasedStrategies(requestQueryParameters) || + followOffsetBasedStrategies(requestQueryParameters) || + followIndexBasedStrategies(requestQueryParameters)) + ) { + var response = jp.query(targetValue, '$.responses..schema'); + if (response.length > 0) { var responseSchema = response[0]; //optionA: A server MAY provide links to traverse a paginated data set //optionB: Pagination links SHOULD appear in the top-level links object. //optionC: Pagination links MUST preserve sorting and filtering. //optionD: Naming convention MUST be used for pagination keys. - if (options == 'A'){ - if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)){ - return [{message: 'A server MAY provide links to traverse a paginated data set'}]; - } - else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + if (options == 'A') { + if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)) { + return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; + } else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { var linkProps = jp.query(responseSchema, '$.properties.links.properties'); - if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0 ){ - return [{message: 'A server MAY provide links to traverse a paginated data set'}]; + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0) { + return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } } } if (options == 'B') { - if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { var linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); - if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ - return [{message: 'Pagination links SHOULD appear in the top-level links object.'}]; + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { + return [{ message: 'Pagination links SHOULD appear in the top-level links object.' }]; } } } if (options == 'D') { - if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)){ + if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { var linkProps = jp.query(responseSchema, '$.properties.links.properties'); - if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0 ){ - if (linkProps.filter(prob => notInPageKeys(prob)).length > 0){ - return [{message: 'Naming convention MUST be used for pagination keys.'}]; + if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { + if (linkProps.filter(prob => notInPageKeys(prob)).length > 0) { + return [{ message: 'Naming convention MUST be used for pagination keys.' }]; } } } } } } - -}; \ No newline at end of file +}; diff --git a/api-linter/rulesets/functions/get-resources-has-parameter.js b/api-linter/rulesets/functions/get-resources-has-parameter.js index 9e7a27b..ac63812 100644 --- a/api-linter/rulesets/functions/get-resources-has-parameter.js +++ b/api-linter/rulesets/functions/get-resources-has-parameter.js @@ -1,9 +1,9 @@ -const jp = require('jsonpath') +const jp = require('jsonpath'); -const isCollectionResponse = (schema) => { +const isCollectionResponse = schema => { var props = jp.query(schema, '$.responses.*..data'); - if (props.length>0){ - if ( props[0].type == 'array') { + if (props.length > 0) { + if (props[0].type == 'array') { return true; } } @@ -11,9 +11,12 @@ const isCollectionResponse = (schema) => { }; export default (targetValue, options) => { - if (isCollectionResponse(targetValue)){ - if(targetValue.parameters == null || targetValue.parameters.filter((r) => r.in === 'query' && r.name === options).length == 0){ - return [{message: 'API MAY provide projection of '+ options +' in response'}]; - } + if (isCollectionResponse(targetValue)) { + if ( + targetValue.parameters == null || + targetValue.parameters.filter(r => r.in === 'query' && r.name === options).length == 0 + ) { + return [{ message: 'API MAY provide projection of ' + options + ' in response' }]; } -}; \ No newline at end of file + } +}; diff --git a/api-linter/rulesets/functions/get-status-code.js b/api-linter/rulesets/functions/get-status-code.js index 406947c..b065b04 100644 --- a/api-linter/rulesets/functions/get-status-code.js +++ b/api-linter/rulesets/functions/get-status-code.js @@ -1,23 +1,23 @@ 'use strict'; -const jp = require('jsonpath') +const jp = require('jsonpath'); const checkIsTypeOfOption = (schema, options) => { var props = jp.query(schema, '$..*..data'); - if (Array.isArray(props) && props.length > 0){ - if (options == 'individual' && ((props[0] != null && props[0].type == 'object') - || (props[0].allOf!=null && props[0].allOf[0].type == 'object'))) { + if (Array.isArray(props) && props.length > 0) { + if ( + options == 'individual' && + ((props[0] != null && props[0].type == 'object') || + (props[0].allOf != null && props[0].allOf[0].type == 'object')) + ) { return true; - } - else if (options == 'collection' && (props[0].type == 'array')) { + } else if (options == 'collection' && props[0].type == 'array') { return true; } return false; - } - else { - if (options == 'individual' & props.type == 'object') { + } else { + if ((options == 'individual') & (props.type == 'object')) { return true; - } - else if (options == 'collection' && props.type == 'array') { + } else if (options == 'collection' && props.type == 'array') { return true; } return false; @@ -27,10 +27,12 @@ const checkIsTypeOfOption = (schema, options) => { const checkOption = (object, options) => { var schemas = jp.query(object, '$..content..schema'); var isTypeOfOption = false; - if (Array.isArray(schemas) && schemas.length > 0){ - schemas.filter(schema => typeof schema === 'object' && schema !== null).forEach(schema => { - isTypeOfOption = isTypeOfOption || checkIsTypeOfOption(schema, options); - }) + if (Array.isArray(schemas) && schemas.length > 0) { + schemas + .filter(schema => typeof schema === 'object' && schema !== null) + .forEach(schema => { + isTypeOfOption = isTypeOfOption || checkIsTypeOfOption(schema, options); + }); return isTypeOfOption; } return true; @@ -39,20 +41,23 @@ const checkOption = (object, options) => { export default (targetValue, options) => { if (typeof targetValue !== 'object' || targetValue == null) return; const results = []; - if (options=='individual' && checkOption(targetValue, options)){ - if(typeof targetValue['200'] == 'undefined'){ - results.push({message: "A Successful fetch of individual resources MUST return the status code 200"}) + if (options == 'individual' && checkOption(targetValue, options)) { + if (typeof targetValue['200'] == 'undefined') { + results.push({ + message: 'A Successful fetch of individual resources MUST return the status code 200' + }); } - } - else if(options=='collection' && checkOption(targetValue, options)){ + } else if (options == 'collection' && checkOption(targetValue, options)) { var exist = false; - for(var key in targetValue){ - if (key.match("^2\\d\\d$")){ + for (var key in targetValue) { + if (key.match('^2\\d\\d$')) { exist = true; } } - if (!exist){ - results.push({message: "A successful fetch of resource collection request MUST return a 2xx status code"}) + if (!exist) { + results.push({ + message: 'A successful fetch of resource collection request MUST return a 2xx status code' + }); } } return results; diff --git a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js index c844633..3619b30 100644 --- a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js +++ b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js @@ -1,21 +1,21 @@ export default (targetVal, options) => { - if (typeof targetVal !== 'object' || targetVal == null) return; - const results = []; - if (targetVal.parameters == null){ - results.push({message: 'No parameters provided.'}) - return results; - } - var params = targetVal.parameters; - var exist = false; - for (const param of params){ - for (const ops of options){ - if (param[ops['property']] === ops['value'] && param['in'] === "header"){ - exist = true; - } - } - } - if (!exist){ - results.push({message: 'No header parameter provided in the options'}) - } + if (typeof targetVal !== 'object' || targetVal == null) return; + const results = []; + if (targetVal.parameters == null) { + results.push({ message: 'No parameters provided.' }); return results; -}; \ No newline at end of file + } + var params = targetVal.parameters; + var exist = false; + for (const param of params) { + for (const ops of options) { + if (param[ops['property']] === ops['value'] && param['in'] === 'header') { + exist = true; + } + } + } + if (!exist) { + results.push({ message: 'No header parameter provided in the options' }); + } + return results; +}; diff --git a/api-linter/rulesets/functions/has-headers-with-property.js b/api-linter/rulesets/functions/has-headers-with-property.js index 6f89dbf..deb6bcd 100644 --- a/api-linter/rulesets/functions/has-headers-with-property.js +++ b/api-linter/rulesets/functions/has-headers-with-property.js @@ -1,11 +1,13 @@ export default (targetVal, options) => { - if (typeof targetVal !== 'object' || targetVal == null) return; - const results = []; - if (typeof targetVal["headers"] == 'undefined'){ - results.push({message: "Response should have headers for Api-Version"}) - } - else if (typeof targetVal["headers"][options['property']] == 'undefined'){ - results.push({message: "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'"}) - } - return results; -}; \ No newline at end of file + if (typeof targetVal !== 'object' || targetVal == null) return; + const results = []; + if (typeof targetVal['headers'] == 'undefined') { + results.push({ message: 'Response should have headers for Api-Version' }); + } else if (typeof targetVal['headers'][options['property']] == 'undefined') { + results.push({ + message: + "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'" + }); + } + return results; +}; diff --git a/api-linter/rulesets/functions/is-meta-object.js b/api-linter/rulesets/functions/is-meta-object.js index 39f5009..b5ca7ce 100644 --- a/api-linter/rulesets/functions/is-meta-object.js +++ b/api-linter/rulesets/functions/is-meta-object.js @@ -1,13 +1,17 @@ 'use strict'; -const assertObjectSchema = (schema) => { +const assertObjectSchema = schema => { if (schema.type !== 'object') { throw 'Schema type is not `object`'; } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -15,15 +19,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/is-object-schema.js b/api-linter/rulesets/functions/is-object-schema.js index 145d307..a81684e 100644 --- a/api-linter/rulesets/functions/is-object-schema.js +++ b/api-linter/rulesets/functions/is-object-schema.js @@ -1,13 +1,17 @@ 'use strict'; -const assertObjectSchema = (schema) => { +const assertObjectSchema = schema => { if (schema.type !== 'object' && !schema.$ref) { throw 'Schema type is not `object`'; } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -15,15 +19,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/is-problem-json-schema.js b/api-linter/rulesets/functions/is-problem-json-schema.js index 8f7fdd1..981ac1b 100644 --- a/api-linter/rulesets/functions/is-problem-json-schema.js +++ b/api-linter/rulesets/functions/is-problem-json-schema.js @@ -19,7 +19,7 @@ properties: type: string */ -const assertProblemSchema = (schema) => { +const assertProblemSchema = schema => { if (schema.type !== 'object') { throw "Problem json must have type 'object'"; } @@ -45,8 +45,12 @@ const assertProblemSchema = (schema) => { } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -54,15 +58,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/links-has-self.js b/api-linter/rulesets/functions/links-has-self.js index c777fb4..6023937 100644 --- a/api-linter/rulesets/functions/links-has-self.js +++ b/api-linter/rulesets/functions/links-has-self.js @@ -1,13 +1,13 @@ 'use strict'; -const jp = require('jsonpath') +const jp = require('jsonpath'); -const checkSelf = (link) => { - if (link["self"] == null){ +const checkSelf = link => { + if (link['self'] == null) { throw 'self property not found in links object'; } -} +}; -const assertLinkSchema = (schema) => { +const assertLinkSchema = schema => { const paths = jp.paths(schema, '$..*..links.properties'); for (const path of paths) { @@ -19,8 +19,12 @@ const assertLinkSchema = (schema) => { } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -28,15 +32,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js index 3506ad3..86342e5 100644 --- a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js +++ b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js @@ -1,34 +1,33 @@ 'use strict'; -const validateResource = (resource) => { - if (! /^([a-z][a-z0-9]*)((-)[a-z0-9]+)*$/ .test(resource)){ - throw "Resource names SHOULD be in lowercase with hyphen"; +const validateResource = resource => { + if (!/^([a-z][a-z0-9]*)((-)[a-z0-9]+)*$/.test(resource)) { + throw 'Resource names SHOULD be in lowercase with hyphen'; } -} +}; -const check = (path) => { +const check = path => { if (path == null) { return; } var resources = path.split('/'); for (let index = 0; index < resources.length; index++) { const element = resources[index]; - if (element.length > 0 && !element.startsWith('{') && !element.endsWith('}')) - { + if (element.length > 0 && !element.startsWith('{') && !element.endsWith('}')) { validateResource(element); } } }; -export default (targetValue) => { +export default targetValue => { if (targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/query-parameters-length.js b/api-linter/rulesets/functions/query-parameters-length.js index 965584e..2ec51ef 100644 --- a/api-linter/rulesets/functions/query-parameters-length.js +++ b/api-linter/rulesets/functions/query-parameters-length.js @@ -1,18 +1,30 @@ export default (targetValue, options) => { - if (targetValue == null) return; - var checkField = options.nameCheck != null; - var queryParameterCount = targetValue.filter((r) => r.in === 'query').length; - var hasFilter = targetValue.filter((r) => r.in === 'query' && r.name === 'filter').length > 0; - if (((queryParameterCount > options.max && !hasFilter) || (hasFilter && queryParameterCount -1 > options.max)) && !checkField){ - return [{message: 'API MAY not support more than '+ options.max + - ' parameters at once for selecting resources. ' + - '(Linter is unable to determine whether the parameter belongs to the filtering condition or not.) ' - }]; - } - if (queryParameterCount > options.max && checkField && !hasFilter){ - return [{message: "The query parameter 'filter' SHOULD be used to filter or query data. " + - "(Linter is unable to determine whether the parameters used for filtering or not.) " - }]; - } + if (targetValue == null) return; + var checkField = options.nameCheck != null; + var queryParameterCount = targetValue.filter(r => r.in === 'query').length; + var hasFilter = targetValue.filter(r => r.in === 'query' && r.name === 'filter').length > 0; + if ( + ((queryParameterCount > options.max && !hasFilter) || + (hasFilter && queryParameterCount - 1 > options.max)) && + !checkField + ) { + return [ + { + message: + 'API MAY not support more than ' + + options.max + + ' parameters at once for selecting resources. ' + + '(Linter is unable to determine whether the parameter belongs to the filtering condition or not.) ' + } + ]; + } + if (queryParameterCount > options.max && checkField && !hasFilter) { + return [ + { + message: + "The query parameter 'filter' SHOULD be used to filter or query data. " + + '(Linter is unable to determine whether the parameters used for filtering or not.) ' + } + ]; + } }; - \ No newline at end of file diff --git a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js index 1b2adba..222f16a 100644 --- a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js @@ -1,10 +1,9 @@ 'use strict'; -const assertObjectSchema = (schema) => { +const assertObjectSchema = schema => { var exist = false; - for(var key in schema.properties) - { - if (key === "data"){ + for (var key in schema.properties) { + if (key === 'data') { exist = true; break; } @@ -14,8 +13,12 @@ const assertObjectSchema = (schema) => { } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -23,15 +26,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js index e637177..daba08e 100644 --- a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js @@ -1,11 +1,10 @@ 'use strict'; -const assertObjectSchema = (schema) => { - var doc_structure = ["data", "errors", "meta", "links"]; +const assertObjectSchema = schema => { + var doc_structure = ['data', 'errors', 'meta', 'links']; var exist = false; - for(var key in schema.properties) - { - if (doc_structure.includes(key)){ + for (var key in schema.properties) { + if (doc_structure.includes(key)) { exist = true; break; } @@ -15,8 +14,12 @@ const assertObjectSchema = (schema) => { } }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -24,15 +27,15 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/schema-test.js b/api-linter/rulesets/functions/schema-test.js index 22bb820..6668ceb 100644 --- a/api-linter/rulesets/functions/schema-test.js +++ b/api-linter/rulesets/functions/schema-test.js @@ -1,12 +1,16 @@ 'use strict'; -const assertObjectSchema = (schema) => { - console.log("==========================================") - console.log(schema) +const assertObjectSchema = schema => { + console.log('=========================================='); + console.log(schema); }; -const check = (schema) => { - const combinedSchemas = [...(schema.anyOf || []), ...(schema.oneOf || []), ...(schema.allOf || [])]; +const check = schema => { + const combinedSchemas = [ + ...(schema.anyOf || []), + ...(schema.oneOf || []), + ...(schema.allOf || []) + ]; if (combinedSchemas.length > 0) { combinedSchemas.filter(s => typeof s === 'object' && s !== null).forEach(check); } else { @@ -14,16 +18,16 @@ const check = (schema) => { } }; -export default (targetValue) => { +export default targetValue => { if (typeof targetValue !== 'object' || targetValue == null) return; try { - console.log("*********************************") + console.log('*********************************'); check(targetValue); } catch (ex) { return [ { - message: ex, - }, + message: ex + } ]; } }; diff --git a/api-linter/rulesets/functions/successful-response-status-code.js b/api-linter/rulesets/functions/successful-response-status-code.js index 83c5d3c..712c715 100644 --- a/api-linter/rulesets/functions/successful-response-status-code.js +++ b/api-linter/rulesets/functions/successful-response-status-code.js @@ -1,13 +1,13 @@ -export default (targetValue) => { +export default targetValue => { const results = []; var exist = false; - for(var key in targetValue){ - if (key.match("^2\\d\\d$")){ + for (var key in targetValue) { + if (key.match('^2\\d\\d$')) { exist = true; } } - if (!exist){ - results.push({message: "API MUST respond successful response with 2xx success status code"}) + if (!exist) { + results.push({ message: 'API MUST respond successful response with 2xx success status code' }); } return results; }; diff --git a/api-linter/rulesets/functions/validate-b3-tracing.js b/api-linter/rulesets/functions/validate-b3-tracing.js index 4dc9325..e0d8d84 100644 --- a/api-linter/rulesets/functions/validate-b3-tracing.js +++ b/api-linter/rulesets/functions/validate-b3-tracing.js @@ -1,24 +1,25 @@ 'use strict'; -export default (targetValue) => { +export default targetValue => { if (!Array.isArray(targetValue)) { return [ { - message: `No array given, provide $.paths.*.*.parameters`, - }, + message: `No array given, provide $.paths.*.*.parameters` + } ]; } const b3Params = targetValue.filter( - (param) => - param.name && (param.name.toLowerCase() === 'x-b3-traceid' || param.name.toLowerCase() === 'x-b3-spanid'), + param => + param.name && + (param.name.toLowerCase() === 'x-b3-traceid' || param.name.toLowerCase() === 'x-b3-spanid') ); - if (b3Params.length !== 2 || !b3Params.every((param) => param.in === 'header')) { + if (b3Params.length !== 2 || !b3Params.every(param => param.in === 'header')) { return [ { - message: `B3 header X-B3-Traceid or X-B3-Spanid missing`, - }, + message: `B3 header X-B3-Traceid or X-B3-Spanid missing` + } ]; } diff --git a/api-linter/rulesets/semantic-versioning.yml b/api-linter/rulesets/semantic-versioning.yml index ab2ea98..7ef9571 100644 --- a/api-linter/rulesets/semantic-versioning.yml +++ b/api-linter/rulesets/semantic-versioning.yml @@ -1,5 +1,4 @@ rules: - Semantic-Versioning-[2.0.0]: message: '{{error}}' description: Semantic versioning MUST be used to version individual APIs @@ -11,4 +10,4 @@ rules: functionOptions: schema: type: string - match: '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$' \ No newline at end of file + match: '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$' diff --git a/api-linter/rulesets/siemens-api-common-operation.yml b/api-linter/rulesets/siemens-api-common-operation.yml index 8b0c78e..8680844 100644 --- a/api-linter/rulesets/siemens-api-common-operation.yml +++ b/api-linter/rulesets/siemens-api-common-operation.yml @@ -6,7 +6,6 @@ functions: - has-header-parameter-with-property-value rules: - Siemens-API-[800.1]: message: A Successful fetch of individual resources MUST return the status code 200 description: A server MUST respond to a successful request to fetch an individual resource or resource collection with a 200 status code response. @@ -35,7 +34,7 @@ rules: given: $.paths..get.responses..content..schema then: function: links-has-self - + Siemens-API-[801]: message: The POST request MUST include a single resource object as primary data description: The POST request MUST include a single resource object as primary data @@ -46,32 +45,32 @@ rules: function: is-object-schema Siemens-API-[801.4]: - message: API MUST respond to successful POST creation request with 2xx success status code - description: API MUST respond to successful POST creation request with 2xx success status code + message: API MUST respond to successful POST creation request with 2xx success status code + description: API MUST respond to successful POST creation request with 2xx success status code documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops801.4 severity: error given: $.paths.*.post.responses then: function: successful-response-status-code - + Siemens-API-[802.3]: - message: A PATCH request SHOULD address a single resource only + message: A PATCH request SHOULD address a single resource only description: A PATCH request SHOULD address a single resource only documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops802.3 severity: warn given: $.paths.*.patch.requestBody..content..schema then: function: is-object-schema - + Siemens-API-[802.6]: - message: API MUST respond to successful PATCH update request with 2xx success status code + message: API MUST respond to successful PATCH update request with 2xx success status code description: API MUST respond to successful PATCH update request with 2xx success status code documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops802.6 severity: error given: $.paths.*.patch.responses then: function: successful-response-status-code - + Siemens-API-[803.1]: message: PUT update request SHOULD be provided only for single resource objects description: PUT update request SHOULD be provided only for single resource objects @@ -80,9 +79,9 @@ rules: given: $.paths.*.put.requestBody..content..schema then: function: is-object-schema - + Siemens-API-[803.2]: - message: API MUST respond to successful PUT update request with 2xx success status code + message: API MUST respond to successful PUT update request with 2xx success status code description: API MUST respond to successful PUT update request with 2xx success status code documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops803.2 severity: error @@ -91,7 +90,7 @@ rules: function: successful-response-status-code Siemens-API-[803.6]: - message: The API consumer MAY use conditional header information to solve concurrent update requests + message: The API consumer MAY use conditional header information to solve concurrent update requests description: To prevent unnoticed concurrent updates when using PUT, the server endpoint MAY consider to support ETag together with If-Match/If-None-Match header documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops803.6 severity: info @@ -103,13 +102,12 @@ rules: value: If-Match - property: name value: If-None-Match - + Siemens-API-[804.1]: - message: MUST respond to successful DELETE request with 2xx success status code + message: MUST respond to successful DELETE request with 2xx success status code description: MUST respond to successful DELETE request with 2xx success status code documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/common-operations.html#commonops804.1 severity: error given: $.paths.*.delete.responses then: function: successful-response-status-code - diff --git a/api-linter/rulesets/siemens-api-error-reporting.yml b/api-linter/rulesets/siemens-api-error-reporting.yml index d4dfb8a..c5a403d 100644 --- a/api-linter/rulesets/siemens-api-error-reporting.yml +++ b/api-linter/rulesets/siemens-api-error-reporting.yml @@ -1,5 +1,4 @@ rules: - Siemens-API-[300]: message: '{{property}} is not using an official response code' description: API MUST use official HTTP status codes as intended. @@ -10,72 +9,72 @@ rules: function: enumeration functionOptions: values: - - '100' - - '101' - - '102' - - '103' - - '200' - - '201' - - '202' - - '203' - - '204' - - '205' - - '206' - - '207' - - '208' - - '226' - - '300' - - '301' - - '302' - - '303' - - '304' - - '305' - - '306' - - '307' - - '308' - - '400' - - '401' - - '402' - - '403' - - '404' - - '405' - - '406' - - '407' - - '408' - - '409' - - '410' - - '411' - - '412' - - '413' - - '414' - - '415' - - '416' - - '417' - - '418' - - '421' - - '422' - - '423' - - '424' - - '425' - - '426' - - '427' - - '428' - - '429' - - '430' - - '431' - - '451' - - '500' - - '501' - - '502' - - '503' - - '504' - - '505' - - '506' - - '507' - - '508' - - '509' - - '510' - - '511' + - '100' + - '101' + - '102' + - '103' + - '200' + - '201' + - '202' + - '203' + - '204' + - '205' + - '206' + - '207' + - '208' + - '226' + - '300' + - '301' + - '302' + - '303' + - '304' + - '305' + - '306' + - '307' + - '308' + - '400' + - '401' + - '402' + - '403' + - '404' + - '405' + - '406' + - '407' + - '408' + - '409' + - '410' + - '411' + - '412' + - '413' + - '414' + - '415' + - '416' + - '417' + - '418' + - '421' + - '422' + - '423' + - '424' + - '425' + - '426' + - '427' + - '428' + - '429' + - '430' + - '431' + - '451' + - '500' + - '501' + - '502' + - '503' + - '504' + - '505' + - '506' + - '507' + - '508' + - '509' + - '510' + - '511' - default Siemens-API-[301]: @@ -113,7 +112,7 @@ rules: - '503' - '504' - default - + Siemens-API-[302]: message: '{{property}} is not using most specific HTTP status code for error' description: Xcelerator API SHOULD use the most specific HTTP status code when returning information about the request processing state or reported error situations @@ -138,7 +137,7 @@ rules: - '500' - '501' - '503' - + Siemens-API-[305]-1: message: Error object SHOULD be represented according to the defined structure fields description: Error object SHOULD be represented according to the defined structure fields @@ -157,7 +156,7 @@ rules: - 'links' - 'correlationId' - 'source' - + Siemens-API-[305]-2: message: 'The error links resource object MAY contain the members: about, type' description: 'The error links resource object MAY contain the members: about, type' @@ -170,7 +169,7 @@ rules: values: - 'about' - 'type' - + Siemens-API-[305]-3: message: 'The source object SHOULD include one of the members or be omitted: pointer, parameter, header' description: 'The source object SHOULD include one of the members or be omitted: pointer, parameter, header' @@ -184,4 +183,3 @@ rules: - 'pointer' - 'parameter' - 'header' - diff --git a/api-linter/rulesets/siemens-api-express.yml b/api-linter/rulesets/siemens-api-express.yml index 4c30b41..1dfc42c 100644 --- a/api-linter/rulesets/siemens-api-express.yml +++ b/api-linter/rulesets/siemens-api-express.yml @@ -7,4 +7,4 @@ extends: - ./siemens-api-sorting.yml - ./siemens-api-common-operation.yml - ./siemens-api-versioning.yml - - ./siemens-api-security.yml \ No newline at end of file + - ./siemens-api-security.yml diff --git a/api-linter/rulesets/siemens-api-filtering.yml b/api-linter/rulesets/siemens-api-filtering.yml index e647bbf..ee07403 100644 --- a/api-linter/rulesets/siemens-api-filtering.yml +++ b/api-linter/rulesets/siemens-api-filtering.yml @@ -2,7 +2,6 @@ functions: - query-parameters-length rules: - Siemens-API-[400]: message: '{{error}}' description: An API provider SHOULD NOT support more than 4 parameters at once for selecting resources @@ -11,9 +10,9 @@ rules: given: $.paths..get.parameters then: function: query-parameters-length - functionOptions: + functionOptions: max: 4 - + Siemens-API-[401]: message: '{{error}}' description: The query parameter filter SHOULD be used to filter or query data @@ -22,8 +21,6 @@ rules: given: $.paths..get.parameters then: function: query-parameters-length - functionOptions: + functionOptions: max: 4 nameCheck: filter - - diff --git a/api-linter/rulesets/siemens-api-media-type.yml b/api-linter/rulesets/siemens-api-media-type.yml index 552fb99..fa1a158 100644 --- a/api-linter/rulesets/siemens-api-media-type.yml +++ b/api-linter/rulesets/siemens-api-media-type.yml @@ -9,7 +9,6 @@ functions: - path-resource-name-is-lowercase-with-hyphen rules: - Siemens-API-[100]: message: SHOULD use JSON-based media types description: Siemens Xcelerator recommends use either the media type application/json for exchanging data, or a more specific media type based on JSON. @@ -58,7 +57,7 @@ rules: function: pattern functionOptions: match: ^(boolean|object|array|integer|number|string)$ - + Siemens-API-[101.5]: message: A links object SHOULD contain one or more links description: A links object SHOULD contain one or more links @@ -67,7 +66,7 @@ rules: given: $.*..schema..links then: function: is-object-schema - + Siemens-API-[101.7]: message: A JSON document MAY provide meta information. description: Meta information can be used to include additional information to a JSON object. @@ -107,7 +106,7 @@ rules: function: pattern functionOptions: match: ^[a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]$ - + Siemens-API-[101.9]: message: Resource names SHOULD be in lowercase with hyphen description: Resource names in an URL path (including resource names) SHOULD be lower case words separated by hyphens @@ -115,4 +114,3 @@ rules: given: $.paths.*~ then: function: path-resource-name-is-lowercase-with-hyphen - diff --git a/api-linter/rulesets/siemens-api-pagination.yml b/api-linter/rulesets/siemens-api-pagination.yml index 11b9ed5..0f17b0d 100644 --- a/api-linter/rulesets/siemens-api-pagination.yml +++ b/api-linter/rulesets/siemens-api-pagination.yml @@ -4,7 +4,6 @@ functions: - get-resources-has-pagination-strategies-meta rules: - Siemens-API-[600]-1: message: '{{error}}' description: A server MAY provide links to traverse a paginated data set @@ -24,7 +23,7 @@ rules: then: function: get-resources-has-pagination functionOptions: B - + Siemens-API-[600]-3: message: '{{error}}' description: Naming convention MUST be used for pagination keys @@ -34,7 +33,7 @@ rules: then: function: get-resources-has-pagination functionOptions: D - + Siemens-API-[601]: message: '{{error}}' description: Pagination SHOULD be implemented using query parameters @@ -43,7 +42,7 @@ rules: given: $.paths..get then: function: get-resources-has-pagination-strategies - + Siemens-API-[601.1.1]: message: '{{error}}' description: Server MAY provide pagination meta information to the client @@ -53,7 +52,7 @@ rules: then: function: get-resources-has-pagination-strategies-meta functionOptions: cursor - + Siemens-API-[601.2.1]: message: '{{error}}' description: Server MAY provide pagination meta information to the client @@ -63,7 +62,7 @@ rules: then: function: get-resources-has-pagination-strategies-meta functionOptions: offset - + Siemens-API-[601.3.1]-1: message: '{{error}}' description: Server MAY provide pagination meta information to the client @@ -82,4 +81,4 @@ rules: given: $.paths..get then: function: get-resources-has-pagination-strategies-meta - functionOptions: index2 \ No newline at end of file + functionOptions: index2 diff --git a/api-linter/rulesets/siemens-api-security.js b/api-linter/rulesets/siemens-api-security.js index 45cecb7..66d9232 100644 --- a/api-linter/rulesets/siemens-api-security.js +++ b/api-linter/rulesets/siemens-api-security.js @@ -1,57 +1,57 @@ var apiSecurity = global.apiSecurity; const hasHeaderWithPropertyValue = (targetVal, options) => { - const results = []; - if (targetVal.parameters == null){ - results.push({message: 'No request header parameters provided.'}) - return results; - } - var exist = false; - for (const param of targetVal.parameters){ - if (param[options['property']] === options['value'] && param['in'] === "header"){ - exist = true; - } - } - if (!exist){ - results.push({message: 'A request header '+ options['value'] +' MUST be supported.'}) - } + const results = []; + if (targetVal.parameters == null) { + results.push({ message: 'No request header parameters provided.' }); return results; + } + var exist = false; + for (const param of targetVal.parameters) { + if (param[options['property']] === options['value'] && param['in'] === 'header') { + exist = true; + } + } + if (!exist) { + results.push({ message: 'A request header ' + options['value'] + ' MUST be supported.' }); + } + return results; }; var ruleset = {}; if (typeof apiSecurity == 'undefined') { - apiSecurity = "n"; + apiSecurity = 'n'; } -switch (apiSecurity.toLowerCase()){ - case "y": - case "t": - case "true": - case "yes": - ruleset.rules = { - "Siemens-API-Security": { - message: "{{error}}", - description: "When calling a secured REST API, the request header Authorization with the value Bearer MUST be present.", - documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/security.html", - severity: "error", - given: [ - "$.paths.*" - ], - then: { - function: hasHeaderWithPropertyValue, - functionOptions: { - property: "name", - value: "Authorization" - } - } - } +switch (apiSecurity.toLowerCase()) { + case 'y': + case 't': + case 'true': + case 'yes': + ruleset.rules = { + 'Siemens-API-Security': { + message: '{{error}}', + description: + 'When calling a secured REST API, the request header Authorization with the value Bearer MUST be present.', + documentationUrl: + 'https://developer.siemens.com/guidelines/api-guidelines/rest/security.html', + severity: 'error', + given: ['$.paths.*'], + then: { + function: hasHeaderWithPropertyValue, + functionOptions: { + property: 'name', + value: 'Authorization' + } + } } - break; - case "ignore": - case "n": - case "no": - case "f": - case "false": - default: - ruleset.rules = {} - break; + }; + break; + case 'ignore': + case 'n': + case 'no': + case 'f': + case 'false': + default: + ruleset.rules = {}; + break; } -export default ruleset; \ No newline at end of file +export default ruleset; diff --git a/api-linter/rulesets/siemens-api-sorting.yml b/api-linter/rulesets/siemens-api-sorting.yml index 67cd771..606f1ba 100644 --- a/api-linter/rulesets/siemens-api-sorting.yml +++ b/api-linter/rulesets/siemens-api-sorting.yml @@ -2,7 +2,6 @@ functions: - get-resources-has-parameter rules: - Siemens-API-[700]: message: '{{error}}' description: API MAY provide projection of sort in response @@ -12,4 +11,3 @@ rules: then: function: get-resources-has-parameter functionOptions: sort - \ No newline at end of file diff --git a/api-linter/rulesets/siemens-api-sparse-fieldsets.yml b/api-linter/rulesets/siemens-api-sparse-fieldsets.yml index 784835a..6b16d5e 100644 --- a/api-linter/rulesets/siemens-api-sparse-fieldsets.yml +++ b/api-linter/rulesets/siemens-api-sparse-fieldsets.yml @@ -2,7 +2,6 @@ functions: - get-resources-has-parameter rules: - Siemens-API-[500]: message: '{{error}}' description: API MAY provide projection of fieldset in response @@ -12,5 +11,3 @@ rules: then: function: get-resources-has-parameter functionOptions: fields - - diff --git a/api-linter/rulesets/siemens-api-versioning.js b/api-linter/rulesets/siemens-api-versioning.js index 128917a..4881710 100644 --- a/api-linter/rulesets/siemens-api-versioning.js +++ b/api-linter/rulesets/siemens-api-versioning.js @@ -1,94 +1,98 @@ -const {pattern} = require('@stoplight/spectral-functions') +const { pattern } = require('@stoplight/spectral-functions'); const apiVersioning = global.apiVersioning; const hasPropertyValue = (targetVal, options) => { - const results = []; - var exist = false; - for (const param of targetVal){ - if (param[options['property']] === options['value']){ - exist = true; - } - } - if (!exist){ - results.push({message: 'A request header Api-Version MUST be supported to allow client to specify the version.'}) + const results = []; + var exist = false; + for (const param of targetVal) { + if (param[options['property']] === options['value']) { + exist = true; } - return results; + } + if (!exist) { + results.push({ + message: + 'A request header Api-Version MUST be supported to allow client to specify the version.' + }); + } + return results; }; const hasProperty = (targetVal, options) => { - const results = []; - if (typeof targetVal["headers"] == 'undefined'){ - results.push({message: "Response should have headers for Api-Version"}) - } - else if (typeof targetVal["headers"][options['property']] == 'undefined'){ - results.push({message: "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'"}) - } - return results; + const results = []; + if (typeof targetVal['headers'] == 'undefined') { + results.push({ message: 'Response should have headers for Api-Version' }); + } else if (typeof targetVal['headers'][options['property']] == 'undefined') { + results.push({ + message: + "A header with full semantic version value MUST be returned in the response with 'Api-Version: ..'" + }); + } + return results; }; var ruleset = {}; -switch (apiVersioning){ - case "ignore": - ruleset.rules = {} - break; - case "url": - ruleset.rules = { - "Siemens-API-[200.1]": { - message: "The Major version number MUST be specified in the URI as a path segment", - description: "The Major version number MUST be specified in the URI as a path segment.", - documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.1", - severity: "error", - given: [ - "$.servers..url" - ], - then: { - function: pattern, - functionOptions: { - match: "/[\\.|\\/|](v)?[0-9]+/i", - notMatch: "/[\\.|\\/|](v)?[0-9]+\\.[0-9]+/i" - } - } - } +switch (apiVersioning) { + case 'ignore': + ruleset.rules = {}; + break; + case 'url': + ruleset.rules = { + 'Siemens-API-[200.1]': { + message: 'The Major version number MUST be specified in the URI as a path segment', + description: 'The Major version number MUST be specified in the URI as a path segment.', + documentationUrl: + 'https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.1', + severity: 'error', + given: ['$.servers..url'], + then: { + function: pattern, + functionOptions: { + match: '/[\\.|\\/|](v)?[0-9]+/i', + notMatch: '/[\\.|\\/|](v)?[0-9]+\\.[0-9]+/i' + } + } } - break; - case "header": - ruleset.rules = { - "Siemens-API-[200.2]": { - message: "{{message}}", - description: "A request HTTP header e.g., Api-Version Should be supported to allow client to specify the version.", - documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.2", - severity: "error", - given: [ - "$.paths[*]..parameters" - ], - then: { - function: hasPropertyValue, - functionOptions: { - property: "name", - value: "Api-Version" - } - } - } + }; + break; + case 'header': + ruleset.rules = { + 'Siemens-API-[200.2]': { + message: '{{message}}', + description: + 'A request HTTP header e.g., Api-Version Should be supported to allow client to specify the version.', + documentationUrl: + 'https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule200.2', + severity: 'error', + given: ['$.paths[*]..parameters'], + then: { + function: hasPropertyValue, + functionOptions: { + property: 'name', + value: 'Api-Version' + } + } } - break; - default: - break; + }; + break; + default: + break; } -if (apiVersioning == 'url' || apiVersioning == 'header'){ - ruleset.rules["Siemens-API-[201]"] = { - message: "{{message}}", - description: "A header with full semantic version value SHOULD be returned in the response with 'Api-Version: ..'", - documentationUrl: "https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule201", - severity: "warn", - given: [ - "$.paths..responses[?(@.content)]" - ], - then: { - function: hasProperty, - functionOptions: { - property: "Api-Version" - } +if (apiVersioning == 'url' || apiVersioning == 'header') { + ruleset.rules['Siemens-API-[201]'] = { + message: '{{message}}', + description: + "A header with full semantic version value SHOULD be returned in the response with 'Api-Version: ..'", + documentationUrl: + 'https://developer.siemens.com/guidelines/api-guidelines/rest/versioning.html#versioningrule201', + severity: 'warn', + given: ['$.paths..responses[?(@.content)]'], + then: { + function: hasProperty, + functionOptions: { + property: 'Api-Version' } - } + } + }; } -export default ruleset; \ No newline at end of file +export default ruleset; diff --git a/api-linter/rulesets/siemens-api.yml b/api-linter/rulesets/siemens-api.yml index 8f0948e..8f399e0 100644 --- a/api-linter/rulesets/siemens-api.yml +++ b/api-linter/rulesets/siemens-api.yml @@ -8,4 +8,4 @@ extends: - ./siemens-api-sorting.yml - ./siemens-api-common-operation.yml - ./siemens-api-security.yml - - "spectral:oas" \ No newline at end of file + - 'spectral:oas' diff --git a/api-linter/rulesets/vs-extension.yml b/api-linter/rulesets/vs-extension.yml index eace2ca..d388f6c 100644 --- a/api-linter/rulesets/vs-extension.yml +++ b/api-linter/rulesets/vs-extension.yml @@ -7,4 +7,4 @@ extends: - ./siemens-api-sorting.yml - ./siemens-api-common-operation.yml - ./semantic-versioning.yml - - "spectral:oas" \ No newline at end of file + - 'spectral:oas' diff --git a/api-linter/src/argument.js b/api-linter/src/argument.js index 1e7a012..a5a726d 100644 --- a/api-linter/src/argument.js +++ b/api-linter/src/argument.js @@ -1,48 +1,77 @@ 'use strict'; -const { Command, Option } = require("commander"); +const { Command, Option } = require('commander'); exports.argument = () => { - const program = new Command(); + const program = new Command(); - program.name("api-linter") - .requiredOption("-s, --specPath ", "path to openapi specification") - .requiredOption("-r, --rulesetPath ", "path to ruleset file",(value, previous) => { - if (!Array.isArray(previous)) { - return [value]; - } - previous.push(value); - return previous; - }, - [] - ) - .addOption(new Option("-f, --failSeverity ", "fail severity").default("warn")) - .addOption(new Option("-c, --consoleSeverity ", "console output severity").default("warn")) - .addOption(new Option("-o, --outputFilename ", "output filename").default("linter-result.html")) - .addOption(new Option("-p, --jsonFile ", "output json file").default("spectral_result.json")) - .addOption(new Option("-v, --apiVersioning ", "api versioning") - .choices(["ignore", "url", "header"]) - .default("ignore")) - .addOption(new Option("-a, --apiSecurity ", "api security") - .choices(["y","yes","t","true","n","no","f","false"]) - .default("n")) - .option("--resolve", "follow external $refs (same as Spectral --resolve)", false); + program + .name('api-linter') + .requiredOption('-s, --specPath ', 'path to openapi specification') + .requiredOption( + '-r, --rulesetPath ', + 'path to ruleset file', + (value, previous) => { + if (!Array.isArray(previous)) { + return [value]; + } + previous.push(value); + return previous; + }, + [] + ) + .addOption(new Option('-f, --failSeverity ', 'fail severity').default('warn')) + .addOption( + new Option('-c, --consoleSeverity ', 'console output severity').default( + 'warn' + ) + ) + .addOption( + new Option('-o, --outputFilename ', 'output filename').default( + 'linter-result.html' + ) + ) + .addOption( + new Option('-p, --jsonFile ', 'output json file').default( + 'spectral_result.json' + ) + ) + .addOption( + new Option('-v, --apiVersioning ', 'api versioning') + .choices(['ignore', 'url', 'header']) + .default('ignore') + ) + .addOption( + new Option('-a, --apiSecurity ', 'api security') + .choices(['y', 'yes', 't', 'true', 'n', 'no', 'f', 'false']) + .default('n') + ) + .option('--resolve', 'follow external $refs (same as Spectral --resolve)', false); - program.parse(process.argv); + program.parse(process.argv); - const options = program.opts(); - const { specPath, rulesetPath, failSeverity, consoleSeverity, - apiVersioning, apiSecurity, outputFilename, resolve, jsonFile } = options; - global.apiVersioning = apiVersioning; - global.apiSecurity = apiSecurity; - return ({ - specPath, - rulesetPath, - failSeverity, - consoleSeverity, - apiVersioning, - apiSecurity, - outputFilename, - resolve, - jsonFile - }); -} \ No newline at end of file + const options = program.opts(); + const { + specPath, + rulesetPath, + failSeverity, + consoleSeverity, + apiVersioning, + apiSecurity, + outputFilename, + resolve, + jsonFile + } = options; + global.apiVersioning = apiVersioning; + global.apiSecurity = apiSecurity; + return { + specPath, + rulesetPath, + failSeverity, + consoleSeverity, + apiVersioning, + apiSecurity, + outputFilename, + resolve, + jsonFile + }; +}; diff --git a/api-linter/src/extension.js b/api-linter/src/extension.js index 335259d..67e6828 100644 --- a/api-linter/src/extension.js +++ b/api-linter/src/extension.js @@ -4,38 +4,34 @@ const fs = require('fs'); const spectralCore = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); const spectralRuntime = require('@stoplight/spectral-runtime'); -const {bundleAndLoadRuleset} = require('@stoplight/spectral-ruleset-bundler/with-loader'); +const { bundleAndLoadRuleset } = require('@stoplight/spectral-ruleset-bundler/with-loader'); const fetch = spectralRuntime; -const {Spectral, Document} = spectralCore; +const { Spectral, Document } = spectralCore; -const linter = async (specFilePath, rulesetFilepath) => { - const myDocument = new Document( - fs.readFileSync(specFilePath, "utf-8").trim(), - Parsers.Yaml, - "openapi.yml", - ); - const spectral = new Spectral(); - var rules = await bundleAndLoadRuleset(rulesetFilepath,{ fs, fetch }); - spectral.setRuleset(rules); - var binded = {}; - await spectral.run(myDocument).then(results => { - binded.rules = spectral.ruleset.rules; - binded.results = results; - }); - return binded; -} +const linter = async (specFilePath, rulesetFilepath) => { + const myDocument = new Document( + fs.readFileSync(specFilePath, 'utf-8').trim(), + Parsers.Yaml, + 'openapi.yml' + ); + const spectral = new Spectral(); + var rules = await bundleAndLoadRuleset(rulesetFilepath, { fs, fetch }); + spectral.setRuleset(rules); + var binded = {}; + await spectral.run(myDocument).then(results => { + binded.rules = spectral.ruleset.rules; + binded.results = results; + }); + return binded; +}; exports.validator = () => { - const validate = async (specFilePath, ruleSetFilePath) => { - var ret = {}; - await linter(specFilePath, ruleSetFilePath).then(linterResult => { - ret = linterResult; - }); - return ret; - }; - return ( - validate - ); -} - - + const validate = async (specFilePath, ruleSetFilePath) => { + var ret = {}; + await linter(specFilePath, ruleSetFilePath).then(linterResult => { + ret = linterResult; + }); + return ret; + }; + return validate; +}; diff --git a/api-linter/src/index.js b/api-linter/src/index.js index 88d8054..0864a97 100755 --- a/api-linter/src/index.js +++ b/api-linter/src/index.js @@ -2,233 +2,239 @@ const fs = require('fs'); const path = require('path'); -const {join} = require('path'); -const process = require('process') +const { join } = require('path'); +const process = require('process'); const spectralCore = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); const spectralRuntime = require('@stoplight/spectral-runtime'); const { resolver } = require('@stoplight/spectral-ref-resolver'); -const {DiagnosticSeverity} = require('@stoplight/types'); -const {bundleAndLoadRuleset} = require('@stoplight/spectral-ruleset-bundler/with-loader'); +const { DiagnosticSeverity } = require('@stoplight/types'); +const { bundleAndLoadRuleset } = require('@stoplight/spectral-ruleset-bundler/with-loader'); const Handlebars = require('handlebars'); const Underscore = require('underscore'); -const {argument} = require('./argument'); +const { argument } = require('./argument'); const fetch = spectralRuntime; -const {Spectral, Document} = spectralCore; -const {specPath, rulesetPath, failSeverity, consoleSeverity, outputFilename, jsonFile,resolve: resolveRefs } = argument(); +const { Spectral, Document } = spectralCore; +const { + specPath, + rulesetPath, + failSeverity, + consoleSeverity, + outputFilename, + jsonFile, + resolve: resolveRefs +} = argument(); const yaml = require('js-yaml'); var reportFileName = outputFilename; -if (!outputFilename.endsWith(".html")){ - reportFileName = reportFileName + ".html"; +if (!outputFilename.endsWith('.html')) { + reportFileName = reportFileName + '.html'; } -const fileExists = (filepath) => { - return fs.existsSync(path.join(filepath)); -} +const fileExists = filepath => { + return fs.existsSync(path.join(filepath)); +}; -const loadFile = (filepath) => { - return fs.readFileSync(path.join(filepath), { encoding: "utf8" }); -} +const loadFile = filepath => { + return fs.readFileSync(path.join(filepath), { encoding: 'utf8' }); +}; const writeToFile = (data, filename) => { - fs.writeFileSync(path.join(filename), data, { encoding: "utf8" }); -} + fs.writeFileSync(path.join(filename), data, { encoding: 'utf8' }); +}; const specFilePath = path.resolve(specPath); -if (!fileExists(specFilePath)){ - throw Error(`Unable to resolve spec file path ${specFilePath}`); +if (!fileExists(specFilePath)) { + throw Error(`Unable to resolve spec file path ${specFilePath}`); } for (const filepath of rulesetPath) { - const abs_filepath = path.resolve(filepath) - if (!fileExists(abs_filepath)){ - throw Error(`Unable to resolve ruleset file path ${abs_filepath}`); - } + const abs_filepath = path.resolve(filepath); + if (!fileExists(abs_filepath)) { + throw Error(`Unable to resolve ruleset file path ${abs_filepath}`); + } } const formatJSON = (rules, results) => { - const severityMap = getSeverityMap(); - var totalRuleCount = 0; - var enabledCount = 0; - var data = []; - var index = 0; - for (const key in rules){ - var rule = rules[key]; - var ruleResult = {}; - ruleResult.ruleName = rule.name; - ruleResult.ruleDescription = rule.description; - ruleResult.documentUrl = rule.documentationUrl; - ruleResult.details = []; - ruleResult.severity = rule.severity; - ruleResult.hasDetails = false; - if (rule.enabled){ - ruleResult.success = true; - ruleResult.enabled = true; - ruleResult.class = "table-success"; - ruleResult.message = "success"; - ruleResult.index = index; - enabledCount++; - index++; - data.push(ruleResult); - totalRuleCount++; - } + const severityMap = getSeverityMap(); + var totalRuleCount = 0; + var enabledCount = 0; + var data = []; + var index = 0; + for (const key in rules) { + var rule = rules[key]; + var ruleResult = {}; + ruleResult.ruleName = rule.name; + ruleResult.ruleDescription = rule.description; + ruleResult.documentUrl = rule.documentationUrl; + ruleResult.details = []; + ruleResult.severity = rule.severity; + ruleResult.hasDetails = false; + if (rule.enabled) { + ruleResult.success = true; + ruleResult.enabled = true; + ruleResult.class = 'table-success'; + ruleResult.message = 'success'; + ruleResult.index = index; + enabledCount++; + index++; + data.push(ruleResult); + totalRuleCount++; } - var newResults = []; - results.forEach( o => { - let newObj = {}; - newObj.line = (o.range.start.line + 1) + ":" + (o.range.start.character + 1); - newObj.severity = severityMap[o.severity]; - newObj.code = o.code; - newObj.message = o.message; - newObj.path = o.path.join("_"); - newResults.push(newObj); - for (const ruleResult of data){ - if (ruleResult.ruleName == o.code){ - ruleResult.success = false; - if (newObj.severity == "error"){ - ruleResult.class = "table-danger"; - } - else if (newObj.severity == "warn"){ - ruleResult.class = "table-warning"; - } - else { - ruleResult.class = "table-info"; - } - ruleResult.message = (ruleResult.details.length + 1) + " " + newObj.severity; - if (ruleResult.details.length > 0){ - ruleResult.message = ruleResult.message + "s"; - } - ruleResult.hasDetails = true; - ruleResult.details.push(newObj); - break; - } + } + var newResults = []; + results.forEach(o => { + let newObj = {}; + newObj.line = o.range.start.line + 1 + ':' + (o.range.start.character + 1); + newObj.severity = severityMap[o.severity]; + newObj.code = o.code; + newObj.message = o.message; + newObj.path = o.path.join('_'); + newResults.push(newObj); + for (const ruleResult of data) { + if (ruleResult.ruleName == o.code) { + ruleResult.success = false; + if (newObj.severity == 'error') { + ruleResult.class = 'table-danger'; + } else if (newObj.severity == 'warn') { + ruleResult.class = 'table-warning'; + } else { + ruleResult.class = 'table-info'; } - }); - let jsonResult = { - "data": data, - "timestamp": new Date().toLocaleString(), - }; - let severityDist = Underscore.countBy(newResults, "severity"); - jsonResult.messageCount = results.length; - jsonResult.errorCount = severityDist.error || 0; - jsonResult.warnCount = severityDist.warn || 0; - jsonResult.infoCount = severityDist.info || 0; - jsonResult.hintCount = severityDist.hint || 0; - jsonResult.totalCount = totalRuleCount || 0; - jsonResult.enabledCount = enabledCount || 0; - return jsonResult; -} + ruleResult.message = ruleResult.details.length + 1 + ' ' + newObj.severity; + if (ruleResult.details.length > 0) { + ruleResult.message = ruleResult.message + 's'; + } + ruleResult.hasDetails = true; + ruleResult.details.push(newObj); + break; + } + } + }); + let jsonResult = { + 'data': data, + 'timestamp': new Date().toLocaleString() + }; + let severityDist = Underscore.countBy(newResults, 'severity'); + jsonResult.messageCount = results.length; + jsonResult.errorCount = severityDist.error || 0; + jsonResult.warnCount = severityDist.warn || 0; + jsonResult.infoCount = severityDist.info || 0; + jsonResult.hintCount = severityDist.hint || 0; + jsonResult.totalCount = totalRuleCount || 0; + jsonResult.enabledCount = enabledCount || 0; + return jsonResult; +}; const getSeverityMap = () => { - const severityMap = {}; - severityMap[DiagnosticSeverity.Error] = "error"; - severityMap[DiagnosticSeverity.Warning] = "warn"; - severityMap[DiagnosticSeverity.Information] = "info"; - severityMap[DiagnosticSeverity.Hint] = "hint"; - return severityMap; -} + const severityMap = {}; + severityMap[DiagnosticSeverity.Error] = 'error'; + severityMap[DiagnosticSeverity.Warning] = 'warn'; + severityMap[DiagnosticSeverity.Information] = 'info'; + severityMap[DiagnosticSeverity.Hint] = 'hint'; + return severityMap; +}; -const mapSeverity = (severity) => { - var severityValue = DiagnosticSeverity.Error; - switch(severity) - { - case "error": - severityValue = DiagnosticSeverity.Error; - break; - case "warn": - severityValue = DiagnosticSeverity.Warning; - break; - case "info": - severityValue = DiagnosticSeverity.Information; - break; - case "hint": - severityValue = DiagnosticSeverity.Hint; - break; - default: - break; - } - return severityValue; -} +const mapSeverity = severity => { + var severityValue = DiagnosticSeverity.Error; + switch (severity) { + case 'error': + severityValue = DiagnosticSeverity.Error; + break; + case 'warn': + severityValue = DiagnosticSeverity.Warning; + break; + case 'info': + severityValue = DiagnosticSeverity.Information; + break; + case 'hint': + severityValue = DiagnosticSeverity.Hint; + break; + default: + break; + } + return severityValue; +}; -const generateReport = (jsonObj) => { - let htmlStr = loadFile(join(__dirname, "/templates/template.html")); - Handlebars.registerHelper("inc", (val) => { - return parseInt(val) + 1; - }); - let template = Handlebars.compile(htmlStr); - let data = template(jsonObj); - writeToFile(data, reportFileName); -} +const generateReport = jsonObj => { + let htmlStr = loadFile(join(__dirname, '/templates/template.html')); + Handlebars.registerHelper('inc', val => { + return parseInt(val) + 1; + }); + let template = Handlebars.compile(htmlStr); + let data = template(jsonObj); + writeToFile(data, reportFileName); +}; -const linter = async (specFilePath, rulesetPath, followRefs) => { - const myDocument = new Document( - fs.readFileSync(specFilePath, "utf-8").trim(), - Parsers.Yaml, - specFilePath - ); - - const spectral = new Spectral( { resolver } ); - var tempFilePath = ""; - var isMultiRuleFiles = false; - - if (rulesetPath.length > 1) { - isMultiRuleFiles = true; - const masterRulesetContent = { - extends: rulesetPath.map(file => path.resolve(file)), - }; - const contentString = yaml.dump(masterRulesetContent, { indent: 2 }); - const tempDir = process.cwd(); - const tempFileName = `.spectral-${Date.now()}.yaml`; - tempFilePath = path.join(tempDir, tempFileName); - fs.writeFileSync(tempFilePath, contentString, 'utf8'); - } - else { - tempFilePath = path.resolve(rulesetPath[0]); - } - spectral.setRuleset(await bundleAndLoadRuleset(tempFilePath, { fs, fetch })); - var binded = {}; - - const runPromise = followRefs - ? spectral.run(myDocument, { resolve: true }) - : spectral.run(myDocument); - - await runPromise.then(results => { - binded.rules = spectral.ruleset.rules; - binded.results = results; - }); - - try { - if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { - fs.unlinkSync(tempFilePath); - } - } catch (cleanupErr) { - console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); +const linter = async (specFilePath, rulesetPath, followRefs) => { + const myDocument = new Document( + fs.readFileSync(specFilePath, 'utf-8').trim(), + Parsers.Yaml, + specFilePath + ); + + const spectral = new Spectral({ resolver }); + var tempFilePath = ''; + var isMultiRuleFiles = false; + + if (rulesetPath.length > 1) { + isMultiRuleFiles = true; + const masterRulesetContent = { + extends: rulesetPath.map(file => path.resolve(file)) + }; + const contentString = yaml.dump(masterRulesetContent, { indent: 2 }); + const tempDir = process.cwd(); + const tempFileName = `.spectral-${Date.now()}.yaml`; + tempFilePath = path.join(tempDir, tempFileName); + fs.writeFileSync(tempFilePath, contentString, 'utf8'); + } else { + tempFilePath = path.resolve(rulesetPath[0]); + } + spectral.setRuleset(await bundleAndLoadRuleset(tempFilePath, { fs, fetch })); + var binded = {}; + + const runPromise = followRefs + ? spectral.run(myDocument, { resolve: true }) + : spectral.run(myDocument); + + await runPromise.then(results => { + binded.rules = spectral.ruleset.rules; + binded.results = results; + }); + + try { + if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { + fs.unlinkSync(tempFilePath); } - - return binded; -} + } catch (cleanupErr) { + console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); + } + + return binded; +}; const severeEnoughToFail = (results, failSeverity) => { - const diagnosticSeverity = mapSeverity(failSeverity); - return results.some(r => r.severity <= diagnosticSeverity); -} + const diagnosticSeverity = mapSeverity(failSeverity); + return results.some(r => r.severity <= diagnosticSeverity); +}; const consoleMsgPart = (results, consoleSeverity) => { - const diagnosticSeverity = mapSeverity(consoleSeverity); - return results.filter(r => r.severity <= diagnosticSeverity).sort((a, b) => a.severity - b.severity); -} + const diagnosticSeverity = mapSeverity(consoleSeverity); + return results + .filter(r => r.severity <= diagnosticSeverity) + .sort((a, b) => a.severity - b.severity); +}; const getSeverityMsgMap = () => { - const severityMap = {}; - severityMap[DiagnosticSeverity.Error] = "Error"; - severityMap[DiagnosticSeverity.Warning] = "Warning"; - severityMap[DiagnosticSeverity.Information] = "Information"; - severityMap[DiagnosticSeverity.Hint] = "Hint"; - return severityMap; -} + const severityMap = {}; + severityMap[DiagnosticSeverity.Error] = 'Error'; + severityMap[DiagnosticSeverity.Warning] = 'Warning'; + severityMap[DiagnosticSeverity.Information] = 'Information'; + severityMap[DiagnosticSeverity.Hint] = 'Hint'; + return severityMap; +}; const resolveRuleDependencyResult = (rules, results) => { const dependsOnMap = {}; @@ -287,43 +293,46 @@ const resolveRuleDependencyResult = (rules, results) => { }; linter(specFilePath, rulesetPath, resolveRefs).then(linterResult => { - const spectralResult = resolveRuleDependencyResult(linterResult.rules, linterResult.results); - - const spectralReport = path.resolve(jsonFile); - fs.writeFileSync(spectralReport, JSON.stringify(spectralResult), { encoding: "utf8" }); - - const jsonResult = formatJSON(linterResult.rules, spectralResult); - generateReport(jsonResult); - const reportFilePath = path.resolve(reportFileName); - const isErrorSeverity = mapSeverity(failSeverity) === DiagnosticSeverity.Error; - const failed = severeEnoughToFail(spectralResult, failSeverity); - const consolePart = consoleMsgPart(spectralResult, consoleSeverity); - const consoleMsg = consolePart.map(error=> + const spectralResult = resolveRuleDependencyResult(linterResult.rules, linterResult.results); + + const spectralReport = path.resolve(jsonFile); + fs.writeFileSync(spectralReport, JSON.stringify(spectralResult), { encoding: 'utf8' }); + + const jsonResult = formatJSON(linterResult.rules, spectralResult); + generateReport(jsonResult); + const reportFilePath = path.resolve(reportFileName); + const isErrorSeverity = mapSeverity(failSeverity) === DiagnosticSeverity.Error; + const failed = severeEnoughToFail(spectralResult, failSeverity); + const consolePart = consoleMsgPart(spectralResult, consoleSeverity); + const consoleMsg = consolePart + .map( + error => `-------------------------------------------------- ${getSeverityMsgMap()[error.severity]}: Line: [${error.range.start.line}:${error.range.start.character}-${error.range.end.line}:${error.range.end.character}] Path: [${error.path.join('.')}] -Desc: [${error.code} ${error.message} ]`).join('\n'); - if (failed) - { - - process.stdout.write( - `Results with severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + - consoleMsg + - `\n-------------------------------------------------- -Detailed report: ` + reportFilePath + '\n', - ); - process.exit(1); - } - else { - process.stdout.write( - `No results with a severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + - consoleMsg + - `\n-------------------------------------------------- -Detailed report: ` + reportFilePath + '\n', - ); - process.exit(0); - } +Desc: [${error.code} ${error.message} ]` + ) + .join('\n'); + if (failed) { + process.stdout.write( + `Results with severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + + consoleMsg + + `\n-------------------------------------------------- +Detailed report: ` + + reportFilePath + + '\n' + ); + process.exit(1); + } else { + process.stdout.write( + `No results with a severity of '${failSeverity}' ${isErrorSeverity ? '' : 'or higher '}found!\n` + + consoleMsg + + `\n-------------------------------------------------- +Detailed report: ` + + reportFilePath + + '\n' + ); + process.exit(0); + } }); - - diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index 36a141b..d21d787 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -1,161 +1,178 @@ - + - - + Siemens Xcelerator-API Linter Report - - + + - - + +
-
-

Siemens API Linter Report

-
-
-
-
+
+

Siemens API Linter Report

+
+
+
+
-
-
Total Rules Count: {{this.enabledCount}}
-
+
+
Total Rules Count: {{ this.enabledCount }}
+
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SeverityProblems
Errors{{this.errorCount}}
Warnings{{this.warnCount}}
Info{{this.infoCount}}
Hints{{this.hintCount}}
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SeverityProblems
Errors{{ this.errorCount }}
Warnings{{ this.warnCount }}
Info{{ this.infoCount }}
Hints{{ this.hintCount }}
+
-
-

Detailed report

-
- -
- - - - {{#each this.data}} - - - - - {{#if hasDetails}} - - {{else}} - - {{/if}} +
+

Detailed report

+
+ +
+
+ + + {{#each this.data}} + + + + + {{#if hasDetails}} + + {{else}} + + {{/if}} + + + +
+ {{#if hasDetails}} + + + + + + + + - - + + + {{#each details}} + + + + + + - {{/each}} - -
#LineSeverityPathmessage
- {{#if hasDetails}} - - - - - - - - - - - - {{#each details}} - - - - - - {{/each}} - -
#LineSeverityPathmessage
{{inc @index}} - {{line}}{{severity}}{{path}}{{message}} -
- {{/if}} -
{{inc @index}}{{ line }}{{ severity }}{{ path }}{{ message }}
- +
+ {{/if}} + + + + {{/each}} + + +
- - - \ No newline at end of file + }); + + + + diff --git a/api-linter/test/api-commonops.test.js b/api-linter/test/api-commonops.test.js index 6f148eb..8e072f9 100644 --- a/api-linter/test/api-commonops.test.js +++ b/api-linter/test/api-commonops.test.js @@ -1,123 +1,127 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyInfos } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyErrors, + assertOnlyInfos +} = require('./base.js'); const path = 'commonops/'; -const rulesetPath = "test/testdata/commonops/.spectral.yml"; +const rulesetPath = 'test/testdata/commonops/.spectral.yml'; test('A Successful fetch of individual resources MUST return the status code 200', async () => { - const specFilePath = getSpecFilePath(path, "800-1.yml"); + const specFilePath = getSpecFilePath(path, '800-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[800.1]"); + expect(errors[0].code).toBe('Siemens-API-[800.1]'); //Problem in line:29 assertOnlyErrors(results); }); -}) +}); test('A successful fetch of resource collection request MUST return a 2xx status code', async () => { - const specFilePath = getSpecFilePath(path, "800-2.yml"); + const specFilePath = getSpecFilePath(path, '800-2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[800.2]"); + expect(errors[0].code).toBe('Siemens-API-[800.2]'); //Problem in line:37 assertOnlyErrors(results); }); -}) +}); test('An API Provider MUST support fetching resource data for provided links', async () => { - const specFilePath = getSpecFilePath(path, "800-4.yml"); + const specFilePath = getSpecFilePath(path, '800-4.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[800.4]"); + expect(errors[0].code).toBe('Siemens-API-[800.4]'); //Problem in line:50 assertOnlyErrors(results); }); -}) +}); test('The POST request MUST include a single resource object as primary data', async () => { - const specFilePath = getSpecFilePath(path, "801.yml"); + const specFilePath = getSpecFilePath(path, '801.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[801]"); + expect(errors[0].code).toBe('Siemens-API-[801]'); //Problem in line:45-47 assertOnlyErrors(results); }); -}) +}); test('API MUST respond to successful POST creation request with 2xx success status code', async () => { - const specFilePath = getSpecFilePath(path, "801-4.yml"); + const specFilePath = getSpecFilePath(path, '801-4.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[801.4]"); + expect(errors[0].code).toBe('Siemens-API-[801.4]'); //Problem in line:34 assertOnlyErrors(results); }); -}) +}); test('API MUST respond to successful PATCH update request with 2xx success status code', async () => { - const specFilePath = getSpecFilePath(path, "802-6.yml"); + const specFilePath = getSpecFilePath(path, '802-6.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[802.6]"); + expect(errors[0].code).toBe('Siemens-API-[802.6]'); //Problem in line:42 assertOnlyErrors(results); }); -}) +}); test('API MUST respond to successful PUT update request with 2xx success status code', async () => { - const specFilePath = getSpecFilePath(path, "803-2.yml"); + const specFilePath = getSpecFilePath(path, '803-2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[803.2]"); + expect(errors[0].code).toBe('Siemens-API-[803.2]'); //Problem in line:42 assertOnlyErrors(results); }); -}) +}); test('API MUST respond to successful DELETE request with 2xx success status code', async () => { - const specFilePath = getSpecFilePath(path, "804-1.yml"); + const specFilePath = getSpecFilePath(path, '804-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[804.1]"); + expect(errors[0].code).toBe('Siemens-API-[804.1]'); //Problem in line:37 assertOnlyErrors(results); }); -}) +}); test('The API consumer MAY use conditional header information to solve concurrent update requests', async () => { - const specFilePath = getSpecFilePath(path, "803-6.yml"); + const specFilePath = getSpecFilePath(path, '803-6.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[803.6]"); + expect(infos[0].code).toBe('Siemens-API-[803.6]'); //Problem in line:37-40 assertOnlyInfos(results); }); -}) - +}); diff --git a/api-linter/test/api-errors-refs.test.js b/api-linter/test/api-errors-refs.test.js index db05af4..896a916 100644 --- a/api-linter/test/api-errors-refs.test.js +++ b/api-linter/test/api-errors-refs.test.js @@ -4,14 +4,13 @@ const { Document } = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); // 👇 RE-ADD setupSpectral here -const { setupSpectral } = - require('@jamietanna/spectral-test-harness'); +const { setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity } = require('./base.js'); const { resolver } = require('@stoplight/spectral-ref-resolver'); const path = require('path'); -const rulesetPath = 'test/testdata/refs/.spectral.yml'; +const rulesetPath = 'test/testdata/refs/.spectral.yml'; const specFilePath = path.join(__dirname, 'testdata/refs', '300.yml'); // ABSOLUTE test('API MUST use official HTTP status codes as intended', async () => { @@ -20,16 +19,13 @@ test('API MUST use official HTTP status codes as intended', async () => { const spectral = await setupSpectral(rulesetPath, { resolver }); /* ── Document with correct source (real path!) ── */ - const raw = fs.readFileSync(specFilePath, 'utf8'); + const raw = fs.readFileSync(specFilePath, 'utf8'); const document = new Document(raw, Parsers.Yaml, specFilePath); // … but give it the real filename so $ref resolution works document.source = specFilePath; // ───────────── act ───────────── - const results = await spectral.run( - document, - { resolve: { external: true } } - ); + const results = await spectral.run(document, { resolve: { external: true } }); // ───────────── assert ───────────── const errors = resultsForSeverity(results, 'Error'); diff --git a/api-linter/test/api-errors.test.js b/api-linter/test/api-errors.test.js index 4cf0453..3efea36 100644 --- a/api-linter/test/api-errors.test.js +++ b/api-linter/test/api-errors.test.js @@ -1,85 +1,90 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyWarnings, assertOnlyInfos } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyWarnings, + assertOnlyInfos +} = require('./base.js'); const path = 'error/'; -const rulesetPath = "test/testdata/error/.spectral.yml"; +const rulesetPath = 'test/testdata/error/.spectral.yml'; test('API MUST use official HTTP status codes as intended', async () => { - const specFilePath = getSpecFilePath(path, "300.yml"); + const specFilePath = getSpecFilePath(path, '300.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[300]"); + expect(errors[0].code).toBe('Siemens-API-[300]'); //Problem in line:35-40 - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[301]"); + expect(warnings[0].code).toBe('Siemens-API-[301]'); }); -}) +}); test('SHOULD only use most common HTTP status codes', async () => { - const specFilePath = getSpecFilePath(path, "301.yml"); + const specFilePath = getSpecFilePath(path, '301.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { //Problem in line:35-40 - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[301]"); + expect(warnings[0].code).toBe('Siemens-API-[301]'); assertOnlyWarnings(results); }); -}) +}); - test('SHOULD use the most specific HTTP status code when returning errors', async () => { - const specFilePath = getSpecFilePath(path, "302.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - //Problem in line:130 - const warnings = resultsForSeverity(results, "Warning"); - expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[302]"); - assertOnlyWarnings(results); - }); - }) +test('SHOULD use the most specific HTTP status code when returning errors', async () => { + const specFilePath = getSpecFilePath(path, '302.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:130 + const warnings = resultsForSeverity(results, 'Warning'); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe('Siemens-API-[302]'); + assertOnlyWarnings(results); + }); +}); - test('Error object SHOULD be represented according to the defined structure fields', async () => { - const specFilePath = getSpecFilePath(path, "305.1.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - //Problem in line:110 - const warnings = resultsForSeverity(results, "Warning"); - expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[305]-1"); - assertOnlyWarnings(results); - }); - }) +test('Error object SHOULD be represented according to the defined structure fields', async () => { + const specFilePath = getSpecFilePath(path, '305.1.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:110 + const warnings = resultsForSeverity(results, 'Warning'); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe('Siemens-API-[305]-1'); + assertOnlyWarnings(results); + }); +}); - test('The error links resource object MAY contain the members: about, type', async () => { - const specFilePath = getSpecFilePath(path, "305.2.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - //Problem in line:114-117 - const infos = resultsForSeverity(results, "Information"); - expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[305]-2"); - assertOnlyInfos(results) - }); - }) +test('The error links resource object MAY contain the members: about, type', async () => { + const specFilePath = getSpecFilePath(path, '305.2.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:114-117 + const infos = resultsForSeverity(results, 'Information'); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe('Siemens-API-[305]-2'); + assertOnlyInfos(results); + }); +}); - test('The source object SHOULD include one of the members or be omitted: pointer, parameter, header', async () => { - const specFilePath = getSpecFilePath(path, "305.3.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - //Problem in line:114-117 - const warnings = resultsForSeverity(results, "Warning"); - expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[305]-3"); - assertOnlyWarnings(results); - }); - }) \ No newline at end of file +test('The source object SHOULD include one of the members or be omitted: pointer, parameter, header', async () => { + const specFilePath = getSpecFilePath(path, '305.3.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + //Problem in line:114-117 + const warnings = resultsForSeverity(results, 'Warning'); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe('Siemens-API-[305]-3'); + assertOnlyWarnings(results); + }); +}); diff --git a/api-linter/test/api-filtering.test.js b/api-linter/test/api-filtering.test.js index 25f01ce..a7e23bd 100644 --- a/api-linter/test/api-filtering.test.js +++ b/api-linter/test/api-filtering.test.js @@ -1,30 +1,35 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyInfos, assertOnlyHints } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyInfos, + assertOnlyHints +} = require('./base.js'); const path = 'filtering/'; -const rulesetPath = "test/testdata/filtering/.spectral.yml"; +const rulesetPath = 'test/testdata/filtering/.spectral.yml'; test('An API provider MAY NOT support more than 4 parameters at once for selecting resources', async () => { - const specFilePath = getSpecFilePath(path, "400.yml"); + const specFilePath = getSpecFilePath(path, '400.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const hints = resultsForSeverity(results, "Hint"); + const hints = resultsForSeverity(results, 'Hint'); expect(hints).toHaveLength(2); - expect(hints[0].code).toBe("Siemens-API-[400]"); - expect(hints[1].code).toBe("Siemens-API-[401]"); + expect(hints[0].code).toBe('Siemens-API-[400]'); + expect(hints[1].code).toBe('Siemens-API-[401]'); //Problem in line:29-62 assertOnlyHints(results); }); -}) +}); test('The query parameter filter SHOULD be used to filter or query data', async () => { - const specFilePath = getSpecFilePath(path, "401.yml"); + const specFilePath = getSpecFilePath(path, '401.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(0); assertOnlyInfos(results); }); -}) \ No newline at end of file +}); diff --git a/api-linter/test/api-linter-cli.test.js b/api-linter/test/api-linter-cli.test.js index 1fc1477..bb1e61b 100644 --- a/api-linter/test/api-linter-cli.test.js +++ b/api-linter/test/api-linter-cli.test.js @@ -1,60 +1,64 @@ -const path = require('path'); -const fs = require('fs'); -const { spawnSync } = require('child_process'); - -/* ─────────── paths used by both tests ─────────── */ -const cli = path.join(__dirname, '..', 'src', 'index.js'); -const ruleset = path.join(__dirname, 'testdata', 'refs', '.spectral.yml'); -const spec = path.join(__dirname, 'testdata', 'refs', '300.yml'); - -/* handy wrapper to invoke the CLI */ -function runLinter({ resolveFlag, reportFile }) { - const args = [ - cli, - '--specPath', spec, - '--rulesetPath', ruleset, - '--failSeverity','error', - '--outputFilename', reportFile - ]; - if (resolveFlag) args.push('--resolve'); - - return spawnSync('node', args, { encoding: 'utf8' }); -} - -describe('api-linter CLI external $ref behaviour', () => { - const reportWith = path.join(__dirname, 'tmp-report-resolve.html'); - const reportWithout = path.join(__dirname, 'tmp-report-no-resolve.html'); - - /* clean-up generated HTML files after the suite finished */ - afterAll(() => { - [reportWith, reportWithout].forEach(f => { - if (fs.existsSync(f)) fs.unlinkSync(f); - }); - }); - - test('with --resolve follows external refs (no invalid-ref)', () => { - const { status, stdout } = runLinter({ - resolveFlag: true, - reportFile: reportWith - }); - - /* exit-code still 1 because the real rule fires */ - expect(status).toBe(1); - expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present - expect(stdout).not.toMatch(/invalid-ref/); // resolver worked - expect(fs.existsSync(reportWith)).toBe(true); // report created - }); - - test('without --resolve produces invalid-ref error', () => { - const { status, stdout } = runLinter({ - resolveFlag: false, - reportFile: reportWithout - }); - - expect(status).toBe(1); - expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present - expect(stdout).toMatch(/Siemens-API-\[301]/); // rule present - expect(stdout).not.toMatch(/invalid-ref/); // Spectral never tried to search for external references - expect(fs.existsSync(reportWithout)).toBe(true); - }); -}); \ No newline at end of file +const path = require('path'); +const fs = require('fs'); +const { spawnSync } = require('child_process'); + +/* ─────────── paths used by both tests ─────────── */ +const cli = path.join(__dirname, '..', 'src', 'index.js'); +const ruleset = path.join(__dirname, 'testdata', 'refs', '.spectral.yml'); +const spec = path.join(__dirname, 'testdata', 'refs', '300.yml'); + +/* handy wrapper to invoke the CLI */ +function runLinter({ resolveFlag, reportFile }) { + const args = [ + cli, + '--specPath', + spec, + '--rulesetPath', + ruleset, + '--failSeverity', + 'error', + '--outputFilename', + reportFile + ]; + if (resolveFlag) args.push('--resolve'); + + return spawnSync('node', args, { encoding: 'utf8' }); +} + +describe('api-linter CLI external $ref behaviour', () => { + const reportWith = path.join(__dirname, 'tmp-report-resolve.html'); + const reportWithout = path.join(__dirname, 'tmp-report-no-resolve.html'); + + /* clean-up generated HTML files after the suite finished */ + afterAll(() => { + [reportWith, reportWithout].forEach(f => { + if (fs.existsSync(f)) fs.unlinkSync(f); + }); + }); + + test('with --resolve follows external refs (no invalid-ref)', () => { + const { status, stdout } = runLinter({ + resolveFlag: true, + reportFile: reportWith + }); + + /* exit-code still 1 because the real rule fires */ + expect(status).toBe(1); + expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present + expect(stdout).not.toMatch(/invalid-ref/); // resolver worked + expect(fs.existsSync(reportWith)).toBe(true); // report created + }); + + test('without --resolve produces invalid-ref error', () => { + const { status, stdout } = runLinter({ + resolveFlag: false, + reportFile: reportWithout + }); + + expect(status).toBe(1); + expect(stdout).toMatch(/Siemens-API-\[300]/); // rule present + expect(stdout).toMatch(/Siemens-API-\[301]/); // rule present + expect(stdout).not.toMatch(/invalid-ref/); // Spectral never tried to search for external references + expect(fs.existsSync(reportWithout)).toBe(true); + }); +}); diff --git a/api-linter/test/api-mediatype.test.js b/api-linter/test/api-mediatype.test.js index 262c5df..94deb46 100644 --- a/api-linter/test/api-mediatype.test.js +++ b/api-linter/test/api-mediatype.test.js @@ -1,114 +1,117 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyWarnings, assertOnlyInfos } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyErrors, + assertOnlyWarnings, + assertOnlyInfos +} = require('./base.js'); const path = 'mediatype/'; -const rulesetPath = "test/testdata/mediatype/.spectral.yml"; +const rulesetPath = 'test/testdata/mediatype/.spectral.yml'; test('Siemens Xcelerator recommends the media type application/json for exchanging data.', async () => { - const specFilePath = getSpecFilePath(path, "100.yml"); + const specFilePath = getSpecFilePath(path, '100.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[100]"); + expect(infos[0].code).toBe('Siemens-API-[100]'); //Problem in line:32 assertOnlyInfos(results); }); -}) +}); test('The root of every document SHOULD contain a JSON object', async () => { - const specFilePath = getSpecFilePath(path, "101-1.yml"); + const specFilePath = getSpecFilePath(path, '101-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[101.1]"); + expect(warnings[0].code).toBe('Siemens-API-[101.1]'); //Problem in line:38 assertOnlyWarnings(results); }); -}) +}); test('A response document SHOULD contain at least one of the following:data,error,meta,links.', async () => { - const specFilePath = getSpecFilePath(path, "101-2.1.yml"); + const specFilePath = getSpecFilePath(path, '101-2.1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[101.2]-1"); + expect(warnings[0].code).toBe('Siemens-API-[101.2]-1'); //Problem in line:40-42, properties should contain at least one of data,error,meta,links assertOnlyWarnings(results); }); -}) +}); test('A request document SHOULD contain at least data', async () => { - const specFilePath = getSpecFilePath(path, "101-2.2.yml"); + const specFilePath = getSpecFilePath(path, '101-2.2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[101.2]-2"); + expect(warnings[0].code).toBe('Siemens-API-[101.2]-2'); //Problem in line:45-47, properties should contain at least data assertOnlyWarnings(results); }); -}) +}); test('The data type MUST be compliant with the types defined', async () => { - const specFilePath = getSpecFilePath(path, "101-4-1.yml"); + const specFilePath = getSpecFilePath(path, '101-4-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[101.4.1]"); + expect(errors[0].code).toBe('Siemens-API-[101.4.1]'); //Problem in line:87, should be one of boolean|object|array|integer|number|string assertOnlyErrors(results); }); -}) +}); test('A meta object SHOULD be used to represent meta information as a JSON object', async () => { - const specFilePath = getSpecFilePath(path, "101-7-2.yml"); + const specFilePath = getSpecFilePath(path, '101-7-2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[101.7.2]"); + expect(errors[0].code).toBe('Siemens-API-[101.7.2]'); //Problem in line:77, should be type: object - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[101.7]"); + expect(infos[0].code).toBe('Siemens-API-[101.7]'); }); -}) +}); test('Field names SHOULD use lower camel case', async () => { - const specFilePath = getSpecFilePath(path, "101-8.yml"); + const specFilePath = getSpecFilePath(path, '101-8.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[101.8]"); + expect(warnings[0].code).toBe('Siemens-API-[101.8]'); //Problem in line:68, should be addressDetail assertOnlyWarnings(results); }); -}) +}); test('Resource names SHOULD be in lowercase with hyphen', async () => { - const specFilePath = getSpecFilePath(path, "101-9.yml"); + const specFilePath = getSpecFilePath(path, '101-9.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[101.9]"); - //Problem in line:20, should be room-details + expect(warnings[0].code).toBe('Siemens-API-[101.9]'); + //Problem in line:20, should be room-details assertOnlyWarnings(results); }); -}) - - - +}); diff --git a/api-linter/test/api-pagination.test.js b/api-linter/test/api-pagination.test.js index 5d9dfa5..c27fd1f 100644 --- a/api-linter/test/api-pagination.test.js +++ b/api-linter/test/api-pagination.test.js @@ -1,102 +1,107 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyInfos, assertOnlyHints } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyInfos, + assertOnlyHints +} = require('./base.js'); const path = 'pagination/'; -const rulesetPath = "test/testdata/pagination/.spectral.yml"; +const rulesetPath = 'test/testdata/pagination/.spectral.yml'; test('A server MAY provide links to traverse a paginated data set', async () => { - const specFilePath = getSpecFilePath(path, "600.1.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); - expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[600]-1"); - assertOnlyInfos(results); - }); - }) + const specFilePath = getSpecFilePath(path, '600.1.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, 'Information'); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe('Siemens-API-[600]-1'); + assertOnlyInfos(results); + }); +}); test('Pagination links SHOULD appear in the top-level links object.', async () => { - const specFilePath = getSpecFilePath(path, "600.2.yml"); + const specFilePath = getSpecFilePath(path, '600.2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[600]-2"); - const infos = resultsForSeverity(results, "Information"); + expect(warnings[0].code).toBe('Siemens-API-[600]-2'); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[600]-1"); + expect(infos[0].code).toBe('Siemens-API-[600]-1'); }); -}) +}); test('Naming convention MUST be used for pagination keys.', async () => { - const specFilePath = getSpecFilePath(path, "600.3.yml"); + const specFilePath = getSpecFilePath(path, '600.3.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const hints = resultsForSeverity(results, "Hint"); + const hints = resultsForSeverity(results, 'Hint'); expect(hints).toHaveLength(1); - expect(hints[0].code).toBe("Siemens-API-[600]-3"); + expect(hints[0].code).toBe('Siemens-API-[600]-3'); assertOnlyHints(results); }); -}) +}); test('Pagination SHOULD be implemented using query parameters.', async () => { - const specFilePath = getSpecFilePath(path, "601.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); - expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[601]"); - }); -}) + const specFilePath = getSpecFilePath(path, '601.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const warnings = resultsForSeverity(results, 'Warning'); + expect(warnings).toHaveLength(1); + expect(warnings[0].code).toBe('Siemens-API-[601]'); + }); +}); test('Server MAY provide pagination meta information to the client [601.1.1].', async () => { - const specFilePath = getSpecFilePath(path, "601-1-1.yml"); + const specFilePath = getSpecFilePath(path, '601-1-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[601.1.1]"); + expect(infos[0].code).toBe('Siemens-API-[601.1.1]'); assertOnlyInfos(results); }); -}) +}); test('Server MAY provide pagination meta information to the client [601.2.1].', async () => { - const specFilePath = getSpecFilePath(path, "601-2-1.yml"); + const specFilePath = getSpecFilePath(path, '601-2-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[601.2.1]"); + expect(infos[0].code).toBe('Siemens-API-[601.2.1]'); assertOnlyInfos(results); }); -}) +}); test('Server MAY provide pagination meta information to the client [601.3.1].', async () => { - const specFilePath = getSpecFilePath(path, "601-3-1.1.yml"); + const specFilePath = getSpecFilePath(path, '601-3-1.1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[601.3.1]-1"); + expect(infos[0].code).toBe('Siemens-API-[601.3.1]-1'); assertOnlyInfos(results); }); -}) +}); test('Server MAY provide pagination meta information to the client [601.3.1].', async () => { - const specFilePath = getSpecFilePath(path, "601-3-1.2.yml"); + const specFilePath = getSpecFilePath(path, '601-3-1.2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[601.3.1]-2"); + expect(infos[0].code).toBe('Siemens-API-[601.3.1]-2'); assertOnlyInfos(results); }); -}) \ No newline at end of file +}); diff --git a/api-linter/test/api-security.test.js b/api-linter/test/api-security.test.js index 44a9ee5..d4136ec 100644 --- a/api-linter/test/api-security.test.js +++ b/api-linter/test/api-security.test.js @@ -1,49 +1,49 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyErrors } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { resultsForSeverity, getSpecFilePath, assertOnlyErrors } = require('./base.js'); const path = 'security/'; -const rulesetPath = "test/testdata/security/.spectral.yml"; +const rulesetPath = 'test/testdata/security/.spectral.yml'; test('No security problem test 1', async () => { global.apiSecurity = 'y'; - const specFilePath = getSpecFilePath(path, "valid.yml"); + const specFilePath = getSpecFilePath(path, 'valid.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { expect(results).toHaveLength(0); }); -}) +}); test('No security problem test 2', async () => { global.apiSecurity = 'n'; - const specFilePath = getSpecFilePath(path, "invalid.yml"); + const specFilePath = getSpecFilePath(path, 'invalid.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { expect(results).toHaveLength(0); }); -}) +}); test('No security problem test 3', async () => { global.apiSecurity = 'n'; - const specFilePath = getSpecFilePath(path, "invalid.yml"); + const specFilePath = getSpecFilePath(path, 'invalid.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { expect(results).toHaveLength(0); }); -}) +}); test('Has security problem test', async () => { global.apiSecurity = 'y'; - const specFilePath = getSpecFilePath(path, "invalid.yml"); + const specFilePath = getSpecFilePath(path, 'invalid.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { expect(results).toHaveLength(1); - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-Security"); + expect(errors[0].code).toBe('Siemens-API-Security'); assertOnlyErrors(results); }); -}) \ No newline at end of file +}); diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js index fc5c0fa..65b553f 100644 --- a/api-linter/test/api-sparse-fieldsets.test.js +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -1,17 +1,17 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require('./base.js'); const path = 'fields/'; -const rulesetPath = "test/testdata/fields/.spectral.yml"; +const rulesetPath = 'test/testdata/fields/.spectral.yml'; test('API MAY provide projection of fieldset in response', async () => { - const specFilePath = getSpecFilePath(path, "500.yml"); - const spectral = await setupSpectral(rulesetPath); - const document = retrieveDocument(specFilePath); - spectral.run(document).then(results => { - const infos = resultsForSeverity(results, "Information"); - expect(infos).toHaveLength(1); - expect(infos[0].code).toBe("Siemens-API-[500]"); - assertOnlyInfos(results); - }); - }) + const specFilePath = getSpecFilePath(path, '500.yml'); + const spectral = await setupSpectral(rulesetPath); + const document = retrieveDocument(specFilePath); + spectral.run(document).then(results => { + const infos = resultsForSeverity(results, 'Information'); + expect(infos).toHaveLength(1); + expect(infos[0].code).toBe('Siemens-API-[500]'); + assertOnlyInfos(results); + }); +}); diff --git a/api-linter/test/api-versioning.test.js b/api-linter/test/api-versioning.test.js index 002ecea..8fe6494 100644 --- a/api-linter/test/api-versioning.test.js +++ b/api-linter/test/api-versioning.test.js @@ -1,61 +1,66 @@ -const { retrieveDocument, setupSpectral} = require('@jamietanna/spectral-test-harness') -const {resultsForSeverity, getSpecFilePath, assertOnlyErrors, assertOnlyWarnings } = require("./base.js") +const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyErrors, + assertOnlyWarnings +} = require('./base.js'); const path = 'versioning/'; -const rulesetPath = "test/testdata/versioning/.spectral.yml"; +const rulesetPath = 'test/testdata/versioning/.spectral.yml'; test('Semantic versioning MUST be used to version individual APIs', async () => { global.apiVersioning = 'url'; - const specFilePath = getSpecFilePath(path, "semantic-versioning.yml"); + const specFilePath = getSpecFilePath(path, 'semantic-versioning.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Semantic-Versioning-[2.0.0]"); + expect(errors[0].code).toBe('Semantic-Versioning-[2.0.0]'); //Problem in line:35-40 assertOnlyErrors(results); }); -}) +}); test('The Major version number MUST be specified in the URI as a path segment', async () => { global.apiVersioning = 'url'; - const specFilePath = getSpecFilePath(path, "200-1.yml"); + const specFilePath = getSpecFilePath(path, '200-1.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[200.1]"); + expect(errors[0].code).toBe('Siemens-API-[200.1]'); //Problem in line:13 assertOnlyErrors(results); }); -}) +}); test('A request HTTP header e.g., Api-Version MUST be supported to allow client to specify the version.', async () => { global.apiVersioning = 'header'; - const specFilePath = getSpecFilePath(path, "200-2.yml"); + const specFilePath = getSpecFilePath(path, '200-2.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const errors = resultsForSeverity(results, "Error"); + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(1); - expect(errors[0].code).toBe("Siemens-API-[200.2]"); + expect(errors[0].code).toBe('Siemens-API-[200.2]'); //Problem in line:29 assertOnlyErrors(results); }); -}) +}); test("A header with full semantic version value SHOULD be returned in the response with 'Api-Version: ..'", async () => { global.apiVersioning = 'header'; - const specFilePath = getSpecFilePath(path, "201.yml"); + const specFilePath = getSpecFilePath(path, '201.yml'); const spectral = await setupSpectral(rulesetPath); const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe("Siemens-API-[201]"); + expect(warnings[0].code).toBe('Siemens-API-[201]'); //Problem in line:44 assertOnlyWarnings(results); }); -}) \ No newline at end of file +}); diff --git a/api-linter/test/base.js b/api-linter/test/base.js index ab06f82..1f0edf7 100644 --- a/api-linter/test/base.js +++ b/api-linter/test/base.js @@ -1,48 +1,48 @@ -const { DiagnosticSeverity } = require('@stoplight/types') +const { DiagnosticSeverity } = require('@stoplight/types'); -function resultsForSeverity (results, severity) { - return results.filter((r) => DiagnosticSeverity[r.severity] === severity) +function resultsForSeverity(results, severity) { + return results.filter(r => DiagnosticSeverity[r.severity] === severity); } -const assertOnlyErrors = (results) => { - const warnings = resultsForSeverity(results, "Warning"); +const assertOnlyErrors = results => { + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(0); - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(0); - const hints = resultsForSeverity(results, "Hint"); + const hints = resultsForSeverity(results, 'Hint'); expect(hints).toHaveLength(0); -} +}; -const assertOnlyWarnings = (results) => { - const errors = resultsForSeverity(results, "Error"); +const assertOnlyWarnings = results => { + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(0); - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(0); - const hints = resultsForSeverity(results, "Hint"); + const hints = resultsForSeverity(results, 'Hint'); expect(hints).toHaveLength(0); -} +}; -const assertOnlyInfos = (results) => { - const errors = resultsForSeverity(results, "Error"); +const assertOnlyInfos = results => { + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(0); - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(0); - const hints = resultsForSeverity(results, "Hint"); + const hints = resultsForSeverity(results, 'Hint'); expect(hints).toHaveLength(0); -} +}; -const assertOnlyHints = (results) => { - const errors = resultsForSeverity(results, "Error"); +const assertOnlyHints = results => { + const errors = resultsForSeverity(results, 'Error'); expect(errors).toHaveLength(0); - const warnings = resultsForSeverity(results, "Warning"); + const warnings = resultsForSeverity(results, 'Warning'); expect(warnings).toHaveLength(0); - const infos = resultsForSeverity(results, "Information"); + const infos = resultsForSeverity(results, 'Information'); expect(infos).toHaveLength(0); -} +}; const getSpecFilePath = (path, fileName) => { return path + fileName; -} +}; module.exports = { resultsForSeverity, @@ -51,4 +51,4 @@ module.exports = { assertOnlyWarnings, assertOnlyInfos, assertOnlyHints -} +}; diff --git a/api-linter/test/testdata/commonops/.spectral.yml b/api-linter/test/testdata/commonops/.spectral.yml index 3ea18f4..d030c07 100644 --- a/api-linter/test/testdata/commonops/.spectral.yml +++ b/api-linter/test/testdata/commonops/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-common-operation.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-common-operation.yml diff --git a/api-linter/test/testdata/commonops/800-1.yml b/api-linter/test/testdata/commonops/800-1.yml index 96c1ac5..11fd3a5 100644 --- a/api-linter/test/testdata/commonops/800-1.yml +++ b/api-linter/test/testdata/commonops/800-1.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': get: summary: Returns a Room description: | @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomReadResponse" + $ref: '#/components/schemas/RoomReadResponse' components: schemas: RoomReadResponse: @@ -41,19 +41,19 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -74,4 +74,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/commonops/800-2.yml b/api-linter/test/testdata/commonops/800-2.yml index 900a4f4..6a2ef71 100644 --- a/api-linter/test/testdata/commonops/800-2.yml +++ b/api-linter/test/testdata/commonops/800-2.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: Not-Api-Version in: header required: true @@ -34,14 +34,14 @@ paths: type: integer example: 1 responses: - "401": + '401': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -57,7 +57,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -65,12 +65,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -91,4 +91,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/commonops/800-4.yml b/api-linter/test/testdata/commonops/800-4.yml index 3bb3443..3907346 100644 --- a/api-linter/test/testdata/commonops/800-4.yml +++ b/api-linter/test/testdata/commonops/800-4.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': get: summary: Returns a Room description: | @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomReadResponse" + $ref: '#/components/schemas/RoomReadResponse' components: schemas: RoomReadResponse: @@ -41,19 +41,19 @@ components: properties: data: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: type: object properties: - href: + href: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -74,4 +74,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/commonops/801-4.yml b/api-linter/test/testdata/commonops/801-4.yml index 93614f4..2c42ee0 100644 --- a/api-linter/test/testdata/commonops/801-4.yml +++ b/api-linter/test/testdata/commonops/801-4.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms": + '/rooms': post: summary: Creates a Room description: | @@ -29,14 +29,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomCreationRequest" + $ref: '#/components/schemas/RoomCreationRequest' responses: - "301": + '301': description: Created content: application/json: schema: - $ref: "#/components/schemas/RoomCreationResponse" + $ref: '#/components/schemas/RoomCreationResponse' components: schemas: RoomCreationRequest: @@ -45,14 +45,14 @@ components: - data properties: data: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomBase: type: object description: Place where course lessons take place. @@ -73,16 +73,15 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - \ No newline at end of file + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/801.yml b/api-linter/test/testdata/commonops/801.yml index 5c7f2c9..524e4a2 100644 --- a/api-linter/test/testdata/commonops/801.yml +++ b/api-linter/test/testdata/commonops/801.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms": + '/rooms': post: summary: Creates a Room description: | @@ -29,14 +29,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomCreationRequest" + $ref: '#/components/schemas/RoomCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/RoomCreationResponse" + $ref: '#/components/schemas/RoomCreationResponse' components: schemas: RoomCreationRequest: @@ -45,14 +45,14 @@ components: - content properties: content: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomBase: type: object description: Place where course lessons take place. @@ -73,16 +73,15 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - \ No newline at end of file + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/802-6.yml b/api-linter/test/testdata/commonops/802-6.yml index 250625a..d5dd540 100644 --- a/api-linter/test/testdata/commonops/802-6.yml +++ b/api-linter/test/testdata/commonops/802-6.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': parameters: - name: id in: path @@ -37,14 +37,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateRequest" + $ref: '#/components/schemas/RoomUpdateRequest' responses: - "301": + '301': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateResponse" + $ref: '#/components/schemas/RoomUpdateResponse' components: schemas: RoomUpdateRequest: @@ -53,24 +53,24 @@ components: - data properties: data: - $ref: "#/components/schemas/Room" + $ref: '#/components/schemas/Room' RoomUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' Room: allOf: - required: - - id + - id - type: object properties: id: type: string example: 846650de-20fd-4197-867b-00ac7606cffd - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' RoomBase: type: object description: Place where course lessons take place. @@ -91,16 +91,15 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - \ No newline at end of file + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/803-2.yml b/api-linter/test/testdata/commonops/803-2.yml index 087bd2a..947945f 100644 --- a/api-linter/test/testdata/commonops/803-2.yml +++ b/api-linter/test/testdata/commonops/803-2.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': parameters: - name: id in: path @@ -42,14 +42,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateRequest" + $ref: '#/components/schemas/RoomUpdateRequest' responses: - "301": + '301': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateResponse" + $ref: '#/components/schemas/RoomUpdateResponse' components: schemas: RoomUpdateRequest: @@ -58,24 +58,24 @@ components: - data properties: data: - $ref: "#/components/schemas/Room" + $ref: '#/components/schemas/Room' RoomUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' Room: allOf: - required: - - id + - id - type: object properties: id: type: string example: 846650de-20fd-4197-867b-00ac7606cffd - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' RoomBase: type: object description: Place where course lessons take place. @@ -96,16 +96,15 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - \ No newline at end of file + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/803-6.yml b/api-linter/test/testdata/commonops/803-6.yml index e5608be..6b6cdca 100644 --- a/api-linter/test/testdata/commonops/803-6.yml +++ b/api-linter/test/testdata/commonops/803-6.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': parameters: - name: id in: path @@ -42,14 +42,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateRequest" + $ref: '#/components/schemas/RoomUpdateRequest' responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomUpdateResponse" + $ref: '#/components/schemas/RoomUpdateResponse' components: schemas: RoomUpdateRequest: @@ -58,24 +58,24 @@ components: - data properties: data: - $ref: "#/components/schemas/Room" + $ref: '#/components/schemas/Room' RoomUpdateResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' Room: allOf: - required: - - id + - id - type: object properties: id: type: string example: 846650de-20fd-4197-867b-00ac7606cffd - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' RoomBase: type: object description: Place where course lessons take place. @@ -96,16 +96,15 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - \ No newline at end of file + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/804-1.yml b/api-linter/test/testdata/commonops/804-1.yml index f6ba6a9..68c45cd 100644 --- a/api-linter/test/testdata/commonops/804-1.yml +++ b/api-linter/test/testdata/commonops/804-1.yml @@ -17,7 +17,7 @@ tags: Rooms describe the locations where lessons take place. A room can only be deleted when there are no related lessons. paths: - "/rooms/{id}": + '/rooms/{id}': parameters: - name: id in: path @@ -34,5 +34,5 @@ paths: tags: - Rooms responses: - "404": - description: No content \ No newline at end of file + '404': + description: No content diff --git a/api-linter/test/testdata/error/.spectral.yml b/api-linter/test/testdata/error/.spectral.yml index e0af132..693f77d 100644 --- a/api-linter/test/testdata/error/.spectral.yml +++ b/api-linter/test/testdata/error/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-error-reporting.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-error-reporting.yml diff --git a/api-linter/test/testdata/error/300.yml b/api-linter/test/testdata/error/300.yml index bb3751d..2e98e5c 100644 --- a/api-linter/test/testdata/error/300.yml +++ b/api-linter/test/testdata/error/300.yml @@ -26,18 +26,18 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" - "99": + $ref: '#/components/schemas/RoomsReadResponse' + '99': description: errors content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' components: schemas: RoomsReadResponse: @@ -49,7 +49,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -57,12 +57,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -83,7 +83,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -102,7 +102,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "99" + example: '99' code: type: string description: Unique identifier for this type of error. diff --git a/api-linter/test/testdata/error/301.yml b/api-linter/test/testdata/error/301.yml index 5cb0a6a..ad838a4 100644 --- a/api-linter/test/testdata/error/301.yml +++ b/api-linter/test/testdata/error/301.yml @@ -26,18 +26,18 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" - "423": + $ref: '#/components/schemas/RoomsReadResponse' + '423': description: errors content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' components: schemas: RoomsReadResponse: @@ -49,7 +49,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -57,12 +57,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -83,7 +83,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -102,7 +102,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "423" + example: '423' code: type: string description: Unique identifier for this type of error. diff --git a/api-linter/test/testdata/error/302.yml b/api-linter/test/testdata/error/302.yml index e1d453b..21f8468 100644 --- a/api-linter/test/testdata/error/302.yml +++ b/api-linter/test/testdata/error/302.yml @@ -26,14 +26,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' components: schemas: RoomsReadResponse: @@ -45,7 +45,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -53,12 +53,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -79,7 +79,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -98,7 +98,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "423" + example: '423' code: type: string description: Unique identifier for this type of error. @@ -117,17 +117,17 @@ components: content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' examples: Forbidden: - $ref: "#/components/examples/Forbidden" + $ref: '#/components/examples/Forbidden' examples: Forbidden: summary: forbidden value: errors: - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 - status: "421" + status: '421' code: forbidden title: Forbidden detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.1.yml b/api-linter/test/testdata/error/305.1.yml index 6486b27..6755635 100644 --- a/api-linter/test/testdata/error/305.1.yml +++ b/api-linter/test/testdata/error/305.1.yml @@ -26,14 +26,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' components: schemas: RoomsReadResponse: @@ -45,7 +45,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -53,12 +53,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -79,7 +79,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -98,7 +98,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "423" + example: '423' code: type: string description: Unique identifier for this type of error. @@ -117,17 +117,17 @@ components: content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' examples: Forbidden: - $ref: "#/components/examples/Forbidden" + $ref: '#/components/examples/Forbidden' examples: Forbidden: summary: forbidden value: errors: - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 - status: "403" + status: '403' code: forbidden title: Forbidden detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.2.yml b/api-linter/test/testdata/error/305.2.yml index 83cdc6d..215257a 100644 --- a/api-linter/test/testdata/error/305.2.yml +++ b/api-linter/test/testdata/error/305.2.yml @@ -26,14 +26,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' components: schemas: RoomsReadResponse: @@ -45,7 +45,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -53,12 +53,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -79,7 +79,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -98,7 +98,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "423" + example: '423' code: type: string description: Unique identifier for this type of error. @@ -114,26 +114,26 @@ components: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' responses: DefaultErrors: description: Standard errors content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' examples: Forbidden: - $ref: "#/components/examples/Forbidden" + $ref: '#/components/examples/Forbidden' examples: Forbidden: summary: forbidden value: errors: - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 - status: "403" + status: '403' code: forbidden title: Forbidden detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/error/305.3.yml b/api-linter/test/testdata/error/305.3.yml index f63fd75..e26a12c 100644 --- a/api-linter/test/testdata/error/305.3.yml +++ b/api-linter/test/testdata/error/305.3.yml @@ -26,14 +26,14 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' default: - $ref: "#/components/responses/DefaultErrors" + $ref: '#/components/responses/DefaultErrors' components: schemas: RoomsReadResponse: @@ -45,7 +45,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -53,12 +53,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -79,7 +79,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' Errors: type: object required: @@ -98,7 +98,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "404" + example: '404' code: type: string description: Unique identifier for this type of error. @@ -114,26 +114,26 @@ components: source: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4" + example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' responses: DefaultErrors: description: Standard errors content: application/json: schema: - $ref: "#/components/schemas/Errors" + $ref: '#/components/schemas/Errors' examples: Forbidden: - $ref: "#/components/examples/Forbidden" + $ref: '#/components/examples/Forbidden' examples: Forbidden: summary: forbidden value: errors: - id: 5fa91094-7caf-4ce7-85f5-25f7d883a7d4 - status: "403" + status: '403' code: forbidden title: Forbidden detail: The provided authorization means did not contain suitable permissions. diff --git a/api-linter/test/testdata/fields/.spectral.yml b/api-linter/test/testdata/fields/.spectral.yml index ae2fb30..ebf20ff 100644 --- a/api-linter/test/testdata/fields/.spectral.yml +++ b/api-linter/test/testdata/fields/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-sparse-fieldsets.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-sparse-fieldsets.yml diff --git a/api-linter/test/testdata/fields/500.yml b/api-linter/test/testdata/fields/500.yml index 130dcbf..b147888 100644 --- a/api-linter/test/testdata/fields/500.yml +++ b/api-linter/test/testdata/fields/500.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -48,14 +48,14 @@ paths: type: integer example: 1 responses: - "401": + '401': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -71,7 +71,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -79,12 +79,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -105,4 +105,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/filtering/.spectral.yml b/api-linter/test/testdata/filtering/.spectral.yml index 4ece15f..70c4034 100644 --- a/api-linter/test/testdata/filtering/.spectral.yml +++ b/api-linter/test/testdata/filtering/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-filtering.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-filtering.yml diff --git a/api-linter/test/testdata/filtering/400.yml b/api-linter/test/testdata/filtering/400.yml index 6691952..f57794b 100644 --- a/api-linter/test/testdata/filtering/400.yml +++ b/api-linter/test/testdata/filtering/400.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -61,14 +61,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -84,7 +84,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -92,12 +92,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -118,4 +118,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/filtering/401.yml b/api-linter/test/testdata/filtering/401.yml index f384313..e11f65a 100644 --- a/api-linter/test/testdata/filtering/401.yml +++ b/api-linter/test/testdata/filtering/401.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -61,14 +61,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -84,7 +84,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -92,12 +92,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -118,4 +118,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/.spectral.yml b/api-linter/test/testdata/mediatype/.spectral.yml index 4513222..e803a3d 100644 --- a/api-linter/test/testdata/mediatype/.spectral.yml +++ b/api-linter/test/testdata/mediatype/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-media-type.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-media-type.yml diff --git a/api-linter/test/testdata/mediatype/100.yml b/api-linter/test/testdata/mediatype/100.yml index 7278a7f..cb64601 100644 --- a/api-linter/test/testdata/mediatype/100.yml +++ b/api-linter/test/testdata/mediatype/100.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/vndjson: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' components: schemas: RoomsReadResponse: @@ -43,7 +43,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -51,12 +51,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -77,4 +77,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/101-1.yml b/api-linter/test/testdata/mediatype/101-1.yml index afc8584..2fc2a5f 100644 --- a/api-linter/test/testdata/mediatype/101-1.yml +++ b/api-linter/test/testdata/mediatype/101-1.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' components: schemas: RoomsReadResponse: @@ -43,7 +43,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -51,12 +51,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -77,4 +77,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/101-2.1.yml b/api-linter/test/testdata/mediatype/101-2.1.yml index 3861312..2843e2d 100644 --- a/api-linter/test/testdata/mediatype/101-2.1.yml +++ b/api-linter/test/testdata/mediatype/101-2.1.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' components: schemas: RoomsReadResponse: @@ -43,7 +43,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -51,12 +51,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -77,5 +77,4 @@ components: example: Garching b. München zip: type: string - example: "85748" - \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/101-2.2.yml b/api-linter/test/testdata/mediatype/101-2.2.yml index 3181532..a74438b 100644 --- a/api-linter/test/testdata/mediatype/101-2.2.yml +++ b/api-linter/test/testdata/mediatype/101-2.2.yml @@ -29,14 +29,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomCreationRequest" + $ref: '#/components/schemas/RoomCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/RoomCreationResponse" + $ref: '#/components/schemas/RoomCreationResponse' components: schemas: RoomCreationRequest: @@ -45,25 +45,25 @@ components: - item properties: item: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. @@ -84,5 +84,4 @@ components: example: Garching b. München zip: type: string - example: "85748" - \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/101-4-1.yml b/api-linter/test/testdata/mediatype/101-4-1.yml index 12f2caf..2b2ec61 100644 --- a/api-linter/test/testdata/mediatype/101-4-1.yml +++ b/api-linter/test/testdata/mediatype/101-4-1.yml @@ -29,14 +29,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/RoomCreationRequest" + $ref: '#/components/schemas/RoomCreationRequest' responses: - "201": + '201': description: Created content: application/json: schema: - $ref: "#/components/schemas/RoomCreationResponse" + $ref: '#/components/schemas/RoomCreationResponse' components: schemas: RoomCreationRequest: @@ -45,25 +45,25 @@ components: - data properties: data: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. @@ -85,4 +85,3 @@ components: zip: type: double example: 85734 - \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-7-2.yml b/api-linter/test/testdata/mediatype/101-7-2.yml index d3b4387..00d10ab 100644 --- a/api-linter/test/testdata/mediatype/101-7-2.yml +++ b/api-linter/test/testdata/mediatype/101-7-2.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' parameters: - name: cursor in: query @@ -57,7 +57,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -65,46 +65,46 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: - $ref: "#/components/schemas/RoomPageCursor" + $ref: '#/components/schemas/RoomPageCursor' meta: type: array required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' RoomCreationRequest: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomBase" + $ref: '#/components/schemas/RoomBase' RoomCreationResponse: type: object required: - data properties: data: - $ref: "#/components/schemas/RoomLink" + $ref: '#/components/schemas/RoomLink' RoomLink: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object - properties: + properties: links: type: object properties: - self: + self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. @@ -125,7 +125,7 @@ components: example: Garching b. München zip: type: string - example: "85734" + example: '85734' RoomPageCursor: type: object description: Pagination links for cursor-based pagination. @@ -165,4 +165,3 @@ components: type: integer example: 100 description: Total amount of elements available. - \ No newline at end of file diff --git a/api-linter/test/testdata/mediatype/101-8.yml b/api-linter/test/testdata/mediatype/101-8.yml index 28eb6ff..24847ce 100644 --- a/api-linter/test/testdata/mediatype/101-8.yml +++ b/api-linter/test/testdata/mediatype/101-8.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' components: schemas: RoomsReadResponse: @@ -43,7 +43,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -51,12 +51,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -77,5 +77,4 @@ components: example: Garching b. München zip: type: string - example: "85748" - \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/mediatype/101-9.yml b/api-linter/test/testdata/mediatype/101-9.yml index 5d1c626..616ff5b 100644 --- a/api-linter/test/testdata/mediatype/101-9.yml +++ b/api-linter/test/testdata/mediatype/101-9.yml @@ -26,12 +26,12 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' components: schemas: RoomsReadResponse: @@ -43,7 +43,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -51,12 +51,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -77,5 +77,4 @@ components: example: Garching b. München zip: type: string - example: "85748" - \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/pagination/.spectral.yml b/api-linter/test/testdata/pagination/.spectral.yml index a2ac465..68d3c90 100644 --- a/api-linter/test/testdata/pagination/.spectral.yml +++ b/api-linter/test/testdata/pagination/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-pagination.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-pagination.yml diff --git a/api-linter/test/testdata/pagination/600.1.yml b/api-linter/test/testdata/pagination/600.1.yml index c91d4c6..748a28a 100644 --- a/api-linter/test/testdata/pagination/600.1.yml +++ b/api-linter/test/testdata/pagination/600.1.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -48,14 +48,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -71,7 +71,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -79,21 +79,21 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: - $ref: "#/components/schemas/RoomPageCursor" + $ref: '#/components/schemas/RoomPageCursor' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' RoomBase: type: object description: Place where course lessons take place. @@ -114,7 +114,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomPageCursor: type: object description: Pagination links for cursor-based pagination. @@ -158,4 +158,4 @@ components: totalElements: type: integer example: 100 - description: Total amount of elements available. \ No newline at end of file + description: Total amount of elements available. diff --git a/api-linter/test/testdata/pagination/600.2.yml b/api-linter/test/testdata/pagination/600.2.yml index bfc6849..d44f99b 100644 --- a/api-linter/test/testdata/pagination/600.2.yml +++ b/api-linter/test/testdata/pagination/600.2.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -48,14 +48,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -71,7 +71,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -79,21 +79,21 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: - $ref: "#/components/schemas/RoomPageCursor" + $ref: '#/components/schemas/RoomPageCursor' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' RoomBase: type: object description: Place where course lessons take place. @@ -114,13 +114,13 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomPageCursor: type: object description: Pagination links for cursor-based pagination. properties: page: - $ref: "#/components/schemas/RoomPageCursor2" + $ref: '#/components/schemas/RoomPageCursor2' RoomPageCursor2: type: object description: Pagination links for cursor-based pagination. @@ -164,4 +164,4 @@ components: totalElements: type: integer example: 100 - description: Total amount of elements available. \ No newline at end of file + description: Total amount of elements available. diff --git a/api-linter/test/testdata/pagination/600.3.yml b/api-linter/test/testdata/pagination/600.3.yml index ac2c831..1e7569e 100644 --- a/api-linter/test/testdata/pagination/600.3.yml +++ b/api-linter/test/testdata/pagination/600.3.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -48,14 +48,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -71,7 +71,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -79,21 +79,21 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: - $ref: "#/components/schemas/RoomPageCursor" + $ref: '#/components/schemas/RoomPageCursor' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' RoomBase: type: object description: Place where course lessons take place. @@ -114,7 +114,7 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' RoomPageCursor: type: object description: Pagination links for cursor-based pagination. @@ -158,4 +158,4 @@ components: totalElements: type: integer example: 100 - description: Total amount of elements available. \ No newline at end of file + description: Total amount of elements available. diff --git a/api-linter/test/testdata/pagination/601-1-1.yml b/api-linter/test/testdata/pagination/601-1-1.yml index 4f0f22e..23b6bea 100644 --- a/api-linter/test/testdata/pagination/601-1-1.yml +++ b/api-linter/test/testdata/pagination/601-1-1.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: cursor in: query description: Opaque cursor to fetch specific page @@ -46,14 +46,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -69,7 +69,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -77,34 +77,34 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' PageIndex: type: object description: Pagination metadata for index-based pagination. @@ -133,4 +133,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/pagination/601-2-1.yml b/api-linter/test/testdata/pagination/601-2-1.yml index 456b1dc..c93e5df 100644 --- a/api-linter/test/testdata/pagination/601-2-1.yml +++ b/api-linter/test/testdata/pagination/601-2-1.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: offset in: query description: Opaque cursor to fetch specific page @@ -46,14 +46,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -69,7 +69,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -77,34 +77,34 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' PageIndex: type: object description: Pagination metadata for index-based pagination. @@ -145,4 +145,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/pagination/601-3-1.1.yml b/api-linter/test/testdata/pagination/601-3-1.1.yml index 5fc9914..f22373c 100644 --- a/api-linter/test/testdata/pagination/601-3-1.1.yml +++ b/api-linter/test/testdata/pagination/601-3-1.1.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query description: Opaque cursor to fetch specific page @@ -46,14 +46,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -69,7 +69,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -77,34 +77,34 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' PageIndex: type: object description: Pagination metadata for index-based pagination. @@ -145,4 +145,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/pagination/601-3-1.2.yml b/api-linter/test/testdata/pagination/601-3-1.2.yml index 17be859..c84de87 100644 --- a/api-linter/test/testdata/pagination/601-3-1.2.yml +++ b/api-linter/test/testdata/pagination/601-3-1.2.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query description: Opaque cursor to fetch specific page @@ -46,14 +46,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -69,7 +69,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -77,34 +77,34 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' meta: type: object required: - page properties: page: - $ref: "#/components/schemas/PageIndex" + $ref: '#/components/schemas/PageIndex' PageIndex: type: object description: Pagination metadata for index-based pagination. @@ -153,4 +153,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/pagination/601.yml b/api-linter/test/testdata/pagination/601.yml index 87946ba..e2c787f 100644 --- a/api-linter/test/testdata/pagination/601.yml +++ b/api-linter/test/testdata/pagination/601.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: sort in: query required: true @@ -34,14 +34,14 @@ paths: type: integer example: 1 responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -57,7 +57,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -65,27 +65,27 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' links: type: object properties: self: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' first: type: string - example: "https://api.siemens.com/reference/api/courses?number=1&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' last: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' next: type: string - example: "https://api.siemens.com/reference/api/courses?number=2&size=1" + example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' RoomBase: type: object description: Place where course lessons take place. @@ -106,4 +106,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/refs/.spectral.yml b/api-linter/test/testdata/refs/.spectral.yml index e0af132..693f77d 100644 --- a/api-linter/test/testdata/refs/.spectral.yml +++ b/api-linter/test/testdata/refs/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-error-reporting.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-error-reporting.yml diff --git a/api-linter/test/testdata/refs/300.yml b/api-linter/test/testdata/refs/300.yml index 155c0cb..519df98 100644 --- a/api-linter/test/testdata/refs/300.yml +++ b/api-linter/test/testdata/refs/300.yml @@ -26,18 +26,18 @@ paths: tags: - Rooms responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" - "99": + $ref: '#/components/schemas/RoomsReadResponse' + '99': description: errors content: application/json: schema: - $ref: "./common_errors.yml#/components/schemas/Errors" + $ref: './common_errors.yml#/components/schemas/Errors' components: schemas: RoomsReadResponse: @@ -49,7 +49,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -57,12 +57,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -83,4 +83,4 @@ components: example: Garching b. München zip: type: string - example: "85748" + example: '85748' diff --git a/api-linter/test/testdata/refs/common_errors.yml b/api-linter/test/testdata/refs/common_errors.yml index eeb6cfe..33c2121 100644 --- a/api-linter/test/testdata/refs/common_errors.yml +++ b/api-linter/test/testdata/refs/common_errors.yml @@ -33,7 +33,7 @@ components: status: type: string description: HTTP status code applicable to this error. - example: "99" + example: '99' code: type: string description: Unique identifier for this type of error. diff --git a/api-linter/test/testdata/security/.spectral.yml b/api-linter/test/testdata/security/.spectral.yml index a6a6f68..c0a85f3 100644 --- a/api-linter/test/testdata/security/.spectral.yml +++ b/api-linter/test/testdata/security/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-security.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-security.yml diff --git a/api-linter/test/testdata/security/invalid.yml b/api-linter/test/testdata/security/invalid.yml index 4d28497..4979bf9 100644 --- a/api-linter/test/testdata/security/invalid.yml +++ b/api-linter/test/testdata/security/invalid.yml @@ -33,7 +33,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -62,14 +62,14 @@ paths: schema: type: string responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -85,7 +85,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -93,12 +93,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -119,4 +119,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/security/valid.yml b/api-linter/test/testdata/security/valid.yml index fddaf12..890cdd1 100644 --- a/api-linter/test/testdata/security/valid.yml +++ b/api-linter/test/testdata/security/valid.yml @@ -33,7 +33,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: number in: query required: true @@ -62,14 +62,14 @@ paths: schema: type: string responses: - "201": + '201': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -85,7 +85,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -93,12 +93,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -119,4 +119,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/versioning/.spectral.yml b/api-linter/test/testdata/versioning/.spectral.yml index 0ab46a9..efbe6cd 100644 --- a/api-linter/test/testdata/versioning/.spectral.yml +++ b/api-linter/test/testdata/versioning/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-versioning.yml \ No newline at end of file + - ../../../rulesets/xcelerator-api-versioning.yml diff --git a/api-linter/test/testdata/versioning/200-1.yml b/api-linter/test/testdata/versioning/200-1.yml index 3895be3..8e00955 100644 --- a/api-linter/test/testdata/versioning/200-1.yml +++ b/api-linter/test/testdata/versioning/200-1.yml @@ -15,4 +15,4 @@ tags: - name: Rooms description: | Rooms describe the locations where lessons take place. A room can only be - deleted when there are no related lessons. \ No newline at end of file + deleted when there are no related lessons. diff --git a/api-linter/test/testdata/versioning/200-2.yml b/api-linter/test/testdata/versioning/200-2.yml index 19ac06f..9503c20 100644 --- a/api-linter/test/testdata/versioning/200-2.yml +++ b/api-linter/test/testdata/versioning/200-2.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: Not-Api-Version in: header required: true @@ -34,14 +34,14 @@ paths: type: integer example: 1 responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Api-Version": + 'Api-Version': description: The API semantic-version string schema: type: string @@ -57,7 +57,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -65,12 +65,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -91,4 +91,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/versioning/201.yml b/api-linter/test/testdata/versioning/201.yml index 0161346..69e804a 100644 --- a/api-linter/test/testdata/versioning/201.yml +++ b/api-linter/test/testdata/versioning/201.yml @@ -25,7 +25,7 @@ paths: operationId: ReadRooms tags: - Rooms - parameters: + parameters: - name: Api-Version in: header required: true @@ -34,14 +34,14 @@ paths: type: string example: 275bd2a1-e6cb-4ec3-80f3-22167c6bcaab responses: - "200": + '200': description: Ok content: application/json: schema: - $ref: "#/components/schemas/RoomsReadResponse" + $ref: '#/components/schemas/RoomsReadResponse' headers: - "Not-Api-Version": + 'Not-Api-Version': description: The API semantic-version string schema: type: string @@ -57,7 +57,7 @@ components: type: array items: allOf: - - $ref: "#/components/schemas/RoomBase" + - $ref: '#/components/schemas/RoomBase' - type: object properties: links: @@ -65,12 +65,12 @@ components: properties: self: type: string - example: "https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + description: '#servers/url' lessons: type: string - example: "https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2" - description: "#servers/url" + example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + description: '#servers/url' RoomBase: type: object description: Place where course lessons take place. @@ -91,4 +91,4 @@ components: example: Garching b. München zip: type: string - example: "85748" \ No newline at end of file + example: '85748' diff --git a/api-linter/test/testdata/versioning/semantic-versioning.yml b/api-linter/test/testdata/versioning/semantic-versioning.yml index 7e09ee3..e9df7f9 100644 --- a/api-linter/test/testdata/versioning/semantic-versioning.yml +++ b/api-linter/test/testdata/versioning/semantic-versioning.yml @@ -15,4 +15,4 @@ tags: - name: Rooms description: | Rooms describe the locations where lessons take place. A room can only be - deleted when there are no related lessons. \ No newline at end of file + deleted when there are no related lessons. From 52928e1a4004cd3babaeff74266c0c6b36d3c1de Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:28:34 +0200 Subject: [PATCH 04/33] refactor(api-linter): correct renamed ruleset references in test configs --- api-linter/test/testdata/commonops/.spectral.yml | 2 +- api-linter/test/testdata/error/.spectral.yml | 2 +- api-linter/test/testdata/fields/.spectral.yml | 2 +- api-linter/test/testdata/filtering/.spectral.yml | 2 +- api-linter/test/testdata/mediatype/.spectral.yml | 2 +- api-linter/test/testdata/pagination/.spectral.yml | 2 +- api-linter/test/testdata/refs/.spectral.yml | 2 +- api-linter/test/testdata/security/.spectral.yml | 2 +- api-linter/test/testdata/versioning/.spectral.yml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/api-linter/test/testdata/commonops/.spectral.yml b/api-linter/test/testdata/commonops/.spectral.yml index d030c07..5580082 100644 --- a/api-linter/test/testdata/commonops/.spectral.yml +++ b/api-linter/test/testdata/commonops/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-common-operation.yml + - ../../../rulesets/siemens-api-common-operation.yml diff --git a/api-linter/test/testdata/error/.spectral.yml b/api-linter/test/testdata/error/.spectral.yml index 693f77d..072d636 100644 --- a/api-linter/test/testdata/error/.spectral.yml +++ b/api-linter/test/testdata/error/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-error-reporting.yml + - ../../../rulesets/siemens-api-error-reporting.yml diff --git a/api-linter/test/testdata/fields/.spectral.yml b/api-linter/test/testdata/fields/.spectral.yml index ebf20ff..05a6059 100644 --- a/api-linter/test/testdata/fields/.spectral.yml +++ b/api-linter/test/testdata/fields/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-sparse-fieldsets.yml + - ../../../rulesets/siemens-api-sparse-fieldsets.yml diff --git a/api-linter/test/testdata/filtering/.spectral.yml b/api-linter/test/testdata/filtering/.spectral.yml index 70c4034..dbe05c8 100644 --- a/api-linter/test/testdata/filtering/.spectral.yml +++ b/api-linter/test/testdata/filtering/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-filtering.yml + - ../../../rulesets/siemens-api-filtering.yml diff --git a/api-linter/test/testdata/mediatype/.spectral.yml b/api-linter/test/testdata/mediatype/.spectral.yml index e803a3d..3eb60df 100644 --- a/api-linter/test/testdata/mediatype/.spectral.yml +++ b/api-linter/test/testdata/mediatype/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-media-type.yml + - ../../../rulesets/siemens-api-media-type.yml diff --git a/api-linter/test/testdata/pagination/.spectral.yml b/api-linter/test/testdata/pagination/.spectral.yml index 68d3c90..ee02fcb 100644 --- a/api-linter/test/testdata/pagination/.spectral.yml +++ b/api-linter/test/testdata/pagination/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-pagination.yml + - ../../../rulesets/siemens-api-pagination.yml diff --git a/api-linter/test/testdata/refs/.spectral.yml b/api-linter/test/testdata/refs/.spectral.yml index 693f77d..072d636 100644 --- a/api-linter/test/testdata/refs/.spectral.yml +++ b/api-linter/test/testdata/refs/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-error-reporting.yml + - ../../../rulesets/siemens-api-error-reporting.yml diff --git a/api-linter/test/testdata/security/.spectral.yml b/api-linter/test/testdata/security/.spectral.yml index c0a85f3..634457f 100644 --- a/api-linter/test/testdata/security/.spectral.yml +++ b/api-linter/test/testdata/security/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-security.yml + - ../../../rulesets/siemens-api-security.yml diff --git a/api-linter/test/testdata/versioning/.spectral.yml b/api-linter/test/testdata/versioning/.spectral.yml index efbe6cd..aa39852 100644 --- a/api-linter/test/testdata/versioning/.spectral.yml +++ b/api-linter/test/testdata/versioning/.spectral.yml @@ -1,2 +1,2 @@ extends: - - ../../../rulesets/xcelerator-api-versioning.yml + - ../../../rulesets/siemens-api-versioning.yml From 7c139ab7ec9450eed0c870db6eac0ccaba3a4888 Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:43:21 +0200 Subject: [PATCH 05/33] chore(api-linter): lint with root eslint instead of standard Bring the api-linter workspace under the repository-wide eslint configuration instead of its own bundled "standard" linter: - remove the api-linter eslint ignore and add a flat-config block that enables the node and jest globals for its CommonJS/ESM sources - add "globals" as a root devDependency (imported by eslint.config.js) - drop the now-unused "standard" dependency - drop unused devDependencies "jest-junit" and the duplicated "jsonpath" --- api-linter/package.json | 5 +- eslint.config.js | 12 + package-lock.json | 1821 +++------------------------------------ package.json | 1 + 4 files changed, 138 insertions(+), 1701 deletions(-) diff --git a/api-linter/package.json b/api-linter/package.json index 9b2034c..662bc57 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -35,13 +35,10 @@ "handlebars": "^4.7.7", "commander": "^12.0.0", "underscore": "^1.13.1", - "standard": "^17.0.0", "js-yaml": "^4.1.0", "jsonpath": "^1.1.1" }, "devDependencies": { - "jest": "^29.0.0", - "jest-junit": "^16.0.0", - "jsonpath": "^1.1.1" + "jest": "^29.0.0" } } diff --git a/eslint.config.js b/eslint.config.js index 4926e1c..d77cd8c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -9,6 +9,7 @@ import { defineConfig } from 'eslint/config'; import angularTypescriptConfig from '@siemens/eslint-config-angular'; import tsdocPlugin from 'eslint-plugin-tsdoc'; import eslintPluginHeaders from 'eslint-plugin-headers'; +import globals from 'globals'; // mimic CommonJS variables const __filename = fileURLToPath(import.meta.url); @@ -17,6 +18,17 @@ const __dirname = path.dirname(__filename); export default [ { ignores: ['dist', 'eslint-plugin-defaultvalue/lib/rules/**/*.js'] }, eslintJs.configs.recommended, + { + name: 'api-linter', + files: ['api-linter/**/*.js'], + languageOptions: { + sourceType: 'module', + globals: { + ...globals.node, + ...globals.jest + } + } + }, { plugins: { 'headers': eslintPluginHeaders }, rules: { diff --git a/package-lock.json b/package-lock.json index 6e7a297..aa73240 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "eslint-plugin-perfectionist": "5.10.1", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-tsdoc": "0.5.2", + "globals": "17.11.0", "husky": "9.1.7", "postcss-scss": "4.0.9", "prettier": "3.9.6", @@ -57,16 +58,13 @@ "handlebars": "^4.7.7", "js-yaml": "^4.1.0", "jsonpath": "^1.1.1", - "standard": "^17.0.0", "underscore": "^1.13.1" }, "bin": { "api-linter": "src/index.js" }, "devDependencies": { - "jest": "^29.0.0", - "jest-junit": "^16.0.0", - "jsonpath": "^1.1.1" + "jest": "^29.0.0" } }, "commitlint-config": { @@ -1905,105 +1903,6 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", @@ -2095,49 +1994,6 @@ "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2151,13 +2007,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "license": "BSD-3-Clause" - }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", @@ -3872,12 +3721,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "license": "MIT" - }, "node_modules/@scarf/scarf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", @@ -5057,12 +4900,6 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "24.13.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", @@ -5382,12 +5219,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", - "license": "ISC" - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -5659,121 +5490,6 @@ "dev": true, "license": "MIT" }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -6177,15 +5893,6 @@ "dev": true, "license": "MIT" }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -7433,18 +7140,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7833,33 +7528,6 @@ "node": ">= 0.4" } }, - "node_modules/es-iterator-helpers": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", - "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-object-atoms": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", @@ -7887,18 +7555,6 @@ "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-to-primitive": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", @@ -8004,7 +7660,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -8026,7 +7681,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -8040,7 +7694,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { @@ -8105,118 +7758,6 @@ } } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", - "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "license": "MIT", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-headers": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/eslint-plugin-headers/-/eslint-plugin-headers-1.3.4.tgz", @@ -8230,68 +7771,6 @@ "eslint": ">=7" } }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "license": "MIT", - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-n/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-perfectionist": { "version": "5.10.1", "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.10.1.tgz", @@ -8516,33 +7995,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -8631,7 +8083,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -9349,18 +8800,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9496,27 +8935,13 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", + "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9580,14 +9005,9 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "license": "MIT" - }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -9634,6 +9054,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10686,23 +10107,6 @@ "node": ">=8" } }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/java-properties": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", @@ -11418,45 +10822,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-junit/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-junit/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", @@ -12304,6 +11669,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -12374,7 +11740,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.3.0.tgz", "integrity": "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==", - "dev": true, "license": "MIT", "dependencies": { "esprima": "1.2.5", @@ -12404,7 +11769,6 @@ "version": "1.13.6", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true, "license": "MIT" }, "node_modules/jsonpointer": { @@ -12416,21 +11780,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/junk": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", @@ -12613,6 +11962,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, "license": "MIT" }, "node_modules/lodash.topath": { @@ -12730,18 +12080,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lru-cache": { "version": "11.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", @@ -13059,19 +12397,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -13191,33 +12516,6 @@ "node": ">=18" } }, - "node_modules/node-exports-info": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", - "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -15321,77 +14619,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "peer": true, + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -16226,23 +15459,6 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -16560,18 +15776,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/registry-auth-token": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", @@ -17436,881 +16640,168 @@ "node": ">=8" } }, - "node_modules/standard": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", - "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", "license": "MIT", "dependencies": { - "eslint": "^8.41.0", - "eslint-config-standard": "17.1.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.36.1", - "standard-engine": "^15.1.0", - "version-guard": "^1.1.1" - }, - "bin": { - "standard": "bin/cmd.cjs" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "escodegen": "^2.1.0" } }, - "node_modules/standard-engine": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", - "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/standard-engine/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard-engine/node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/standard-engine/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "node_modules/standard-engine/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "safe-buffer": "~5.1.0" } }, - "node_modules/standard-engine/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/standard-engine/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/standard-engine/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/standard-engine/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, "engines": { - "node": ">=4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard-engine/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/standard-engine/node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "license": "MIT", "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/standard/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/standard/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/standard/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/standard/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/standard/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/standard/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/standard/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/standard/node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" - } - }, - "node_modules/standard/node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/standard/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/standard/node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/standard/node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "license": "ISC", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/standard/node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/standard/node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/standard/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/standard/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/standard/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/standard/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/standard/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/standard/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/standard/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/standard/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/standard/node_modules/resolve": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/standard/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/standard/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/standard/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stdin-discarder": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", - "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", - "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -18343,6 +16834,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -18539,6 +17031,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -18809,12 +17302,6 @@ "node": "*" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -18950,30 +17437,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -19379,17 +17842,6 @@ "node": ">= 4" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -19436,15 +17888,6 @@ "node": ">= 0.8" } }, - "node_modules/version-guard": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", - "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", - "license": "0BSD", - "engines": { - "node": ">=0.10.48" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -19635,22 +18078,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true, - "license": "MIT" - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 2c29f09..53838a7 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "eslint-plugin-perfectionist": "5.10.1", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-tsdoc": "0.5.2", + "globals": "17.11.0", "husky": "9.1.7", "postcss-scss": "4.0.9", "prettier": "3.9.6", From 0cc6250d1b1edfdc93374d0d6832668eaa5c864f Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:44:24 +0200 Subject: [PATCH 06/33] refactor(api-linter): resolve eslint violations in linter sources - use block-scoped const for the repeated linkProps declarations to avoid redeclaration in get-resources-has-pagination - declare tempFilePath without a redundant initial assignment - use an optional catch binding for the unused cleanup error - iterate map values instead of destructuring an unused key --- .../rulesets/functions/get-resources-has-pagination.js | 6 +++--- api-linter/src/index.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js index 317bbea..63317fb 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -76,7 +76,7 @@ export default (targetValue, options) => { if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } @@ -84,7 +84,7 @@ export default (targetValue, options) => { } if (options == 'B') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { return [{ message: 'Pagination links SHOULD appear in the top-level links object.' }]; } @@ -92,7 +92,7 @@ export default (targetValue, options) => { } if (options == 'D') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { if (linkProps.filter(prob => notInPageKeys(prob)).length > 0) { return [{ message: 'Naming convention MUST be used for pagination keys.' }]; diff --git a/api-linter/src/index.js b/api-linter/src/index.js index 0864a97..57d9f25 100755 --- a/api-linter/src/index.js +++ b/api-linter/src/index.js @@ -176,7 +176,7 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { ); const spectral = new Spectral({ resolver }); - var tempFilePath = ''; + let tempFilePath; var isMultiRuleFiles = false; if (rulesetPath.length > 1) { @@ -208,7 +208,7 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { fs.unlinkSync(tempFilePath); } - } catch (cleanupErr) { + } catch { console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); } @@ -275,7 +275,7 @@ const resolveRuleDependencyResult = (rules, results) => { const filteredResults = []; - for (const [_, issues] of issuesByLocation.entries()) { + for (const issues of issuesByLocation.values()) { const failedRules = new Set(issues.map(i => i.code)); for (const issue of issues) { From 74ab7016c215564e3da1d33b9883b2331a9302db Mon Sep 17 00:00:00 2001 From: Fabio Huser Date: Fri, 14 Aug 2026 07:45:55 +0200 Subject: [PATCH 07/33] style(api-linter): add copyright headers Add the SPDX copyright header required by the repository eslint header rule to all api-linter JavaScript sources. --- .../rulesets/functions/assert-http-codes-for-operation.js | 4 ++++ api-linter/rulesets/functions/count-resource-types.js | 4 ++++ .../get-resources-has-pagination-strategies-meta.js | 4 ++++ .../functions/get-resources-has-pagination-strategies.js | 4 ++++ .../rulesets/functions/get-resources-has-pagination.js | 4 ++++ api-linter/rulesets/functions/get-resources-has-parameter.js | 4 ++++ api-linter/rulesets/functions/get-status-code.js | 4 ++++ .../functions/has-header-parameter-with-property-value.js | 4 ++++ api-linter/rulesets/functions/has-headers-with-property.js | 4 ++++ api-linter/rulesets/functions/is-meta-object.js | 4 ++++ api-linter/rulesets/functions/is-object-schema.js | 4 ++++ api-linter/rulesets/functions/is-problem-json-schema.js | 4 ++++ api-linter/rulesets/functions/links-has-self.js | 4 ++++ .../functions/path-resource-name-is-lowercase-with-hyphen.js | 4 ++++ api-linter/rulesets/functions/query-parameters-length.js | 4 ++++ .../request-is-defined-document-structure-schema.js | 4 ++++ .../response-is-defined-document-structure-schema.js | 4 ++++ api-linter/rulesets/functions/schema-test.js | 4 ++++ .../rulesets/functions/successful-response-status-code.js | 4 ++++ api-linter/rulesets/functions/validate-b3-tracing.js | 4 ++++ api-linter/rulesets/siemens-api-security.js | 4 ++++ api-linter/rulesets/siemens-api-versioning.js | 4 ++++ api-linter/src/argument.js | 4 ++++ api-linter/src/extension.js | 4 ++++ api-linter/src/index.js | 4 ++++ api-linter/test/api-commonops.test.js | 4 ++++ api-linter/test/api-errors-refs.test.js | 5 ++++- api-linter/test/api-errors.test.js | 4 ++++ api-linter/test/api-filtering.test.js | 4 ++++ api-linter/test/api-linter-cli.test.js | 4 ++++ api-linter/test/api-mediatype.test.js | 4 ++++ api-linter/test/api-pagination.test.js | 4 ++++ api-linter/test/api-security.test.js | 4 ++++ api-linter/test/api-sparse-fieldsets.test.js | 4 ++++ api-linter/test/api-versioning.test.js | 4 ++++ api-linter/test/base.js | 4 ++++ 36 files changed, 144 insertions(+), 1 deletion(-) diff --git a/api-linter/rulesets/functions/assert-http-codes-for-operation.js b/api-linter/rulesets/functions/assert-http-codes-for-operation.js index 7120809..d8d88d2 100644 --- a/api-linter/rulesets/functions/assert-http-codes-for-operation.js +++ b/api-linter/rulesets/functions/assert-http-codes-for-operation.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ export default (targetValue, { wellUnderstood }, context) => { const result = []; if (targetValue === null || typeof targetValue !== 'object') { diff --git a/api-linter/rulesets/functions/count-resource-types.js b/api-linter/rulesets/functions/count-resource-types.js index b30cb3f..850ee1f 100644 --- a/api-linter/rulesets/functions/count-resource-types.js +++ b/api-linter/rulesets/functions/count-resource-types.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const extractResourceTypeFromPath = path => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js index 7d6e601..fe65ab4 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js index 7f60546..38b3095 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js index 63317fb..f011517 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-resources-has-parameter.js b/api-linter/rulesets/functions/get-resources-has-parameter.js index ac63812..12dd373 100644 --- a/api-linter/rulesets/functions/get-resources-has-parameter.js +++ b/api-linter/rulesets/functions/get-resources-has-parameter.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-status-code.js b/api-linter/rulesets/functions/get-status-code.js index b065b04..6c03406 100644 --- a/api-linter/rulesets/functions/get-status-code.js +++ b/api-linter/rulesets/functions/get-status-code.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const jp = require('jsonpath'); diff --git a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js index 3619b30..3f33ce2 100644 --- a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js +++ b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ export default (targetVal, options) => { if (typeof targetVal !== 'object' || targetVal == null) return; const results = []; diff --git a/api-linter/rulesets/functions/has-headers-with-property.js b/api-linter/rulesets/functions/has-headers-with-property.js index deb6bcd..ee83bff 100644 --- a/api-linter/rulesets/functions/has-headers-with-property.js +++ b/api-linter/rulesets/functions/has-headers-with-property.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ export default (targetVal, options) => { if (typeof targetVal !== 'object' || targetVal == null) return; const results = []; diff --git a/api-linter/rulesets/functions/is-meta-object.js b/api-linter/rulesets/functions/is-meta-object.js index b5ca7ce..aa7202a 100644 --- a/api-linter/rulesets/functions/is-meta-object.js +++ b/api-linter/rulesets/functions/is-meta-object.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/is-object-schema.js b/api-linter/rulesets/functions/is-object-schema.js index a81684e..9908e4f 100644 --- a/api-linter/rulesets/functions/is-object-schema.js +++ b/api-linter/rulesets/functions/is-object-schema.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/is-problem-json-schema.js b/api-linter/rulesets/functions/is-problem-json-schema.js index 981ac1b..c97a0e1 100644 --- a/api-linter/rulesets/functions/is-problem-json-schema.js +++ b/api-linter/rulesets/functions/is-problem-json-schema.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; /* diff --git a/api-linter/rulesets/functions/links-has-self.js b/api-linter/rulesets/functions/links-has-self.js index 6023937..549a2f7 100644 --- a/api-linter/rulesets/functions/links-has-self.js +++ b/api-linter/rulesets/functions/links-has-self.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const jp = require('jsonpath'); diff --git a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js index 86342e5..224032a 100644 --- a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js +++ b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const validateResource = resource => { diff --git a/api-linter/rulesets/functions/query-parameters-length.js b/api-linter/rulesets/functions/query-parameters-length.js index 2ec51ef..1ec36cc 100644 --- a/api-linter/rulesets/functions/query-parameters-length.js +++ b/api-linter/rulesets/functions/query-parameters-length.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ export default (targetValue, options) => { if (targetValue == null) return; var checkField = options.nameCheck != null; diff --git a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js index 222f16a..e870c56 100644 --- a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js index daba08e..23f6f82 100644 --- a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/schema-test.js b/api-linter/rulesets/functions/schema-test.js index 6668ceb..0eeafc4 100644 --- a/api-linter/rulesets/functions/schema-test.js +++ b/api-linter/rulesets/functions/schema-test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/successful-response-status-code.js b/api-linter/rulesets/functions/successful-response-status-code.js index 712c715..86f1870 100644 --- a/api-linter/rulesets/functions/successful-response-status-code.js +++ b/api-linter/rulesets/functions/successful-response-status-code.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ export default targetValue => { const results = []; var exist = false; diff --git a/api-linter/rulesets/functions/validate-b3-tracing.js b/api-linter/rulesets/functions/validate-b3-tracing.js index e0d8d84..878d7ca 100644 --- a/api-linter/rulesets/functions/validate-b3-tracing.js +++ b/api-linter/rulesets/functions/validate-b3-tracing.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; export default targetValue => { diff --git a/api-linter/rulesets/siemens-api-security.js b/api-linter/rulesets/siemens-api-security.js index 66d9232..7087e38 100644 --- a/api-linter/rulesets/siemens-api-security.js +++ b/api-linter/rulesets/siemens-api-security.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ var apiSecurity = global.apiSecurity; const hasHeaderWithPropertyValue = (targetVal, options) => { const results = []; diff --git a/api-linter/rulesets/siemens-api-versioning.js b/api-linter/rulesets/siemens-api-versioning.js index 4881710..b95e30b 100644 --- a/api-linter/rulesets/siemens-api-versioning.js +++ b/api-linter/rulesets/siemens-api-versioning.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { pattern } = require('@stoplight/spectral-functions'); const apiVersioning = global.apiVersioning; diff --git a/api-linter/src/argument.js b/api-linter/src/argument.js index a5a726d..3745e68 100644 --- a/api-linter/src/argument.js +++ b/api-linter/src/argument.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ 'use strict'; const { Command, Option } = require('commander'); diff --git a/api-linter/src/extension.js b/api-linter/src/extension.js index 67e6828..8977819 100644 --- a/api-linter/src/extension.js +++ b/api-linter/src/extension.js @@ -1,5 +1,9 @@ #!/usr/bin/env node +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const fs = require('fs'); const spectralCore = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); diff --git a/api-linter/src/index.js b/api-linter/src/index.js index 57d9f25..0319b80 100755 --- a/api-linter/src/index.js +++ b/api-linter/src/index.js @@ -1,5 +1,9 @@ #!/usr/bin/env node +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const fs = require('fs'); const path = require('path'); const { join } = require('path'); diff --git a/api-linter/test/api-commonops.test.js b/api-linter/test/api-commonops.test.js index 8e072f9..2027278 100644 --- a/api-linter/test/api-commonops.test.js +++ b/api-linter/test/api-commonops.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/api-errors-refs.test.js b/api-linter/test/api-errors-refs.test.js index 896a916..533b04a 100644 --- a/api-linter/test/api-errors-refs.test.js +++ b/api-linter/test/api-errors-refs.test.js @@ -1,4 +1,7 @@ -// test/api-errors-refs.test.js +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const fs = require('fs'); const { Document } = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); diff --git a/api-linter/test/api-errors.test.js b/api-linter/test/api-errors.test.js index 3efea36..b58e22e 100644 --- a/api-linter/test/api-errors.test.js +++ b/api-linter/test/api-errors.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/api-filtering.test.js b/api-linter/test/api-filtering.test.js index a7e23bd..ac4d027 100644 --- a/api-linter/test/api-filtering.test.js +++ b/api-linter/test/api-filtering.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/api-linter-cli.test.js b/api-linter/test/api-linter-cli.test.js index bb1e61b..7666569 100644 --- a/api-linter/test/api-linter-cli.test.js +++ b/api-linter/test/api-linter-cli.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const path = require('path'); const fs = require('fs'); const { spawnSync } = require('child_process'); diff --git a/api-linter/test/api-mediatype.test.js b/api-linter/test/api-mediatype.test.js index 94deb46..66b7801 100644 --- a/api-linter/test/api-mediatype.test.js +++ b/api-linter/test/api-mediatype.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/api-pagination.test.js b/api-linter/test/api-pagination.test.js index c27fd1f..38863cc 100644 --- a/api-linter/test/api-pagination.test.js +++ b/api-linter/test/api-pagination.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/api-security.test.js b/api-linter/test/api-security.test.js index d4136ec..04021f9 100644 --- a/api-linter/test/api-security.test.js +++ b/api-linter/test/api-security.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, getSpecFilePath, assertOnlyErrors } = require('./base.js'); diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js index 65b553f..889dac4 100644 --- a/api-linter/test/api-sparse-fieldsets.test.js +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require('./base.js'); diff --git a/api-linter/test/api-versioning.test.js b/api-linter/test/api-versioning.test.js index 8fe6494..e442f25 100644 --- a/api-linter/test/api-versioning.test.js +++ b/api-linter/test/api-versioning.test.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); const { resultsForSeverity, diff --git a/api-linter/test/base.js b/api-linter/test/base.js index 1f0edf7..049f5d6 100644 --- a/api-linter/test/base.js +++ b/api-linter/test/base.js @@ -1,3 +1,7 @@ +/** + * Copyright Siemens 2026. + * SPDX-License-Identifier: MIT + */ const { DiagnosticSeverity } = require('@stoplight/types'); function resultsForSeverity(results, severity) { From cd1cfa1c6f90bdf3e7adc41a654f4b67b0043a21 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 14:01:08 +0200 Subject: [PATCH 08/33] chore(api-linter): apply all changes from the current internal Siemens project --- .gitattributes | 1 + api-linter/example/openapi.yml | 4 + api-linter/package.json | 7 +- .../assert-http-codes-for-operation.js | 1 + .../functions/count-resource-types.js | 1 + ...esources-has-pagination-strategies-meta.js | 1 + ...get-resources-has-pagination-strategies.js | 1 + .../functions/get-resources-has-pagination.js | 7 +- .../functions/get-resources-has-parameter.js | 1 + .../rulesets/functions/get-status-code.js | 1 + ...as-header-parameter-with-property-value.js | 1 + .../functions/has-headers-with-property.js | 1 + .../rulesets/functions/is-meta-object.js | 1 + .../rulesets/functions/is-object-schema.js | 1 + .../functions/is-problem-json-schema.js | 3 +- .../rulesets/functions/links-has-self.js | 2 + ...-resource-name-is-lowercase-with-hyphen.js | 1 + .../functions/query-parameters-length.js | 3 +- ...st-is-defined-document-structure-schema.js | 1 + ...se-is-defined-document-structure-schema.js | 1 + api-linter/rulesets/functions/schema-test.js | 1 + .../successful-response-status-code.js | 1 + .../rulesets/functions/validate-b3-tracing.js | 1 + .../rulesets/siemens-api-error-reporting.yml | 48 +- api-linter/src/index.js | 8 +- api-linter/src/templates/template.html | 297 ++- api-linter/test/api-errors-refs.test.js | 6 +- api-linter/test/api-errors.test.js | 9 +- api-linter/test/api-pagination.test.js | 2 + api-linter/test/api-sparse-fieldsets.test.js | 7 +- api-linter/test/testdata/error/305.1.yml | 18 +- package-lock.json | 1836 ++++++++++++++++- 32 files changed, 1956 insertions(+), 318 deletions(-) create mode 100644 .gitattributes mode change 100755 => 100644 api-linter/src/index.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/api-linter/example/openapi.yml b/api-linter/example/openapi.yml index 9ca8bc1..698a07d 100644 --- a/api-linter/example/openapi.yml +++ b/api-linter/example/openapi.yml @@ -1426,6 +1426,10 @@ components: type: string description: Human-readable explanation specific to this occurrence of the error. May be localized. example: This is an example error which occured for resource of type example. + test: + type: string + description: Human-readable explanation specific to this occurrence of the error. May be localized. + example: This is an example error which occured for resource of type example. responses: DefaultErrors: description: Standard errors diff --git a/api-linter/package.json b/api-linter/package.json index 662bc57..456442a 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -1,6 +1,6 @@ { "name": "@siemens/api-linter", - "version": "0.8.4", + "version": "0.8.6", "description": "A linter tool with Rulesets follow Siemens REST API Guidelines", "homepage": "https://github.com/siemens/lint", "author": { @@ -35,10 +35,13 @@ "handlebars": "^4.7.7", "commander": "^12.0.0", "underscore": "^1.13.1", + "standard": "^17.0.0", "js-yaml": "^4.1.0", "jsonpath": "^1.1.1" }, "devDependencies": { - "jest": "^29.0.0" + "jest": "^29.0.0", + "jest-junit": "^16.0.0", + "jsonpath": "^1.1.1" } } diff --git a/api-linter/rulesets/functions/assert-http-codes-for-operation.js b/api-linter/rulesets/functions/assert-http-codes-for-operation.js index d8d88d2..c64985c 100644 --- a/api-linter/rulesets/functions/assert-http-codes-for-operation.js +++ b/api-linter/rulesets/functions/assert-http-codes-for-operation.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + export default (targetValue, { wellUnderstood }, context) => { const result = []; if (targetValue === null || typeof targetValue !== 'object') { diff --git a/api-linter/rulesets/functions/count-resource-types.js b/api-linter/rulesets/functions/count-resource-types.js index 850ee1f..7808269 100644 --- a/api-linter/rulesets/functions/count-resource-types.js +++ b/api-linter/rulesets/functions/count-resource-types.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const extractResourceTypeFromPath = path => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js index fe65ab4..e201795 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies-meta.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js index 38b3095..c656c0f 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination-strategies.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js index f011517..169d337 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + const jp = require('jsonpath'); const isCollectionResponse = schema => { @@ -80,7 +81,7 @@ export default (targetValue, options) => { if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - const linkProps = jp.query(responseSchema, '$.properties.links.properties'); + var linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } @@ -88,7 +89,7 @@ export default (targetValue, options) => { } if (options == 'B') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - const linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); + var linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { return [{ message: 'Pagination links SHOULD appear in the top-level links object.' }]; } @@ -96,7 +97,7 @@ export default (targetValue, options) => { } if (options == 'D') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - const linkProps = jp.query(responseSchema, '$.properties.links.properties'); + var linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { if (linkProps.filter(prob => notInPageKeys(prob)).length > 0) { return [{ message: 'Naming convention MUST be used for pagination keys.' }]; diff --git a/api-linter/rulesets/functions/get-resources-has-parameter.js b/api-linter/rulesets/functions/get-resources-has-parameter.js index 12dd373..ab436bb 100644 --- a/api-linter/rulesets/functions/get-resources-has-parameter.js +++ b/api-linter/rulesets/functions/get-resources-has-parameter.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + const jp = require('jsonpath'); const isCollectionResponse = schema => { diff --git a/api-linter/rulesets/functions/get-status-code.js b/api-linter/rulesets/functions/get-status-code.js index 6c03406..1556841 100644 --- a/api-linter/rulesets/functions/get-status-code.js +++ b/api-linter/rulesets/functions/get-status-code.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const jp = require('jsonpath'); diff --git a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js index 3f33ce2..0b872af 100644 --- a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js +++ b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + export default (targetVal, options) => { if (typeof targetVal !== 'object' || targetVal == null) return; const results = []; diff --git a/api-linter/rulesets/functions/has-headers-with-property.js b/api-linter/rulesets/functions/has-headers-with-property.js index ee83bff..738cfe7 100644 --- a/api-linter/rulesets/functions/has-headers-with-property.js +++ b/api-linter/rulesets/functions/has-headers-with-property.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + export default (targetVal, options) => { if (typeof targetVal !== 'object' || targetVal == null) return; const results = []; diff --git a/api-linter/rulesets/functions/is-meta-object.js b/api-linter/rulesets/functions/is-meta-object.js index aa7202a..e700454 100644 --- a/api-linter/rulesets/functions/is-meta-object.js +++ b/api-linter/rulesets/functions/is-meta-object.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/is-object-schema.js b/api-linter/rulesets/functions/is-object-schema.js index 9908e4f..5ec6555 100644 --- a/api-linter/rulesets/functions/is-object-schema.js +++ b/api-linter/rulesets/functions/is-object-schema.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/is-problem-json-schema.js b/api-linter/rulesets/functions/is-problem-json-schema.js index c97a0e1..d1e7d65 100644 --- a/api-linter/rulesets/functions/is-problem-json-schema.js +++ b/api-linter/rulesets/functions/is-problem-json-schema.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; /* @@ -37,7 +38,7 @@ const assertProblemSchema = schema => { } const status = (schema.properties || {}).status || {}; if (status.type !== 'integer' || status.format !== 'int32') { - throw "Problem json must have property 'status' with type 'integer' and format 'int32'"; + throw "Problem json must have property 'status' with type 'integer' and format 'in32'"; } const detail = (schema.properties || {}).detail || {}; if (detail.type !== 'string') { diff --git a/api-linter/rulesets/functions/links-has-self.js b/api-linter/rulesets/functions/links-has-self.js index 549a2f7..f36b785 100644 --- a/api-linter/rulesets/functions/links-has-self.js +++ b/api-linter/rulesets/functions/links-has-self.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const jp = require('jsonpath'); @@ -15,6 +16,7 @@ const assertLinkSchema = schema => { const paths = jp.paths(schema, '$..*..links.properties'); for (const path of paths) { + const pathString = path.join('.'); if (path.some(p => p === 'relationships')) { continue; } diff --git a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js index 224032a..9798543 100644 --- a/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js +++ b/api-linter/rulesets/functions/path-resource-name-is-lowercase-with-hyphen.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const validateResource = resource => { diff --git a/api-linter/rulesets/functions/query-parameters-length.js b/api-linter/rulesets/functions/query-parameters-length.js index 1ec36cc..9afcc88 100644 --- a/api-linter/rulesets/functions/query-parameters-length.js +++ b/api-linter/rulesets/functions/query-parameters-length.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + export default (targetValue, options) => { if (targetValue == null) return; var checkField = options.nameCheck != null; @@ -27,7 +28,7 @@ export default (targetValue, options) => { { message: "The query parameter 'filter' SHOULD be used to filter or query data. " + - '(Linter is unable to determine whether the parameters used for filtering or not.) ' + '(Lint is unable to determine whether the parameters used for filtering or not.) ' } ]; } diff --git a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js index e870c56..4d6147d 100644 --- a/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/request-is-defined-document-structure-schema.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js index 23f6f82..e44bc20 100644 --- a/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js +++ b/api-linter/rulesets/functions/response-is-defined-document-structure-schema.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/schema-test.js b/api-linter/rulesets/functions/schema-test.js index 0eeafc4..9fb6ed1 100644 --- a/api-linter/rulesets/functions/schema-test.js +++ b/api-linter/rulesets/functions/schema-test.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; const assertObjectSchema = schema => { diff --git a/api-linter/rulesets/functions/successful-response-status-code.js b/api-linter/rulesets/functions/successful-response-status-code.js index 86f1870..5d91670 100644 --- a/api-linter/rulesets/functions/successful-response-status-code.js +++ b/api-linter/rulesets/functions/successful-response-status-code.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + export default targetValue => { const results = []; var exist = false; diff --git a/api-linter/rulesets/functions/validate-b3-tracing.js b/api-linter/rulesets/functions/validate-b3-tracing.js index 878d7ca..c80b9af 100644 --- a/api-linter/rulesets/functions/validate-b3-tracing.js +++ b/api-linter/rulesets/functions/validate-b3-tracing.js @@ -2,6 +2,7 @@ * Copyright Siemens 2026. * SPDX-License-Identifier: MIT */ + 'use strict'; export default targetValue => { diff --git a/api-linter/rulesets/siemens-api-error-reporting.yml b/api-linter/rulesets/siemens-api-error-reporting.yml index c5a403d..9f41433 100644 --- a/api-linter/rulesets/siemens-api-error-reporting.yml +++ b/api-linter/rulesets/siemens-api-error-reporting.yml @@ -138,24 +138,44 @@ rules: - '501' - '503' + Siemens-API-[304]: + message: 'API SHOULD report problems with an errors object' + description: API SHOULD report problems with an errors object + documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule304 + given: $.paths[*][*].responses[4xx,5xx].content[*].schema + severity: warn + then: + - field: properties.errors + function: truthy + Siemens-API-[305]-1: - message: Error object SHOULD be represented according to the defined structure fields - description: Error object SHOULD be represented according to the defined structure fields + message: 'Each error object within the errors array MUST contain at least one of the attributes' + description: Each error object within the errors array MUST contain at least one of the attributes documentationUrl: https://developer.siemens.com/guidelines/api-guidelines/rest/error.html#errorreportingrule305 - severity: warn - given: $.components.schemas.Errors..*..errors.*.properties.*~ + severity: error + given: $.components.schemas..*..errors.*.properties then: - function: enumeration + function: schema functionOptions: - values: - - 'id' - - 'code' - - 'status' - - 'title' - - 'detail' - - 'links' - - 'correlationId' - - 'source' + schema: + type: object + anyOf: + - required: + - id + - required: + - code + - required: + - status + - required: + - title + - required: + - detail + - required: + - links + - required: + - correlationId + - required: + - source Siemens-API-[305]-2: message: 'The error links resource object MAY contain the members: about, type' diff --git a/api-linter/src/index.js b/api-linter/src/index.js old mode 100755 new mode 100644 index 0319b80..3eb4704 --- a/api-linter/src/index.js +++ b/api-linter/src/index.js @@ -180,7 +180,7 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { ); const spectral = new Spectral({ resolver }); - let tempFilePath; + var tempFilePath = ''; var isMultiRuleFiles = false; if (rulesetPath.length > 1) { @@ -212,8 +212,8 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { fs.unlinkSync(tempFilePath); } - } catch { - console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); + } catch (cleanupErr) { + console.error(`Remove temporary file ${tempFilePath} failed. Please delete mannually.`); } return binded; @@ -279,7 +279,7 @@ const resolveRuleDependencyResult = (rules, results) => { const filteredResults = []; - for (const issues of issuesByLocation.values()) { + for (const [locationKey, issues] of issuesByLocation.entries()) { const failedRules = new Set(issues.map(i => i.code)); for (const issue of issues) { diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index d21d787..43b022d 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -1,178 +1,161 @@ - + - + + Siemens Xcelerator-API Linter Report - - + + - - + +
-
-

Siemens API Linter Report

-
-
-
-
+
+

Siemens API Linter Report

+
+
+
+
-
-
Total Rules Count: {{ this.enabledCount }}
-
+
+
Total Rules Count: {{this.enabledCount}}
+
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SeverityProblems
Errors{{ this.errorCount }}
Warnings{{ this.warnCount }}
Info{{ this.infoCount }}
Hints{{ this.hintCount }}
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SeverityProblems
Errors{{this.errorCount}}
Warnings{{this.warnCount}}
Info{{this.infoCount}}
Hints{{this.hintCount}}
+
-
-

Detailed report

-
+
+

Detailed report

+
-
- - - - {{#each this.data}} - - - - - {{#if hasDetails}} - - {{else}} - - {{/if}} - - - - - - {{/each}} - -
- {{#if hasDetails}} - - - - - - - - +
+
#LineSeverityPathmessage
+ + + {{#each this.data}} + + + + + {{#if hasDetails}} + + {{else}} + + {{/if}} - - - {{#each details}} - - - - - - + + + {{/each}} - -
{{inc @index}}{{ line }}{{ severity }}{{ path }}{{ message }}
+ {{#if hasDetails}} + + + + + + + + + + + + {{#each details}} + + + + + + {{/each}} + +
#LineSeverityPathmessage
{{inc @index}} + {{line}}{{severity}}{{path}}{{message}} +
+ {{/if}} +
- {{/if}} -
-
+ + +
- - + + + diff --git a/api-linter/test/api-errors-refs.test.js b/api-linter/test/api-errors-refs.test.js index 533b04a..8b9109e 100644 --- a/api-linter/test/api-errors-refs.test.js +++ b/api-linter/test/api-errors-refs.test.js @@ -3,13 +3,13 @@ * SPDX-License-Identifier: MIT */ const fs = require('fs'); -const { Document } = require('@stoplight/spectral-core'); +const { Spectral, Document } = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); // 👇 RE-ADD setupSpectral here -const { setupSpectral } = require('@jamietanna/spectral-test-harness'); +const { setupSpectral, retrieveDocument } = require('@jamietanna/spectral-test-harness'); -const { resultsForSeverity } = require('./base.js'); +const { resultsForSeverity, getSpecFilePath } = require('./base.js'); const { resolver } = require('@stoplight/spectral-ref-resolver'); const path = require('path'); diff --git a/api-linter/test/api-errors.test.js b/api-linter/test/api-errors.test.js index b58e22e..49954b6 100644 --- a/api-linter/test/api-errors.test.js +++ b/api-linter/test/api-errors.test.js @@ -6,6 +6,7 @@ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-h const { resultsForSeverity, getSpecFilePath, + assertOnlyErrors, assertOnlyWarnings, assertOnlyInfos } = require('./base.js'); @@ -60,10 +61,10 @@ test('Error object SHOULD be represented according to the defined structure fiel const document = retrieveDocument(specFilePath); spectral.run(document).then(results => { //Problem in line:110 - const warnings = resultsForSeverity(results, 'Warning'); - expect(warnings).toHaveLength(1); - expect(warnings[0].code).toBe('Siemens-API-[305]-1'); - assertOnlyWarnings(results); + const errors = resultsForSeverity(results, 'Error'); + expect(errors).toHaveLength(1); + expect(errors[0].code).toBe('Siemens-API-[305]-1'); + assertOnlyErrors(results); }); }); diff --git a/api-linter/test/api-pagination.test.js b/api-linter/test/api-pagination.test.js index 38863cc..7f01438 100644 --- a/api-linter/test/api-pagination.test.js +++ b/api-linter/test/api-pagination.test.js @@ -6,6 +6,8 @@ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-h const { resultsForSeverity, getSpecFilePath, + assertOnlyErrors, + assertOnlyWarnings, assertOnlyInfos, assertOnlyHints } = require('./base.js'); diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js index 889dac4..f226e62 100644 --- a/api-linter/test/api-sparse-fieldsets.test.js +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -3,7 +3,12 @@ * SPDX-License-Identifier: MIT */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); -const { resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require('./base.js'); +const { + resultsForSeverity, + getSpecFilePath, + assertOnlyWarnings, + assertOnlyInfos +} = require('./base.js'); const path = 'fields/'; const rulesetPath = 'test/testdata/fields/.spectral.yml'; diff --git a/api-linter/test/testdata/error/305.1.yml b/api-linter/test/testdata/error/305.1.yml index 6755635..566a1f2 100644 --- a/api-linter/test/testdata/error/305.1.yml +++ b/api-linter/test/testdata/error/305.1.yml @@ -91,26 +91,10 @@ components: title: Error type: object properties: - id: + test: type: string description: Unique identifier for this particular occurrence of the error. example: df873142-804e-4146-8956-02682c20d23d - status: - type: string - description: HTTP status code applicable to this error. - example: '423' - code: - type: string - description: Unique identifier for this type of error. - example: exampleError - title: - type: string - description: Short, human-readable summary of the problem associated to exactly one error code. May be localized. - example: Example error - info: - type: string - description: Human-readable explanation specific to this occurrence of the error. May be localized. - example: This is an example error which occured for resource of type example. responses: DefaultErrors: description: Standard errors diff --git a/package-lock.json b/package-lock.json index aa73240..4f668d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "api-linter": { "name": "@siemens/api-linter", - "version": "0.8.4", + "version": "0.8.6", "license": "MIT", "dependencies": { "@jamietanna/spectral-test-harness": "^0.3.0", @@ -58,13 +58,16 @@ "handlebars": "^4.7.7", "js-yaml": "^4.1.0", "jsonpath": "^1.1.1", + "standard": "^17.0.0", "underscore": "^1.13.1" }, "bin": { "api-linter": "src/index.js" }, "devDependencies": { - "jest": "^29.0.0" + "jest": "^29.0.0", + "jest-junit": "^16.0.0", + "jsonpath": "^1.1.1" } }, "commitlint-config": { @@ -1903,6 +1906,132 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", @@ -1994,6 +2123,49 @@ "node": ">=18.18.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2007,6 +2179,13 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", @@ -3721,6 +3900,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, "node_modules/@scarf/scarf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", @@ -4900,6 +5085,12 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.13.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", @@ -5219,6 +5410,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "license": "ISC" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -5490,6 +5687,121 @@ "dev": true, "license": "MIT" }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -5893,6 +6205,15 @@ "dev": true, "license": "MIT" }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -7140,6 +7461,18 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7528,21 +7861,48 @@ "node": ">= 0.4" } }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "node_modules/es-iterator-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { @@ -7555,6 +7915,18 @@ "node": ">= 0.4" } }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", @@ -7660,6 +8032,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -7681,6 +8054,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -7694,6 +8068,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { @@ -7758,6 +8133,118 @@ } } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-headers": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/eslint-plugin-headers/-/eslint-plugin-headers-1.3.4.tgz", @@ -7771,6 +8258,68 @@ "eslint": ">=7" } }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-perfectionist": { "version": "5.10.1", "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.10.1.tgz", @@ -7995,6 +8544,33 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -8083,6 +8659,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8800,6 +9377,18 @@ "node": ">= 0.4" } }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -9005,9 +9594,14 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -9054,7 +9648,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10107,6 +10700,23 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/java-properties": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", @@ -10822,6 +11432,45 @@ "fsevents": "^2.3.2" } }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", @@ -11669,7 +12318,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -11740,6 +12388,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.3.0.tgz", "integrity": "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==", + "dev": true, "license": "MIT", "dependencies": { "esprima": "1.2.5", @@ -11769,6 +12418,7 @@ "version": "1.13.6", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true, "license": "MIT" }, "node_modules/jsonpointer": { @@ -11780,6 +12430,21 @@ "node": ">=0.10.0" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/junk": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", @@ -11962,7 +12627,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/lodash.topath": { @@ -12080,6 +12744,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "11.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", @@ -12397,9 +13073,22 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, @@ -12516,6 +13205,33 @@ "node": ">=18" } }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -14619,6 +15335,71 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -15459,6 +16240,23 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -15776,6 +16574,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/registry-auth-token": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", @@ -16640,141 +17450,881 @@ "node": ">=8" } }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "node_modules/standard": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "escodegen": "^2.1.0" + "eslint": "^8.41.0", + "eslint-config-standard": "17.1.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.36.1", + "standard-engine": "^15.1.0", + "version-guard": "^1.1.1" + }, + "bin": { + "standard": "bin/cmd.cjs" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "peer": true, + "dependencies": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/stdin-discarder": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", - "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "node_modules/standard-engine/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "locate-path": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/standard-engine/node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, + "node_modules/standard-engine/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "license": "MIT", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "node_modules/standard-engine/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, + "node_modules/standard-engine/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/standard-engine/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/standard-engine/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/string-width": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", - "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "node_modules/standard-engine/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "node_modules/standard-engine/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/standard/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/standard/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/standard/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/standard/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/standard/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/standard/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/standard/node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/standard/node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/standard/node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/standard/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/standard/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/standard/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/standard/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/standard/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/standard/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/standard/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/standard/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/standard/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/standard/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/standard/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/standard/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/standard/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "escodegen": "^2.1.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16834,7 +18384,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -17031,7 +18580,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -17302,6 +18850,12 @@ "node": "*" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -17437,6 +18991,30 @@ "typescript": ">=4.8.4" } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -17842,6 +19420,17 @@ "node": ">= 4" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -17888,6 +19477,15 @@ "node": ">= 0.8" } }, + "node_modules/version-guard": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", + "license": "0BSD", + "engines": { + "node": ">=0.10.48" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -18078,6 +19676,22 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true, + "license": "MIT" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", From 525d47b788987deb4f7f7517440f952ccd7daa36 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 14:02:52 +0200 Subject: [PATCH 09/33] chore(api-linter): add spectral_result.json to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index bab8684..bb5e324 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ yarn-error.log # System Files .DS_Store Thumbs.db + +# api linter +spectral_result.json From 3664972b398b4576cd2c0f2d3240d84636488cd4 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 14:54:48 +0200 Subject: [PATCH 10/33] chore(api-linter): add linter-report.png (for README.md) --- api-linter/linter-report.png | Bin 0 -> 606214 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 api-linter/linter-report.png diff --git a/api-linter/linter-report.png b/api-linter/linter-report.png new file mode 100644 index 0000000000000000000000000000000000000000..683616cfce79faf9534d53c024bfda40932d4d5b GIT binary patch literal 606214 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

;`y&HW5-Z8^DyANFX0351 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⁡jMa8gQfToFL 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 literal 0 HcmV?d00001 From 35fbcbb00fcb13433b956a38a631bc8fde583f09 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:06:31 +0200 Subject: [PATCH 11/33] chore(api-linter): fix eclint errors --- .../rulesets/functions/get-resources-has-pagination.js | 6 +++--- api-linter/rulesets/functions/links-has-self.js | 1 - api-linter/src/index.js | 8 ++++---- api-linter/test/api-errors-refs.test.js | 6 +++--- api-linter/test/api-pagination.test.js | 2 -- api-linter/test/api-sparse-fieldsets.test.js | 1 - 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/api-linter/rulesets/functions/get-resources-has-pagination.js b/api-linter/rulesets/functions/get-resources-has-pagination.js index 169d337..09061b2 100644 --- a/api-linter/rulesets/functions/get-resources-has-pagination.js +++ b/api-linter/rulesets/functions/get-resources-has-pagination.js @@ -81,7 +81,7 @@ export default (targetValue, options) => { if (isCollectionResponse(responseSchema) && !hasTopLink(responseSchema)) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } else if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length == 0) { return [{ message: 'A server MAY provide links to traverse a paginated data set' }]; } @@ -89,7 +89,7 @@ export default (targetValue, options) => { } if (options == 'B') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties..properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { return [{ message: 'Pagination links SHOULD appear in the top-level links object.' }]; } @@ -97,7 +97,7 @@ export default (targetValue, options) => { } if (options == 'D') { if (isCollectionResponse(responseSchema) && hasTopLink(responseSchema)) { - var linkProps = jp.query(responseSchema, '$.properties.links.properties'); + const linkProps = jp.query(responseSchema, '$.properties.links.properties'); if (linkProps.filter(prob => hasPageLinkKeys(prob)).length > 0) { if (linkProps.filter(prob => notInPageKeys(prob)).length > 0) { return [{ message: 'Naming convention MUST be used for pagination keys.' }]; diff --git a/api-linter/rulesets/functions/links-has-self.js b/api-linter/rulesets/functions/links-has-self.js index f36b785..90c201c 100644 --- a/api-linter/rulesets/functions/links-has-self.js +++ b/api-linter/rulesets/functions/links-has-self.js @@ -16,7 +16,6 @@ const assertLinkSchema = schema => { const paths = jp.paths(schema, '$..*..links.properties'); for (const path of paths) { - const pathString = path.join('.'); if (path.some(p => p === 'relationships')) { continue; } diff --git a/api-linter/src/index.js b/api-linter/src/index.js index 3eb4704..0319b80 100644 --- a/api-linter/src/index.js +++ b/api-linter/src/index.js @@ -180,7 +180,7 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { ); const spectral = new Spectral({ resolver }); - var tempFilePath = ''; + let tempFilePath; var isMultiRuleFiles = false; if (rulesetPath.length > 1) { @@ -212,8 +212,8 @@ const linter = async (specFilePath, rulesetPath, followRefs) => { if (isMultiRuleFiles && fs.existsSync(tempFilePath)) { fs.unlinkSync(tempFilePath); } - } catch (cleanupErr) { - console.error(`Remove temporary file ${tempFilePath} failed. Please delete mannually.`); + } catch { + console.error(`Remove temporary file ${tempFilePath} failed. Please delete manually.`); } return binded; @@ -279,7 +279,7 @@ const resolveRuleDependencyResult = (rules, results) => { const filteredResults = []; - for (const [locationKey, issues] of issuesByLocation.entries()) { + for (const issues of issuesByLocation.values()) { const failedRules = new Set(issues.map(i => i.code)); for (const issue of issues) { diff --git a/api-linter/test/api-errors-refs.test.js b/api-linter/test/api-errors-refs.test.js index 8b9109e..533b04a 100644 --- a/api-linter/test/api-errors-refs.test.js +++ b/api-linter/test/api-errors-refs.test.js @@ -3,13 +3,13 @@ * SPDX-License-Identifier: MIT */ const fs = require('fs'); -const { Spectral, Document } = require('@stoplight/spectral-core'); +const { Document } = require('@stoplight/spectral-core'); const Parsers = require('@stoplight/spectral-parsers'); // 👇 RE-ADD setupSpectral here -const { setupSpectral, retrieveDocument } = require('@jamietanna/spectral-test-harness'); +const { setupSpectral } = require('@jamietanna/spectral-test-harness'); -const { resultsForSeverity, getSpecFilePath } = require('./base.js'); +const { resultsForSeverity } = require('./base.js'); const { resolver } = require('@stoplight/spectral-ref-resolver'); const path = require('path'); diff --git a/api-linter/test/api-pagination.test.js b/api-linter/test/api-pagination.test.js index 7f01438..38863cc 100644 --- a/api-linter/test/api-pagination.test.js +++ b/api-linter/test/api-pagination.test.js @@ -6,8 +6,6 @@ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-h const { resultsForSeverity, getSpecFilePath, - assertOnlyErrors, - assertOnlyWarnings, assertOnlyInfos, assertOnlyHints } = require('./base.js'); diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js index f226e62..1a8a0d7 100644 --- a/api-linter/test/api-sparse-fieldsets.test.js +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -6,7 +6,6 @@ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-h const { resultsForSeverity, getSpecFilePath, - assertOnlyWarnings, assertOnlyInfos } = require('./base.js'); From 493c22fdcb63197043d8eb6da5a82a5d7f91dc7f Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:16:48 +0200 Subject: [PATCH 12/33] docs(api-linter): change "Siemens Xcelerator API Guidelines" to "Siemens REST API guidelines" --- api-linter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-linter/README.md b/api-linter/README.md index 6ff33f5..3d826aa 100644 --- a/api-linter/README.md +++ b/api-linter/README.md @@ -1,14 +1,14 @@ # Siemens API Linter This project implements a linter reporter for the [Stoplight Spectral](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview) for API specifications. -The ruleset has been created based on the [Siemens Xcelerator API guidelines 2.5.0](https://developer.siemens.com/guidelines/api-guidelines/rest/index.html). +The ruleset has been created based on the [Siemens REST API guidelines](https://developer.siemens.com/guidelines/api-guidelines/rest/index.html). ## Getting started ### Directory structure - `example/`: contains a sample API spec file -- `rulesets/`: contains the ruleset files those follow the Siemens Xcelerator API guidelines +- `rulesets/`: contains the ruleset files those follow the Siemens REST API guidelines - `src/`: contains the source files for creating the linter report - `test/`: jest test cases for different rules in the rulesets From 27ff975ad1f63263915f36c3ae73d7a5d1a32ccb Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:18:35 +0200 Subject: [PATCH 13/33] docs(api-linter): change "html" to "HTML" in README.md --- api-linter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-linter/README.md b/api-linter/README.md index 3d826aa..23ea8be 100644 --- a/api-linter/README.md +++ b/api-linter/README.md @@ -27,7 +27,7 @@ In order to include the rulesets and provide linting within your project, you ca } ``` -The `@siemens/api-linter` package includes the new Siemens REST API linter tool with html report capability. +The `@siemens/api-linter` package includes the new Siemens REST API linter tool with HTML report capability. In order to trigger the linter on your API specifications, it provides a script to execute the linter within the `package.json` specification. From 76053ea58824a8ba919909d18126032911ef0e30 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:20:55 +0200 Subject: [PATCH 14/33] docs(api-linter): change api-linter version to ^0.8.6 in README.md --- api-linter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-linter/README.md b/api-linter/README.md index 23ea8be..234c915 100644 --- a/api-linter/README.md +++ b/api-linter/README.md @@ -22,7 +22,7 @@ In order to include the rulesets and provide linting within your project, you ca "test": "api-linter -s reference-api-specs/openapi.yml -r reference-api-specs/.spectral.yml" }, "devDependencies": { - "@siemens/api-linter": "^0.8.4" + "@siemens/api-linter": "^0.8.6" } } ``` From fb175a246a7fc4efba81a995107f14bbe53cf26b Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:22:58 +0200 Subject: [PATCH 15/33] docs(api-linter): improve yaml example comments in README.md --- api-linter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-linter/README.md b/api-linter/README.md index 234c915..372ec17 100644 --- a/api-linter/README.md +++ b/api-linter/README.md @@ -134,7 +134,7 @@ extends: > You can disable any rules/rulesets as you wish by [Stoplight Spectral](https://docs.stoplight.io/docs/spectral/674b27b261c3c-overview). ```yaml -#e.g. disable spectral:oas ruleset and disable Siemens-API-[400] rules from the extended ruleset +# e.g. disable spectral:oas ruleset and disable Siemens-API-[400] rules from the extended ruleset extends: - '@siemens/api-linter/rulesets/siemens-api.yml' - ['spectral:oas', 'off'] @@ -150,7 +150,7 @@ rules: > Then we can define the rules with `"x-dependsOn"` attribute. ```yaml -#e.g. Siemens-API-[101.8.1] depends on Siemens-API-[101.8] +# e.g. Siemens-API-[101.8.1] depends on Siemens-API-[101.8] extends: - '@siemens/api-linter/rulesets/siemens-api.yml' From 71f16991ec380dcf92ae08fe48d7c36a80b95f44 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:33:46 +0200 Subject: [PATCH 16/33] chore(api-linter): fix html error in template.html --- api-linter/src/templates/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index 43b022d..8de2873 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -97,11 +97,11 @@

Detailed report

{{#each details}} - {{inc @index}} + {{inc @index}} {{line}} {{severity}} {{path}} - {{message}} + {{message}} {{/each}} From 6535090e8770a7896763e99c4226204b3f85e396 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Fri, 14 Aug 2026 15:45:29 +0200 Subject: [PATCH 17/33] chore(api-linter): fix prettier issues --- api-linter/src/templates/template.html | 297 ++++++++++--------- api-linter/test/api-sparse-fieldsets.test.js | 6 +- 2 files changed, 158 insertions(+), 145 deletions(-) diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index 8de2873..6e13f89 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -1,161 +1,178 @@ - + - - + Siemens Xcelerator-API Linter Report - - + + - - + +
-
-

Siemens API Linter Report

-
-
-
-
+
+

Siemens API Linter Report

+
+
+
+
-
-
Total Rules Count: {{this.enabledCount}}
-
+
+
Total Rules Count: {{ this.enabledCount }}
+
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SeverityProblems
Errors{{this.errorCount}}
Warnings{{this.warnCount}}
Info{{this.infoCount}}
Hints{{this.hintCount}}
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SeverityProblems
Errors{{ this.errorCount }}
Warnings{{ this.warnCount }}
Info{{ this.infoCount }}
Hints{{ this.hintCount }}
+
-
-

Detailed report

-
+
+

Detailed report

+
-
- - - - {{#each this.data}} - - - - - {{#if hasDetails}} - - {{else}} - - {{/if}} +
+
+ + + {{#each this.data}} + + + + + {{#if hasDetails}} + + {{else}} + + {{/if}} + + + +
+ {{#if hasDetails}} + + + + + + + + - - + + + {{#each details}} + + + + + + - {{/each}} - -
#LineSeverityPathmessage
- {{#if hasDetails}} - - - - - - - - - - - - {{#each details}} - - - - - - - - {{/each}} - -
#LineSeverityPathmessage
{{inc @index}}{{line}}{{severity}}{{path}}{{message}}
- {{/if}} -
{{inc @index}}{{ line }}{{ severity }}{{ path }}{{ message }}
- +
+ {{/if}} + + + + {{/each}} + + +
- - + }); + + + diff --git a/api-linter/test/api-sparse-fieldsets.test.js b/api-linter/test/api-sparse-fieldsets.test.js index 1a8a0d7..889dac4 100644 --- a/api-linter/test/api-sparse-fieldsets.test.js +++ b/api-linter/test/api-sparse-fieldsets.test.js @@ -3,11 +3,7 @@ * SPDX-License-Identifier: MIT */ const { retrieveDocument, setupSpectral } = require('@jamietanna/spectral-test-harness'); -const { - resultsForSeverity, - getSpecFilePath, - assertOnlyInfos -} = require('./base.js'); +const { resultsForSeverity, getSpecFilePath, assertOnlyInfos } = require('./base.js'); const path = 'fields/'; const rulesetPath = 'test/testdata/fields/.spectral.yml'; From c98f21403e48e3e3d474ff21a3376030281f4697 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:13:34 +0200 Subject: [PATCH 18/33] docs: add api-linter to README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 4c12b8e..b7eb7a8 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,11 @@ this repo for various other programming languages and frameworks. for [typescript-eslint](https://typescript-eslint.io/) to automatically annotate the `@defaultValue` TSDoc tag +**Tools** + +- [api-linter](api-linter/README.md) for OpenAPI specifications to check for Siemens API + guidelines and best practices. + ## Installation Install `@siemens/*-config*` and their peer dependencies in your project (whichever you need): From bc146826f309aa720abad9f524878d942282d9f5 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:18:01 +0200 Subject: [PATCH 19/33] chore(api-linter): set api linter version to 0.0.0-development --- api-linter/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-linter/package.json b/api-linter/package.json index 456442a..51e7610 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -1,6 +1,6 @@ { "name": "@siemens/api-linter", - "version": "0.8.6", + "version": "0.0.0-development", "description": "A linter tool with Rulesets follow Siemens REST API Guidelines", "homepage": "https://github.com/siemens/lint", "author": { From 508d4dfbc197c1528afc123cde3891aaf66c54dd Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:29:47 +0200 Subject: [PATCH 20/33] fix(api-linter): fix title and repo ref in api-linter template.html --- api-linter/src/templates/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index 6e13f89..5280881 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -1,7 +1,7 @@ - Siemens Xcelerator-API Linter Report + Siemens API Linter Report Detailed report Generated using siemens-api-linter From 0ddac4df4d951f99944ba6e2fcbafd2f2498ee68 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:34:28 +0200 Subject: [PATCH 21/33] chore(api-linter): remove jsonpath from dev dependencies --- api-linter/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/api-linter/package.json b/api-linter/package.json index 51e7610..9b5d7df 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -42,6 +42,5 @@ "devDependencies": { "jest": "^29.0.0", "jest-junit": "^16.0.0", - "jsonpath": "^1.1.1" } } From 68e327254c441cbcdd349cfa4c4648dfc6cc4570 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:34:47 +0200 Subject: [PATCH 22/33] chore(api-linter): remove jsonpath from dev dependencies --- api-linter/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-linter/package.json b/api-linter/package.json index 9b5d7df..bd2b893 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -41,6 +41,6 @@ }, "devDependencies": { "jest": "^29.0.0", - "jest-junit": "^16.0.0", + "jest-junit": "^16.0.0" } } From 15310de2def92459a820ed17621f12fb47d87695 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 08:56:36 +0200 Subject: [PATCH 23/33] chore(api-linter): add example report generation to package.json --- .gitignore | 1 + api-linter/package.json | 2 +- package-lock.json | 12 ++---------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index bb5e324..7c22d29 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ Thumbs.db # api linter spectral_result.json +linter-result.html diff --git a/api-linter/package.json b/api-linter/package.json index bd2b893..78f198a 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -25,7 +25,7 @@ }, "scripts": { "test": "jest", - "dev": "node src/index.js" + "dev": "node src/index.js -s example/openapi.yml -r rulesets/siemens-api.yml" }, "dependencies": { "@stoplight/spectral-core": "^1.15.1", diff --git a/package-lock.json b/package-lock.json index 4f668d7..dd42725 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "api-linter": { "name": "@siemens/api-linter", - "version": "0.8.6", + "version": "0.0.0-development", "license": "MIT", "dependencies": { "@jamietanna/spectral-test-harness": "^0.3.0", @@ -66,8 +66,7 @@ }, "devDependencies": { "jest": "^29.0.0", - "jest-junit": "^16.0.0", - "jsonpath": "^1.1.1" + "jest-junit": "^16.0.0" } }, "commitlint-config": { @@ -8032,7 +8031,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -8054,7 +8052,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -8068,7 +8065,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { @@ -8659,7 +8655,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", "integrity": "sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==", - "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -12388,7 +12383,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.3.0.tgz", "integrity": "sha512-0kjkYHJBkAy50Z5QzArZ7udmvxrJzkpKYW27fiF//BrMY7TQibYLl+FYIXN2BiYmwMIVzSfD8aDRj6IzgBX2/w==", - "dev": true, "license": "MIT", "dependencies": { "esprima": "1.2.5", @@ -12418,7 +12412,6 @@ "version": "1.13.6", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true, "license": "MIT" }, "node_modules/jsonpointer": { @@ -18156,7 +18149,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "dev": true, "license": "MIT", "dependencies": { "escodegen": "^2.1.0" From 7cc03a408f400d16b7766a6e4f0b50ca1a9ffd55 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 12:13:17 +0200 Subject: [PATCH 24/33] chore(api-linter): optimize package.json --- api-linter/package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/api-linter/package.json b/api-linter/package.json index 78f198a..712a6db 100644 --- a/api-linter/package.json +++ b/api-linter/package.json @@ -35,12 +35,10 @@ "handlebars": "^4.7.7", "commander": "^12.0.0", "underscore": "^1.13.1", - "standard": "^17.0.0", "js-yaml": "^4.1.0", "jsonpath": "^1.1.1" }, "devDependencies": { - "jest": "^29.0.0", - "jest-junit": "^16.0.0" + "jest": "^29.0.0" } } From 9094d2378c90acd6382fbf8f0cf3d4e89c4d3cb7 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 12:19:08 +0200 Subject: [PATCH 25/33] chore(api-linter): improve example openapi.yml --- api-linter/example/openapi.yml | 101 ++++++++++++++++----------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/api-linter/example/openapi.yml b/api-linter/example/openapi.yml index 698a07d..c0f1ccd 100644 --- a/api-linter/example/openapi.yml +++ b/api-linter/example/openapi.yml @@ -1,18 +1,17 @@ openapi: 3.0.1 info: - title: Reference OpenAPI Specification - version: 2.0.0 + title: API Linter OpenAPI Specification + version: 1.0.0 contact: - name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + name: Siemens API Guidance Team + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. The API models an educational system. It allows to manage courses, their individual lessons, the rooms where lessons take place as well as people - acting as teachers and/or participants of courses. + acting as teachers and/or participants of courses. **Feature Guide** @@ -26,7 +25,7 @@ info: * Added self links example for hypermedia controls following Maturity Model. * Removed all REST-specific rules which were based on the JSON:API guidelines from this version. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -775,7 +774,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' CourseCreationRequest: type: object required: @@ -805,14 +804,14 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' participants: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' description: '#servers/url' teacher: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' description: '#servers/url' CourseRelatedLessonsResponse: type: object @@ -858,16 +857,16 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1' + example: 'https://example.com/reference/api/courses/1/participants?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses/1/participants?number=1&size=1' + example: 'https://example.com/reference/api/courses/1/participants?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses/1/participants?number=2&size=1' + example: 'https://example.com/reference/api/courses/1/participants?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses/1/participants?page=2&size=1' + example: 'https://example.com/reference/api/courses/1/participants?page=2&size=1' meta: type: object required: @@ -907,31 +906,31 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' participants: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' description: '#servers/url' teacher: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' meta: type: object required: @@ -987,7 +986,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' LessonCreationRequest: type: object @@ -1001,11 +1000,11 @@ components: properties: course: type: string - example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' room: type: string - example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' LessonCreationResponse: type: object @@ -1022,11 +1021,11 @@ components: properties: course: type: string - example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' room: type: string - example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' LessonUpdateRequest: type: object @@ -1050,11 +1049,11 @@ components: properties: course: type: string - example: 'https://api.siemens.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/class/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' room: type: string - example: 'https://api.siemens.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/room/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' RoomPageCursor: type: object @@ -1062,29 +1061,29 @@ components: properties: self: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 first: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 last: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 next: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 LessonPageCursor: type: object description: Pagination links for cursor-based pagination. properties: self: type: string - example: https://api.siemens.com/reference/api/lessons?limit=1 + example: https://example.com/reference/api/lessons?limit=1 description: | Opaque cursor to fetch next elements. To be used as value of query parameter cursor. Is only added if more elements are present. next: type: string - example: https://api.siemens.com/reference/api/lessons?cursor=cXdlcnR5&limit=1 + example: https://example.com/reference/api/lessons?cursor=cXdlcnR5&limit=1 description: Returned the next elements after the cursor. PageIndex: type: object @@ -1132,30 +1131,30 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' description: '#servers/url' participantdCourses: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' taughtCourses: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/people?number=1&size=1' + example: 'https://example.com/reference/api/people?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/people?number=1&size=1' + example: 'https://example.com/reference/api/people?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/people?number=2&size=1' + example: 'https://example.com/reference/api/people?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/people?number=2&size=1' + example: 'https://example.com/reference/api/people?number=2&size=1' meta: type: object required: @@ -1195,7 +1194,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' PersonCreationRequest: type: object required: @@ -1225,14 +1224,14 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' + example: 'https://example.com/reference/api/people/54293c17-a305-4349-81d5-83001e9e4032' participantdCourses: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' taughtCourses: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' description: '#servers/url' PersonRelatedParticipatedCoursesResponse: type: object @@ -1303,7 +1302,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomCreationRequest: type: object required: @@ -1333,10 +1332,10 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomRelatedLessonsResponse: type: object @@ -1380,11 +1379,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: $ref: '#/components/schemas/RoomPageCursor' From b5e6e69684c6e06c8a634f76c6af24a99eb3a335 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 13:06:23 +0200 Subject: [PATCH 26/33] chore(api-linter): add api-linter:test and api-linter:report to ci --- .github/workflows/build.yml | 2 ++ package.json | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7a26826..d57e389 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,3 +20,5 @@ jobs: - run: npm run lint:commit - run: npm run lint - run: npm run plugin:test + - run: npm run api-linter:test + - run: npm run api-linter:report diff --git a/package.json b/package.json index 53838a7..930d6f6 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,8 @@ "lint:fix": "eslint --fix", "lint:commit": "commitlint --from=origin/main", "plugin:test": "tsx --import ./eslint-plugin-defaultvalue/tests/setup-node.js --test ./eslint-plugin-defaultvalue/tests/*.test.ts", + "api-linter:test": "npm run test --prefix api-linter", + "api-linter:report": "npm run dev --prefix api-linter", "release": "semantic-release", "prepare": "husky; exit 0" }, From 89fa3dcfac0a8ffcda556cfad4b22962ba12c9eb Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 13:43:50 +0200 Subject: [PATCH 27/33] chore(api-linter): add api-linter to .releaserc.json --- .releaserc.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.releaserc.json b/.releaserc.json index bb20091..67fc9c5 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -50,6 +50,12 @@ "pkgRoot": "dist/stylelint-config-scss" } ], + [ + "@semantic-release/npm", + { + "pkgRoot": "dist/api-linter" + } + ], [ "@semantic-release/github", { From 095d6def5d3dc3e1c3707680deb3b4cfd050c36b Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 13:50:49 +0200 Subject: [PATCH 28/33] chore(api-linter): add integrity to all downloaded external resources in template.html --- api-linter/src/templates/template.html | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/api-linter/src/templates/template.html b/api-linter/src/templates/template.html index 5280881..d829651 100644 --- a/api-linter/src/templates/template.html +++ b/api-linter/src/templates/template.html @@ -5,14 +5,30 @@ - - - + + +
From e2923b92b9a5248833085204cc5a59fe7ec3dbea Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 13:58:53 +0200 Subject: [PATCH 29/33] fix(api-linter): changed hardcoded 'openapi.yml' to the actual specFilePath input --- api-linter/src/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-linter/src/extension.js b/api-linter/src/extension.js index 8977819..629f611 100644 --- a/api-linter/src/extension.js +++ b/api-linter/src/extension.js @@ -16,7 +16,7 @@ const linter = async (specFilePath, rulesetFilepath) => { const myDocument = new Document( fs.readFileSync(specFilePath, 'utf-8').trim(), Parsers.Yaml, - 'openapi.yml' + specFilePath ); const spectral = new Spectral(); var rules = await bundleAndLoadRuleset(rulesetFilepath, { fs, fetch }); From bba1028bcbbe32e9c7aa22a8a7adbef1827bfbe5 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Mon, 17 Aug 2026 14:04:04 +0200 Subject: [PATCH 30/33] fix(api-linter): fix regex for versioning in siemens-api-versioning.js --- api-linter/rulesets/siemens-api-versioning.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-linter/rulesets/siemens-api-versioning.js b/api-linter/rulesets/siemens-api-versioning.js index b95e30b..ad034a4 100644 --- a/api-linter/rulesets/siemens-api-versioning.js +++ b/api-linter/rulesets/siemens-api-versioning.js @@ -52,8 +52,8 @@ switch (apiVersioning) { then: { function: pattern, functionOptions: { - match: '/[\\.|\\/|](v)?[0-9]+/i', - notMatch: '/[\\.|\\/|](v)?[0-9]+\\.[0-9]+/i' + match: /\/(v)?\d+(\/|$)/i, + notMatch: /\/(v)?\d+\.\d+(\/|$)/i } } } From d254de6e15bfa85ba1b06e250261426ba7014826 Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Tue, 18 Aug 2026 09:10:41 +0200 Subject: [PATCH 31/33] fix(api-linter): fix individual vs collection response handling in get-status-code.js --- .../rulesets/functions/get-status-code.js | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/api-linter/rulesets/functions/get-status-code.js b/api-linter/rulesets/functions/get-status-code.js index 1556841..0cb7d2d 100644 --- a/api-linter/rulesets/functions/get-status-code.js +++ b/api-linter/rulesets/functions/get-status-code.js @@ -7,26 +7,22 @@ const jp = require('jsonpath'); const checkIsTypeOfOption = (schema, options) => { - var props = jp.query(schema, '$..*..data'); - if (Array.isArray(props) && props.length > 0) { - if ( - options == 'individual' && - ((props[0] != null && props[0].type == 'object') || - (props[0].allOf != null && props[0].allOf[0].type == 'object')) - ) { - return true; - } else if (options == 'collection' && props[0].type == 'array') { - return true; - } - return false; - } else { - if ((options == 'individual') & (props.type == 'object')) { - return true; - } else if (options == 'collection' && props.type == 'array') { - return true; - } + const props = jp.query(schema, '$..*..data'); + if (!Array.isArray(props) || props.length === 0) { return false; } + + if ( + options === 'individual' && + ((props[0] != null && props[0].type === 'object') || + (props[0].allOf != null && props[0].allOf[0].type === 'object')) + ) { + return true; + } + if (options === 'collection' && props[0].type === 'array') { + return true; + } + return false; }; const checkOption = (object, options) => { From aeaba674c4430d1958b48499dea370704ecffaed Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Tue, 18 Aug 2026 09:39:56 +0200 Subject: [PATCH 32/33] fix(api-linter): check all required headers in has-header-parameter-with-property-value.js --- ...has-header-parameter-with-property-value.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js index 0b872af..9dbd350 100644 --- a/api-linter/rulesets/functions/has-header-parameter-with-property-value.js +++ b/api-linter/rulesets/functions/has-header-parameter-with-property-value.js @@ -10,17 +10,23 @@ export default (targetVal, options) => { results.push({ message: 'No parameters provided.' }); return results; } - var params = targetVal.parameters; - var exist = false; + + const params = targetVal.parameters; + const required = new Set(options.map(o => o.value)); + for (const param of params) { + if (param.in !== 'header') continue; for (const ops of options) { - if (param[ops['property']] === ops['value'] && param['in'] === 'header') { - exist = true; + if (param[ops.property] === ops.value) { + required.delete(ops.value); } } } - if (!exist) { - results.push({ message: 'No header parameter provided in the options' }); + + if (required.size > 0) { + results.push({ + message: `Missing required header parameter(s): ${Array.from(required).join(', ')}` + }); } return results; }; From fe0f608584ce5497cd5400e1ef29ec75621ece7f Mon Sep 17 00:00:00 2001 From: Kai Toedter Date: Tue, 18 Aug 2026 09:46:06 +0200 Subject: [PATCH 33/33] chore(api-linter): change contact in all test openAPI yml files --- api-linter/test/testdata/commonops/800-1.yml | 10 +++++----- api-linter/test/testdata/commonops/800-2.yml | 10 +++++----- api-linter/test/testdata/commonops/800-4.yml | 10 +++++----- api-linter/test/testdata/commonops/801-4.yml | 8 ++++---- api-linter/test/testdata/commonops/801.yml | 8 ++++---- api-linter/test/testdata/commonops/802-6.yml | 8 ++++---- api-linter/test/testdata/commonops/803-2.yml | 8 ++++---- api-linter/test/testdata/commonops/803-6.yml | 8 ++++---- api-linter/test/testdata/commonops/804-1.yml | 6 +++--- api-linter/test/testdata/error/300.yml | 10 +++++----- api-linter/test/testdata/error/301.yml | 10 +++++----- api-linter/test/testdata/error/302.yml | 10 +++++----- api-linter/test/testdata/error/305.1.yml | 10 +++++----- api-linter/test/testdata/error/305.2.yml | 12 ++++++------ api-linter/test/testdata/error/305.3.yml | 12 ++++++------ api-linter/test/testdata/fields/500.yml | 10 +++++----- api-linter/test/testdata/filtering/400.yml | 10 +++++----- api-linter/test/testdata/filtering/401.yml | 10 +++++----- api-linter/test/testdata/mediatype/100.yml | 10 +++++----- api-linter/test/testdata/mediatype/101-1.yml | 10 +++++----- api-linter/test/testdata/mediatype/101-2.1.yml | 10 +++++----- api-linter/test/testdata/mediatype/101-2.2.yml | 8 ++++---- api-linter/test/testdata/mediatype/101-4-1.yml | 8 ++++---- api-linter/test/testdata/mediatype/101-7-2.yml | 16 ++++++++-------- api-linter/test/testdata/mediatype/101-8.yml | 10 +++++----- api-linter/test/testdata/mediatype/101-9.yml | 10 +++++----- api-linter/test/testdata/pagination/600.1.yml | 18 +++++++++--------- api-linter/test/testdata/pagination/600.2.yml | 18 +++++++++--------- api-linter/test/testdata/pagination/600.3.yml | 18 +++++++++--------- .../test/testdata/pagination/601-1-1.yml | 18 +++++++++--------- .../test/testdata/pagination/601-2-1.yml | 18 +++++++++--------- .../test/testdata/pagination/601-3-1.1.yml | 18 +++++++++--------- .../test/testdata/pagination/601-3-1.2.yml | 18 +++++++++--------- api-linter/test/testdata/pagination/601.yml | 18 +++++++++--------- api-linter/test/testdata/refs/300.yml | 10 +++++----- .../test/testdata/refs/common_errors.yml | 6 +++--- api-linter/test/testdata/security/invalid.yml | 10 +++++----- api-linter/test/testdata/security/valid.yml | 10 +++++----- api-linter/test/testdata/versioning/200-1.yml | 6 +++--- api-linter/test/testdata/versioning/200-2.yml | 10 +++++----- api-linter/test/testdata/versioning/201.yml | 10 +++++----- .../versioning/semantic-versioning.yml | 6 +++--- 42 files changed, 232 insertions(+), 232 deletions(-) diff --git a/api-linter/test/testdata/commonops/800-1.yml b/api-linter/test/testdata/commonops/800-1.yml index 11fd3a5..04f9207 100644 --- a/api-linter/test/testdata/commonops/800-1.yml +++ b/api-linter/test/testdata/commonops/800-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -49,10 +49,10 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/commonops/800-2.yml b/api-linter/test/testdata/commonops/800-2.yml index 6a2ef71..6ba8007 100644 --- a/api-linter/test/testdata/commonops/800-2.yml +++ b/api-linter/test/testdata/commonops/800-2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -65,11 +65,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/commonops/800-4.yml b/api-linter/test/testdata/commonops/800-4.yml index 3907346..dab1a37 100644 --- a/api-linter/test/testdata/commonops/800-4.yml +++ b/api-linter/test/testdata/commonops/800-4.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -49,10 +49,10 @@ components: properties: href: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/commonops/801-4.yml b/api-linter/test/testdata/commonops/801-4.yml index 2c42ee0..f6f6818 100644 --- a/api-linter/test/testdata/commonops/801-4.yml +++ b/api-linter/test/testdata/commonops/801-4.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -84,4 +84,4 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/801.yml b/api-linter/test/testdata/commonops/801.yml index 524e4a2..b0324bf 100644 --- a/api-linter/test/testdata/commonops/801.yml +++ b/api-linter/test/testdata/commonops/801.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -84,4 +84,4 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/802-6.yml b/api-linter/test/testdata/commonops/802-6.yml index d5dd540..990dc4b 100644 --- a/api-linter/test/testdata/commonops/802-6.yml +++ b/api-linter/test/testdata/commonops/802-6.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -102,4 +102,4 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/803-2.yml b/api-linter/test/testdata/commonops/803-2.yml index 947945f..4aed48b 100644 --- a/api-linter/test/testdata/commonops/803-2.yml +++ b/api-linter/test/testdata/commonops/803-2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -107,4 +107,4 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/803-6.yml b/api-linter/test/testdata/commonops/803-6.yml index 6b6cdca..26658d1 100644 --- a/api-linter/test/testdata/commonops/803-6.yml +++ b/api-linter/test/testdata/commonops/803-6.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -107,4 +107,4 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' diff --git a/api-linter/test/testdata/commonops/804-1.yml b/api-linter/test/testdata/commonops/804-1.yml index 68c45cd..da2337a 100644 --- a/api-linter/test/testdata/commonops/804-1.yml +++ b/api-linter/test/testdata/commonops/804-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | diff --git a/api-linter/test/testdata/error/300.yml b/api-linter/test/testdata/error/300.yml index 2e98e5c..e60ed46 100644 --- a/api-linter/test/testdata/error/300.yml +++ b/api-linter/test/testdata/error/300.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -57,11 +57,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/error/301.yml b/api-linter/test/testdata/error/301.yml index ad838a4..6ba3106 100644 --- a/api-linter/test/testdata/error/301.yml +++ b/api-linter/test/testdata/error/301.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -57,11 +57,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/error/302.yml b/api-linter/test/testdata/error/302.yml index 21f8468..075ebf3 100644 --- a/api-linter/test/testdata/error/302.yml +++ b/api-linter/test/testdata/error/302.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -53,11 +53,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/error/305.1.yml b/api-linter/test/testdata/error/305.1.yml index 566a1f2..5607414 100644 --- a/api-linter/test/testdata/error/305.1.yml +++ b/api-linter/test/testdata/error/305.1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -53,11 +53,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/error/305.2.yml b/api-linter/test/testdata/error/305.2.yml index 215257a..69488b3 100644 --- a/api-linter/test/testdata/error/305.2.yml +++ b/api-linter/test/testdata/error/305.2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -53,11 +53,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object @@ -116,7 +116,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' responses: DefaultErrors: description: Standard errors diff --git a/api-linter/test/testdata/error/305.3.yml b/api-linter/test/testdata/error/305.3.yml index e26a12c..475309a 100644 --- a/api-linter/test/testdata/error/305.3.yml +++ b/api-linter/test/testdata/error/305.3.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -53,11 +53,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object @@ -116,7 +116,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' + example: 'https://example.com/reference/api/courses/822a6549-4fd8-478a-b5ed-73bef7a066f4' responses: DefaultErrors: description: Standard errors diff --git a/api-linter/test/testdata/fields/500.yml b/api-linter/test/testdata/fields/500.yml index b147888..388c61a 100644 --- a/api-linter/test/testdata/fields/500.yml +++ b/api-linter/test/testdata/fields/500.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -79,11 +79,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/filtering/400.yml b/api-linter/test/testdata/filtering/400.yml index f57794b..a07823d 100644 --- a/api-linter/test/testdata/filtering/400.yml +++ b/api-linter/test/testdata/filtering/400.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -92,11 +92,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/filtering/401.yml b/api-linter/test/testdata/filtering/401.yml index e11f65a..a17d6d2 100644 --- a/api-linter/test/testdata/filtering/401.yml +++ b/api-linter/test/testdata/filtering/401.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -92,11 +92,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/mediatype/100.yml b/api-linter/test/testdata/mediatype/100.yml index cb64601..eaf5ae5 100644 --- a/api-linter/test/testdata/mediatype/100.yml +++ b/api-linter/test/testdata/mediatype/100.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -51,11 +51,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/mediatype/101-1.yml b/api-linter/test/testdata/mediatype/101-1.yml index 2fc2a5f..bdbbad9 100644 --- a/api-linter/test/testdata/mediatype/101-1.yml +++ b/api-linter/test/testdata/mediatype/101-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -51,11 +51,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/mediatype/101-2.1.yml b/api-linter/test/testdata/mediatype/101-2.1.yml index 2843e2d..4ae46e5 100644 --- a/api-linter/test/testdata/mediatype/101-2.1.yml +++ b/api-linter/test/testdata/mediatype/101-2.1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -51,11 +51,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/mediatype/101-2.2.yml b/api-linter/test/testdata/mediatype/101-2.2.yml index a74438b..f9f656a 100644 --- a/api-linter/test/testdata/mediatype/101-2.2.yml +++ b/api-linter/test/testdata/mediatype/101-2.2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -63,7 +63,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. diff --git a/api-linter/test/testdata/mediatype/101-4-1.yml b/api-linter/test/testdata/mediatype/101-4-1.yml index 2b2ec61..65db7c2 100644 --- a/api-linter/test/testdata/mediatype/101-4-1.yml +++ b/api-linter/test/testdata/mediatype/101-4-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -63,7 +63,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. diff --git a/api-linter/test/testdata/mediatype/101-7-2.yml b/api-linter/test/testdata/mediatype/101-7-2.yml index 00d10ab..e8c1577 100644 --- a/api-linter/test/testdata/mediatype/101-7-2.yml +++ b/api-linter/test/testdata/mediatype/101-7-2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -65,11 +65,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: $ref: '#/components/schemas/RoomPageCursor' @@ -104,7 +104,7 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' RoomBase: type: object description: Place where course lessons take place. @@ -132,13 +132,13 @@ components: properties: self: type: string - example: https://api.siemens.com/reference/api/rooms?limit=1 + example: https://example.com/reference/api/rooms?limit=1 description: | Opaque cursor to fetch next elements. To be used as value of query parameter cursor. Is only added if more elements are present. next: type: string - example: https://api.siemens.com/reference/api/rooms?cursor=cXdlcnR5&limit=1 + example: https://example.com/reference/api/rooms?cursor=cXdlcnR5&limit=1 description: Returned the next elements after the cursor. PageIndex: type: object diff --git a/api-linter/test/testdata/mediatype/101-8.yml b/api-linter/test/testdata/mediatype/101-8.yml index 24847ce..c17c8f1 100644 --- a/api-linter/test/testdata/mediatype/101-8.yml +++ b/api-linter/test/testdata/mediatype/101-8.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -51,11 +51,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/mediatype/101-9.yml b/api-linter/test/testdata/mediatype/101-9.yml index 616ff5b..35da2b6 100644 --- a/api-linter/test/testdata/mediatype/101-9.yml +++ b/api-linter/test/testdata/mediatype/101-9.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -51,11 +51,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/pagination/600.1.yml b/api-linter/test/testdata/pagination/600.1.yml index 748a28a..eb1021b 100644 --- a/api-linter/test/testdata/pagination/600.1.yml +++ b/api-linter/test/testdata/pagination/600.1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -79,11 +79,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: $ref: '#/components/schemas/RoomPageCursor' @@ -121,16 +121,16 @@ components: properties: notself: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 notfirst: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 notlast: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 notnext: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 PageIndex: type: object description: Pagination metadata for index-based pagination. diff --git a/api-linter/test/testdata/pagination/600.2.yml b/api-linter/test/testdata/pagination/600.2.yml index d44f99b..d62833e 100644 --- a/api-linter/test/testdata/pagination/600.2.yml +++ b/api-linter/test/testdata/pagination/600.2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -79,11 +79,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: $ref: '#/components/schemas/RoomPageCursor' @@ -127,16 +127,16 @@ components: properties: self: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 first: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 last: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 next: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 PageIndex: type: object description: Pagination metadata for index-based pagination. diff --git a/api-linter/test/testdata/pagination/600.3.yml b/api-linter/test/testdata/pagination/600.3.yml index 1e7569e..9dadb91 100644 --- a/api-linter/test/testdata/pagination/600.3.yml +++ b/api-linter/test/testdata/pagination/600.3.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -79,11 +79,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: $ref: '#/components/schemas/RoomPageCursor' @@ -121,16 +121,16 @@ components: properties: self: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 first: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 notlast: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 next: type: string - example: https://api.siemens.com/reference/api/rooms?number=1&size=1 + example: https://example.com/reference/api/rooms?number=1&size=1 PageIndex: type: object description: Pagination metadata for index-based pagination. diff --git a/api-linter/test/testdata/pagination/601-1-1.yml b/api-linter/test/testdata/pagination/601-1-1.yml index 23b6bea..8d7c2c5 100644 --- a/api-linter/test/testdata/pagination/601-1-1.yml +++ b/api-linter/test/testdata/pagination/601-1-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -77,27 +77,27 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' meta: type: object required: diff --git a/api-linter/test/testdata/pagination/601-2-1.yml b/api-linter/test/testdata/pagination/601-2-1.yml index c93e5df..17a751e 100644 --- a/api-linter/test/testdata/pagination/601-2-1.yml +++ b/api-linter/test/testdata/pagination/601-2-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -77,27 +77,27 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' meta: type: object required: diff --git a/api-linter/test/testdata/pagination/601-3-1.1.yml b/api-linter/test/testdata/pagination/601-3-1.1.yml index f22373c..6183be6 100644 --- a/api-linter/test/testdata/pagination/601-3-1.1.yml +++ b/api-linter/test/testdata/pagination/601-3-1.1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -77,27 +77,27 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' meta: type: object required: diff --git a/api-linter/test/testdata/pagination/601-3-1.2.yml b/api-linter/test/testdata/pagination/601-3-1.2.yml index c84de87..769733a 100644 --- a/api-linter/test/testdata/pagination/601-3-1.2.yml +++ b/api-linter/test/testdata/pagination/601-3-1.2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -77,27 +77,27 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' meta: type: object required: diff --git a/api-linter/test/testdata/pagination/601.yml b/api-linter/test/testdata/pagination/601.yml index e2c787f..31cd678 100644 --- a/api-linter/test/testdata/pagination/601.yml +++ b/api-linter/test/testdata/pagination/601.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -65,27 +65,27 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' links: type: object properties: self: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' first: type: string - example: 'https://api.siemens.com/reference/api/courses?number=1&size=1' + example: 'https://example.com/reference/api/courses?number=1&size=1' last: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' next: type: string - example: 'https://api.siemens.com/reference/api/courses?number=2&size=1' + example: 'https://example.com/reference/api/courses?number=2&size=1' RoomBase: type: object description: Place where course lessons take place. diff --git a/api-linter/test/testdata/refs/300.yml b/api-linter/test/testdata/refs/300.yml index 519df98..f71effc 100644 --- a/api-linter/test/testdata/refs/300.yml +++ b/api-linter/test/testdata/refs/300.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api tags: - name: Rooms description: | @@ -57,11 +57,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/refs/common_errors.yml b/api-linter/test/testdata/refs/common_errors.yml index 33c2121..d2bdfed 100644 --- a/api-linter/test/testdata/refs/common_errors.yml +++ b/api-linter/test/testdata/refs/common_errors.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api + - url: https://example.com/reference/api paths: components: diff --git a/api-linter/test/testdata/security/invalid.yml b/api-linter/test/testdata/security/invalid.yml index 4979bf9..5a32e88 100644 --- a/api-linter/test/testdata/security/invalid.yml +++ b/api-linter/test/testdata/security/invalid.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -93,11 +93,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/security/valid.yml b/api-linter/test/testdata/security/valid.yml index 890cdd1..eaefebf 100644 --- a/api-linter/test/testdata/security/valid.yml +++ b/api-linter/test/testdata/security/valid.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -93,11 +93,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/versioning/200-1.yml b/api-linter/test/testdata/versioning/200-1.yml index 8e00955..cb246f1 100644 --- a/api-linter/test/testdata/versioning/200-1.yml +++ b/api-linter/test/testdata/versioning/200-1.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1.1 + - url: https://example.com/reference/api/v1.1 tags: - name: Rooms description: | diff --git a/api-linter/test/testdata/versioning/200-2.yml b/api-linter/test/testdata/versioning/200-2.yml index 9503c20..c6110ea 100644 --- a/api-linter/test/testdata/versioning/200-2.yml +++ b/api-linter/test/testdata/versioning/200-2.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -65,11 +65,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/versioning/201.yml b/api-linter/test/testdata/versioning/201.yml index 69e804a..ff5c7f2 100644 --- a/api-linter/test/testdata/versioning/201.yml +++ b/api-linter/test/testdata/versioning/201.yml @@ -4,13 +4,13 @@ info: version: 2.0.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: | @@ -65,11 +65,11 @@ components: properties: self: type: string - example: 'https://api.siemens.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' + example: 'https://example.com/reference/api/rooms/846650de-20fd-4197-867b-00ac7606cffd' description: '#servers/url' lessons: type: string - example: 'https://api.siemens.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' + example: 'https://example.com/reference/api/lessons/d8272c80-62b1-43b3-ba84-02cbe0aab5a2' description: '#servers/url' RoomBase: type: object diff --git a/api-linter/test/testdata/versioning/semantic-versioning.yml b/api-linter/test/testdata/versioning/semantic-versioning.yml index e9df7f9..217b004 100644 --- a/api-linter/test/testdata/versioning/semantic-versioning.yml +++ b/api-linter/test/testdata/versioning/semantic-versioning.yml @@ -4,13 +4,13 @@ info: version: 2.0 contact: name: API Guidance Team - url: https://api.siemens.com - email: noreply@siemens.com + url: https://example.com + email: opensource@siemens.com description: | This is an example API specification serving as reference for designing and specifying APIs according to the API guidelines. servers: - - url: https://api.siemens.com/reference/api/v1 + - url: https://example.com/reference/api/v1 tags: - name: Rooms description: |